[postgis-users] list of the closest borders
Doug Fischer
dgf at dfischer.com
Thu Sep 11 14:30:32 PDT 2008
Kevin,
This query works like a champ. Thank you very much for your help!
Doug
On Sep 11, 2008, at 2:49 PM, Kevin Neufeld wrote:
> Ok, yikes. This is suddenly getting much more complicated than I
> originally thought.
>
> Yes, obviously the boundary approach does not take into account if
> the point is inside a country polygon.
>
> Also, the problem with your second attempt was that you were
> grabbing only the first polygon out of a multipolygon and using
> that to test your distances against.
>
> This is a very quick hack that I'm sure you can clean up, but it
> may get you closer to what you're after:
>
>
>
> -- Sort and limit the final result
> SELECT * FROM (
>
> -- Filter out duplicate entries
> SELECT DISTINCT ON (name) *
> FROM (
>
> -- Select the country we are inside
> SELECT name, gmi_cntry, 0::double precision AS distance
> FROM world_countries a
> WHERE ST_Contains(
> a.the_geom,
> ST_GeomFromText('Point(-107.753906 48.400032)', srid(the_geom)))
>
> UNION ALL
>
> -- Select all countries and their respective distances
> SELECT name, gmi_cntry,
> distance_sphere(
> line_interpolate_point( a.geom, line_locate_point( a.geom,
> b.pt) ),
> b.pt
> ) / 1609.344 AS distance
> FROM (
> SELECT name, gmi_cntry, (ST_Dump(ST_Boundary(the_geom))).geom
> FROM world_countries ) AS a,
> (SELECT ST_GeomFromText('Point(-107.753906 48.400032)', 4326) AS
> pt) AS b
>
> ) AS foo
> ORDER BY name, distance) AS foo
>
> ORDER BY distance
> LIMIT 5;
>
>
>
> name | gmi_cntry | distance
> ---------------+-----------+------------------
> United States | USA | 0
> Canada | CAN | 41.4484753115909
> Mexico | MEX | 1148.15027501245
> Bahamas, The | BHS | 2165.10853394356
> Cuba | CUB | 2200.33855861009
> (5 rows)
>
>
> Cheers,
> Kevin
>
> Doug Fischer wrote:
>> Kevin,
>> I have played with these functions and created a query however it
>> does not seem to be producing the correct results.
>> What I have done is the following (just so you understand the data
>> that I am working with).
>> I have downloaded the World shapefile from http://www.cipotato.org/
>> diva/data/MoreData.htm
>> I used shp2pgsql to create the inserts for PostGIS into a table
>> called world_countries with the following definition:
>> gid - integer
>> name - character varying(40)
>> gmi_cntry - character varying(3)
>> region - character varying(25)
>> the_geom - geometry
>> I selected a point close to the canadian border in Montana (lat:
>> 48.400032 long: -107.753906) and ran the following queries
>> 1)
>> select name, gmi_cntry,
>> distance(the_geom,
>> GeomFromText('Point(-107.753906 48.400032)', srid
>> (the_geom))) * 69.046767 as distance
>> from worl_countries order by distance limit 5;
>> 2)
>> select name, gmi_cntry,
>> distance_sphere(
>> line_interpolate_point(
>> ExteriorRing(GeometryN(the_geom, 1)),
>> line_locate_point(
>> ExteriorRing(GeometryN(the_geom, 1)),
>> GeomFromText('Point(-107.753906 48.400032)', srid
>> (the_geom))
>> )
>> ),
>> GeomFromText('Point(-107.753906 48.400032)', srid(the_geom))
>> ) / 1609.344 as distance
>> from world_countries order by distance limit 5;
>> Results of query 1:
>> United States | USA | 0
>> Canada | CAN | 41.42...
>> Mexico | MEX | 1147.37...
>> Guatemala | GTM | 2408.14...
>> Cuba | CUB | 2413.21...
>> Results of query 2:
>> United States | USA | 1277.33...
>> Mexico | MEX | 1336.31...
>> Canada | CAN | 1509.44...
>> Cuba | CUB | 2283.77...
>> Guatemala | GTM | 2313.55...
>> As you can see from the results of the 2 queries, they are not
>> even close. I understand that the first query is not going to be
>> all that accuate, but I tthought that the two would at least be in
>> the same ballpark. The results from query 1 are more like what I
>> need, I was just trying to get a little more accurate. Query 2
>> seems to be better when the Point that I am using in the query is
>> not inside of a country already.
>> Any ideas? suggestions? Anything would be appreciated.
>> thank you very much,
>> Doug
>> On Sep 10, 2008, at 11:34 AM, Kevin Neufeld wrote:
>>> Yes. Experiment with
>>>
>>> - ST_Line_Locate_Point(linestring, Point) - which returns a
>>> percentage along the linestring the point occurs.
>>>
>>> - ST_Line_Interpolate_Point(linestring, location) - which accepts
>>> a "percentage along" and returns the interpolated point along the
>>> linestring.
>>>
>>> Since these functions accept a linestring, you could extract the
>>> exterior ring of your country polygon.
>>>
>>> Something like:
>>> SELECT
>>> ST_Line_Interpolate_Point(
>>> ST_Exterior_Ring(the_geom),
>>> ST_Line_Locate_Point(ST_Exterior_Ring(the_geom), gps_pt)
>>> )
>>> FROM ...
>>>
>>> Cheers,
>>> Kevin
>>>
>>> Doug Fischer wrote:
>>>> ...
>>>> Is there some way to determine the closest point in the border
>>>> of the country to the point collected by the GPS in order to use
>>>> the distance_sphere() or distance_spheroid() functions for a
>>>> more precise measurement?
>>>> Thank you very much for any help.
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
More information about the postgis-users
mailing list