<div dir="ltr">Hey,<div>for the following I make the hypothesis that </div><div> 1. for you trip A->B should be separated from trip B->A.<br> 2. <span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.taz.geom are non overlaping polygon (ie your zone are non overlaping)</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> 3. whatever startloc, endloc, there exist a zone overlapping it.</span></div><div><br></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">Now you querry look like this</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">--compute the origin_destination matrix</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">DROP TABLE IF EXISTS origin_destination_matrix ; </span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">CREATE TABLE </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">origin_destination_matrix</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> AS </span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT t.trip_id,</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">zone1 AS starting_zone, zone2 as ending_zone</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.trip_v1 as t</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> INNER JOIN </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.taz AS zone1 ON ( ST_Intersects(zone1.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">,t.startloc) = TRUE )</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">INNER JOIN </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.taz AS zone2 ON ( ST_Intersects(zone2.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">,t.endloc) = TRUE ) ;</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">--aggregate to get the number of trip from X to Y</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT count() as number_of_trip_going_from, </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">starting_zone, </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">ending_zone</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">origin_destination_matrix</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6666669845581px">GROUP BY </span></font><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">starting_zone, </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">ending_zone ;</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">I would be supprised that you find something faster.</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div>Please note that if some of my hypothesis are false, you can still manage :</div><div> if you drop 1. : the aggregate becomes</div><div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT count() as number_of_trip_going_from, l as starting , g as ending</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">origin_destination_matrix</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> , LEAST(starting_zone,ending_zone) as l, </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">GREATEST(starting_zone,ending_zone) as g</span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6666669845581px">GROUP BY l, g</span></font><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> ;</span></div></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">if you drop 2. : you need a way to choose which zone is the correct one when startloc or endloc is in several zone (example : the smallest area zone)</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">the origin destination matrix computation becomes : </span></div><div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT DISTINCT ON (</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">t.trip_id</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">) t.trip_id,</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">zone1 AS starting_zone, zone2 as ending_zone</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.trip_v1 as t</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> INNER JOIN </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.taz AS zone1 ON ( ST_Intersects(zone1.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">,t.startloc) = TRUE )</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">INNER JOIN </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.taz AS zone2 ON ( ST_Intersects(zone2.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">,t.endloc) = TRUE ) </span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">ORDER BY ST_Area(</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">zone1.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">) ASC, </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">ST_Area(</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">zone2.</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">geom) ASC</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">;</span></div></div><div><br></div><div>If you drop 3. , it is easy to deal with.</div><div>The dirty way is to add a polygon in "taz" that overlap all of you startloc/endloc, you can call it 'UNKNOWN', then use the "drop 2. hypothesis".<br></div><div><br></div><div>The clean way is to look in origin destination matrix, and get missing <span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">trip_id (they are missing because they where no zone for startloc and/or endloc).</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">Then do something for theim (I don"t know what you want to do with it)</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">getting the missing trip_id can be done with an EXCEPT for instance :</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"><br></span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6666669845581px">WITH missing_in_origin_destination AS ( --compute the missing trip, because startloc and/or endloc have no corresponding zone</span></font></div><div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT t.trip_id </span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">od1.trip_v1 as t</span></div></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">EXCEPT ALL </span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">SELECT odm.trip_id</span></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">FROM </span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px">origin_destination_matrix</span><span style="font-family:Calibri,sans-serif;font-size:14.6666669845581px"> AS odm</span></div><div>)</div><div>--your querry to do something with trip that are not in origin_destination matrix</div><div><br></div><div><br></div><div>Cheers,</div><div>Rémi-C</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-02-11 9:37 GMT+01:00 Trang Nguyen <span dir="ltr"><<a href="mailto:Trang.Nguyen@inrix.com" target="_blank">Trang.Nguyen@inrix.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="color:#1f497d">Hi Birgit, <u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Thanks very much.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">I’m not familiar with the “with” clause but will look into that. There are also indices on startts and z.uuid ( time range condition is ok, since these are timestamps and not days).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">I am also finding that a cause of slowness was due to the OR condition:</span><span style="color:#1f497d"> ST_intersects(t.startloc, z.geom)
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">or ST_intersects(t.endloc, z.geom)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Splitting up the query into two unions, one using a where on
</span><span style="color:#1f497d">ST_intersects(t.startloc, z.geom) and the second on ST_intersects(t.endloc, z.geom), but your suggestion would get me closer to what I wanted in the final output.</span><span style="color:#1f497d"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Best,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d">Trang<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p>
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> <a href="mailto:postgis-users-bounces@lists.osgeo.org" target="_blank">postgis-users-bounces@lists.osgeo.org</a> [mailto:<a href="mailto:postgis-users-bounces@lists.osgeo.org" target="_blank">postgis-users-bounces@lists.osgeo.org</a>]
<b>On Behalf Of </b>Birgit Laggner<br>
<b>Sent:</b> Wednesday, February 11, 2015 12:20 AM<br>
<b>To:</b> <a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a><br>
<b>Subject:</b> Re: [postgis-users] Question on optimizing slow geospatial query<u></u><u></u></span></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Hi Trang,<br>
<br>
I think, it could help to create btree indices on "startts" and "uuid", too, since you are using them in your where clause as a filter (a probably unnecessary question regarding your date filter: I would expect the result of "t.startts > '2015-01-16' and t.startts
< '2015-01-17'" to be null because there are no days between the 16th and the 17th of january - but perhaps it was only an example...). And in general, my suggestion would be to reduce the use of st_intersects to the necessary mimimum.<br>
You could use the with clause for the filtration of your input data and afterwards double join the two tables first on the startloc and second on the endloc for the assignment of the origin and the destination zone. Then group by origin and destination zones
while counting your trips and you should have your end result.<br>
<br>
Here is how I would imagine the query:<br>
<br>
with<br>
t as (select trip_id, startloc, endloc from od1.trip_v1 where startts between 'minimum start date' and 'maximum start date'),<br>
z as (select zone from od1.taz where uuid in ('kansas_303', 'kansas_601', 'kansas_603', etc))<u></u><u></u></p>
<p class="MsoNormal">select count(t.trip_id) as number_of_trips, orig.zone as orig_zone, dest.zone as dest_zone from t left join z as orig on st_intersects(t.startloc, z.geom) left join z as dest on
st_intersects(t.endloc, z.geom) group by orig.zone, dest.zone;<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">However, I am not sure about how the gist indices work together with the subselects of the with clause...<br>
<br>
Hope this helps,<br>
<br>
Birgit.<br>
<br>
<br>
<u></u><u></u></p>
<div>
<p class="MsoNormal">Am 11.02.2015 um 08:19 schrieb Trang Nguyen:<u></u><u></u></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hi,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">I am a newbie to Postgres/PostGIS and have a long running query that I would like to optimize.<u></u><u></u></p>
<p class="MsoNormal">There are two tables (trip and zone) that I am joining in the query, one which has “startloc” and “endloc” columns with type Geometry(Point) and other which contains a Geometry(MultiPolygon). There are GIST indexes on all above columns:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">CREATE TABLE od1.trip_v1<u></u><u></u></p>
<p class="MsoNormal">(<u></u><u></u></p>
<p class="MsoNormal"> pkey bigint NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> trip_id character varying,<u></u><u></u></p>
<p class="MsoNormal"> startts timestamp without time zone,<u></u><u></u></p>
<p class="MsoNormal"> endts timestamp without time zone,<u></u><u></u></p>
<p class="MsoNormal"> startloc geometry(Point),<u></u><u></u></p>
<p class="MsoNormal"> endloc geometry(Point),<u></u><u></u></p>
<p class="MsoNormal"> …<u></u><u></u></p>
<p class="MsoNormal">)<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">CREATE TABLE od1.taz<u></u><u></u></p>
<p class="MsoNormal">(<u></u><u></u></p>
<p class="MsoNormal"> uuid character varying NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> zone character varying NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> createdts timestamp without time zone NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> updatedts timestamp without time zone NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> geom geometry(MultiPolygon) NOT NULL,<u></u><u></u></p>
<p class="MsoNormal"> CONSTRAINT taz_pkey PRIMARY KEY (uuid)<u></u><u></u></p>
<p class="MsoNormal">)<u></u><u></u></p>
<p class="MsoNormal"><br>
I’m interested in building a matrix that, for a given set of input zones, returns trips along with their start and end zones. Output looks like:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">10 trips that start at Zone A, ends at Zone B<u></u><u></u></p>
<p class="MsoNormal">2 trips that start at Zone A, ends at Zone C<u></u><u></u></p>
<p class="MsoNormal">9 trips that start at Zone A, ends at other<u></u><u></u></p>
<p class="MsoNormal">13 trips that start at Zone C, ends at Zone D<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Since I am dealing with a large dataset (> 24 million records and growing), I was planning on writing a query that returns the trips grouped by each zone along with match condition (start, end or both) and doing aggregation on the client
layer. I’m not sure whether this is the best approach but I expect that otherwise, I would end up having to write a very complex query to handle that type of aggregation.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Even so, the current query is very slow with very high cost:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">SELECT t.trip_id, <u></u><u></u></p>
<p class="MsoNormal">case <u></u><u></u></p>
<p class="MsoNormal"> when ST_intersects(t.startloc, z.geom) and ST_intersects(t.endloc, z.geom) then 'orig-dest'<u></u><u></u></p>
<p class="MsoNormal"> when ST_intersects(t.startloc, z.geom) then 'orig'<u></u><u></u></p>
<p class="MsoNormal"> when ST_intersects(t.endloc, z.geom) then 'dest'<u></u><u></u></p>
<p class="MsoNormal"> else 'none'<u></u><u></u></p>
<p class="MsoNormal">end as match_cond,<u></u><u></u></p>
<p class="MsoNormal">z.zone from od1.trip_v1 t, od1.taz z <u></u><u></u></p>
<p class="MsoNormal">where t.startts > '2015-01-16' and t.startts < '2015-01-17' <u></u>
<u></u></p>
<p class="MsoNormal">and z.uuid in ('kansas_303', 'kansas_601', 'kansas_603', etc)<u></u><u></u></p>
<p class="MsoNormal">and ST_intersects(t.startloc, z.geom) <u></u><u></u></p>
<p class="MsoNormal">or ST_intersects(t.endloc, z.geom)<u></u><u></u></p>
<p class="MsoNormal">group by z.zone, t.trip_id, match_cond;<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Explain plan:<u></u><u></u></p>
<p class="MsoNormal">"Group (cost=231446695055.73..245971533247.59 rows=14240037443 width=3498)"<u></u><u></u></p>
<p class="MsoNormal">" -> Sort (cost=231446695055.73..231482295149.34 rows=14240037443 width=3498)"<u></u><u></u></p>
<p class="MsoNormal">" Sort Key: z.zone, t.trip_id, (CASE WHEN ((t.startloc && z.geom) AND _st_intersects(t.startloc, z.geom) AND (t.endloc && z.geom) AND _st_intersects(t.endloc, z.geom)) THEN 'orig-dest'::text WHEN ((t.startloc && z.geom) AND _st_intersects(t.startloc,
(...)"<u></u><u></u></p>
<p class="MsoNormal">" -> Nested Loop (cost=91.70..14401634128.24 rows=14240037443 width=3498)"<u></u><u></u></p>
<p class="MsoNormal">" -> Seq Scan on taz z (cost=0.00..739.19 rows=4619 width=3406)"<u></u><u></u></p>
<p class="MsoNormal">" -> Bitmap Heap Scan on trip_v1 t (cost=91.70..4151.26 rows=453 width=107)"<u></u><u></u></p>
<p class="MsoNormal">" Recheck Cond: ((startloc && z.geom) OR (endloc && z.geom))"<u></u><u></u></p>
<p class="MsoNormal">" Filter: (((startts > '2015-01-16 00:00:00'::timestamp without time zone) AND (startts < '2015-01-17 00:00:00'::timestamp without time zone) AND ((z.uuid)::text = ANY ('{kansas_303,kansas_601,kansas_603,kansas_604,kansas_10,kansas_11,kan
(...)"<u></u><u></u></p>
<p class="MsoNormal">" -> BitmapOr (cost=91.70..91.70 rows=2706 width=0)"<u></u><u></u></p>
<p class="MsoNormal">" -> Bitmap Index Scan on idx_trip_v1_startloc (cost=0.00..45.74 rows=1353 width=0)"<u></u><u></u></p>
<p class="MsoNormal">" Index Cond: (startloc && z.geom)"<u></u><u></u></p>
<p class="MsoNormal">" -> Bitmap Index Scan on idx_trip_v1_endloc (cost=0.00..45.74 rows=1353 width=0)"<u></u><u></u></p>
<p class="MsoNormal">" Index Cond: (endloc && z.geom)"<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Some help or suggestions on how to speed up the query would be much appreciated.<u></u><u></u></p>
<p class="MsoNormal">Also, I currently don’t have a specific map projection defined on the geom columns so they are using the default of 0 in postgis. The points in both trip and zone geometries are lon/lat. Is this an issue for the ST_intersect?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Thanks,<br>
Trang<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><br>
<br>
<br>
<u></u><u></u></span></p>
<pre>_______________________________________________<u></u><u></u></pre>
<pre>postgis-users mailing list<u></u><u></u></pre>
<pre><a href="mailto:postgis-users@lists.osgeo.org" target="_blank">postgis-users@lists.osgeo.org</a><u></u><u></u></pre>
<pre><a href="http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users" target="_blank">http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users</a><u></u><u></u></pre>
</blockquote>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><u></u> <u></u></span></p>
</div></div></div>
</div>
<br>_______________________________________________<br>
postgis-users mailing list<br>
<a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users" target="_blank">http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users</a><br></blockquote></div><br></div>