[postgis-users] SRID for analyzing a USA national data set in Meters

Michael Frumin mfrumin at rpa.org
Mon Apr 2 13:50:11 PDT 2007


this actualy returns the SRID, not the UTMZone; even better!

totally awesome, thanks.

-mike

david.bitner at gmail.com wrote:
> This function should work to return the correct UTM zone in WGS84 (unless I
> messed something up quickly pulling this together -- verify before you use
> it).
>
> CREATE OR REPLACE FUNCTION utmzone(geometry)
>   RETURNS integer AS
> $BODY$
> declare
> geomgeog geometry;
> zone int;
> pref int;
> begin
> geomgeog:=transform($1,4326);
> if (y(geomgeog))>0 then
>   pref:=32600;
> else
>   pref:=32700;
> end if;
> zone:=floor((x(geomgeog)+180)/6)+1;
> return zone+pref;
> end;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
>
> On 4/2/07, David William Bitner <bitner at gyttja.org> wrote:
>   
>> If you're only concerned with 25 miles, you could use the method to
>> determine which UTM zone your data is in for your first hospital and then
>> use that for the calculation and buffer creation.  You could convert Pedro's
>> PHP script into PL/PGSQL to make it easy to work with in the db.
>>
>> On 4/2/07, Michael Frumin <mfrumin at rpa.org> wrote:
>>     
>>>  correct.  I wanted to calculate the buffer so that I can render a map
>>> using GeoServer, which sits right on top of PostGIS, which would show the
>>> first set of hospitals, the 25 mile radius, and the second set.
>>>
>>> thanks,
>>> mike
>>>
>>> david.bitner at gmail.com wrote:
>>>
>>> It is a common mis-assumption that you need to do a buffer calculation.  To
>>> do this type of analysis, all you need is the distance_sphere() calculation:
>>> select *,distance_sphere(hospital1geom,hospitals2geom) from hospitals2 where
>>>
>>> distance_sphere(hospital1geom,hospitals2geom)<25*1609 order by
>>> distance_sphere(hospital1geom,hospitals2geom) asc;
>>>
>>> Just add a limit 1 to the end if all you want is the closest.
>>>
>>> No buffer necessary at all.
>>>
>>>
>>>
>>> David
>>>
>>>
>>> On 4/2/07, Michael Frumin <mfrumin at rpa.org> <mfrumin at rpa.org> wrote:
>>>
>>>   Right, I should be more specific from the outset.  I did do some
>>> searching thru the PostGIS archives, and didn't find the answer I was
>>> looking for; is there a PostGIS FAQ somewhere?
>>>
>>> As for my problem, my inputs are two sets of geocoded hospitals, and I
>>>
>>> just want to be able to identify for each hospital in the first set, the
>>> hospitals in the second set within approximately 25 miles.  I will the map
>>> these sets, with a 25 mile buffer around the first set, using Geoserver.
>>>
>>> So, distance and area are both somewhat important, heading not at all.
>>> distance_sphere(oid), sounds good for the calculation, but won't help with
>>> the buffering because it doesn't tell me the 'distance' in lat/lng space
>>>
>>> that would equate to 25 miles (because of course this varies over the
>>> globe).  To achieve this I would need to reproject into something that is in
>>> meters, and buffer around that.
>>>
>>> How egregious would you expect the errors to be if I simply use the
>>>
>>> projection for the UTM zone that represents, say, Central time?
>>>
>>> thanks,
>>> mike
>>>
>>>
>>>      _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>
>>>
>>> ------------------------------
>>>
>>>
>>> It is a common mis-assumption that you need to do a buffer calculation.
>>> To do this type of analysis, all you need is the distance_sphere()
>>> calculation:
>>> select *,distance_sphere(hospital1geom,hospitals2geom) from hospitals2
>>> where distance_sphere(hospital1geom,hospitals2geom)<25*1609 order by
>>> distance_sphere(hospital1geom,hospitals2geom) asc;
>>>
>>> Just add a limit 1 to the end if all you want is the closest.
>>>
>>> No buffer necessary at all.
>>>
>>>
>>> David
>>>
>>>
>>> On 4/2/07, Michael Frumin <mfrumin at rpa.org> wrote:
>>>       
>>>> Right, I should be more specific from the outset.  I did do some
>>>> searching thru the PostGIS archives, and didn't find the answer I was
>>>> looking for; is there a PostGIS FAQ somewhere?
>>>>
>>>> As for my problem, my inputs are two sets of geocoded hospitals, and I
>>>> just want to be able to identify for each hospital in the first set, the
>>>> hospitals in the second set within approximately 25 miles.  I will the map
>>>> these sets, with a 25 mile buffer around the first set, using Geoserver.
>>>> So, distance and area are both somewhat important, heading not at all.
>>>> distance_sphere(oid), sounds good for the calculation, but won't help with
>>>> the buffering because it doesn't tell me the 'distance' in lat/lng space
>>>> that would equate to 25 miles (because of course this varies over the
>>>> globe).  To achieve this I would need to reproject into something that is in
>>>> meters, and buffer around that.
>>>>
>>>> How egregious would you expect the errors to be if I simply use the
>>>> projection for the UTM zone that represents, say, Central time?
>>>>
>>>> thanks,
>>>> mike
>>>>
>>>>
>>>>         
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>
>>>
>>>       
>> --
>> ************************************
>> David William Bitner
>>     
>
>
>
>
> -- ************************************
> David William Bitner
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>   
>
> ------------------------------------------------------------------------
>
> This function should work to return the correct UTM zone in WGS84 
> (unless I messed something up quickly pulling this together -- verify 
> before you use it).
>
> CREATE OR REPLACE FUNCTION utmzone(geometry)
>   RETURNS integer AS
> $BODY$
> declare
> geomgeog geometry;
> zone int;
> pref int;
> begin
> geomgeog:=transform($1,4326);
> if (y(geomgeog))>0 then
>   pref:=32600;
> else
>   pref:=32700;
> end if;
> zone:=floor((x(geomgeog)+180)/6)+1;
> return zone+pref;
> end;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
>
> On 4/2/07, *David William Bitner* < bitner at gyttja.org 
> <mailto:bitner at gyttja.org>> wrote:
>
>     If you're only concerned with 25 miles, you could use the method
>     to determine which UTM zone your data is in for your first
>     hospital and then use that for the calculation and buffer
>     creation.  You could convert Pedro's PHP script into PL/PGSQL to
>     make it easy to work with in the db.
>
>
>     On 4/2/07, *Michael Frumin* < mfrumin at rpa.org
>     <mailto:mfrumin at rpa.org>> wrote:
>
>         correct.  I wanted to calculate the buffer so that I can
>         render a map using GeoServer, which sits right on top of
>         PostGIS, which would show the first set of hospitals, the 25
>         mile radius, and the second set.
>
>         thanks,
>         mike
>
>
>         david.bitner at gmail.com <mailto:david.bitner at gmail.com> wrote:
>>         It is a common mis-assumption that you need to do a buffer calculation.  To
>>         do this type of analysis, all you need is the distance_sphere() calculation:
>>         select *,distance_sphere(hospital1geom,hospitals2geom) from hospitals2 where
>>
>>
>>         distance_sphere(hospital1geom,hospitals2geom)<25*1609 order by
>>         distance_sphere(hospital1geom,hospitals2geom) asc;
>>
>>         Just add a limit 1 to the end if all you want is the closest.
>>
>>         No buffer necessary at all.
>>
>>
>>
>>
>>         David
>>
>>
>>         On 4/2/07, Michael Frumin <mfrumin at rpa.org> <mailto:mfrumin at rpa.org> wrote:
>>           
>>>          Right, I should be more specific from the outset.  I did do some
>>>         searching thru the PostGIS archives, and didn't find the answer I was
>>>         looking for; is there a PostGIS FAQ somewhere?
>>>
>>>         As for my problem, my inputs are two sets of geocoded hospitals, and I
>>>
>>>
>>>         just want to be able to identify for each hospital in the first set, the
>>>         hospitals in the second set within approximately 25 miles.  I will the map
>>>         these sets, with a 25 mile buffer around the first set, using Geoserver.
>>>
>>>
>>>         So, distance and area are both somewhat important, heading not at all.
>>>         distance_sphere(oid), sounds good for the calculation, but won't help with
>>>         the buffering because it doesn't tell me the 'distance' in lat/lng space
>>>
>>>
>>>         that would equate to 25 miles (because of course this varies over the
>>>         globe).  To achieve this I would need to reproject into something that is in
>>>         meters, and buffer around that.
>>>
>>>         How egregious would you expect the errors to be if I simply use the
>>>
>>>
>>>         projection for the UTM zone that represents, say, Central time?
>>>
>>>         thanks,
>>>         mike
>>>
>>>
>>>             
>>         _______________________________________________
>>         postgis-users mailing list
>>         postgis-users at postgis.refractions.net
>>
>>          <mailto:postgis-users at postgis.refractions.net>
>>         http://postgis.refractions.net/mailman/listinfo/postgis-users
>>           
>>
>>         ------------------------------------------------------------------------
>>
>>
>>         It is a common mis-assumption that you need to do a buffer
>>         calculation.  To do this type of analysis, all you need is
>>         the distance_sphere() calculation:
>>         select *,distance_sphere(hospital1geom,hospitals2geom) from
>>         hospitals2 where
>>         distance_sphere(hospital1geom,hospitals2geom)<25*1609 order
>>         by distance_sphere(hospital1geom,hospitals2geom) asc;
>>
>>         Just add a limit 1 to the end if all you want is the closest.
>>
>>         No buffer necessary at all.
>>
>>
>>         David
>>
>>
>>         On 4/2/07, *Michael Frumin* <mfrumin at rpa.org
>>         <mailto:mfrumin at rpa.org>> wrote:
>>
>>             Right, I should be more specific from the outset.  I did
>>             do some searching thru the PostGIS archives, and didn't
>>             find the answer I was looking for; is there a PostGIS FAQ
>>             somewhere?
>>
>>             As for my problem, my inputs are two sets of geocoded
>>             hospitals, and I just want to be able to identify for
>>             each hospital in the first set, the hospitals in the
>>             second set within approximately 25 miles.  I will the map
>>             these sets, with a 25 mile buffer around the first set,
>>             using Geoserver.  So, distance and area are both somewhat
>>             important, heading not at all.  distance_sphere(oid),
>>             sounds good for the calculation, but won't help with the
>>             buffering because it doesn't tell me the 'distance' in
>>             lat/lng space that would equate to 25 miles (because of
>>             course this varies over the globe).  To achieve this I
>>             would need to reproject into something that is in meters,
>>             and buffer around that.
>>
>>             How egregious would you expect the errors to be if I
>>             simply use the projection for the UTM zone that
>>             represents, say, Central time?
>>
>>             thanks,
>>             mike
>>
>
>         _______________________________________________
>         postgis-users mailing list
>         postgis-users at postgis.refractions.net
>         <mailto:postgis-users at postgis.refractions.net>
>         http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
>
>
>     -- 
>     ************************************
>     David William Bitner 
>
>
>
>
> -- 
> ************************************
> David William Bitner 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20070402/db7bbe5b/attachment.html>


More information about the postgis-users mailing list