[postgis-users] Spheroid Question
Stephen Woodbridge
woodbri at swoodbridge.com
Fri Jun 24 17:45:35 PDT 2005
Gerry,
Excellent point. And 6378137 m * 2 * pi = 40075016 and I mis-spoke below
as I meant to say circumference and I mis-typed it as 40075160, but
the 111319 m per degree is still a good number for approximating.
Remember you are setting this for high level rejection and the accurate
math is be done with the *_spheroid() functions.
The key is to not use any of these as magic formula or numbers or you
will wind up using them in a wrong way eventually.
-Steve
Gerry Creager wrote:
> I shouldn't think without checking references....
>
> See http://dgfi2.dgfi.badw-muenchen.de/geodis/REFS/grs80.html for a list
> of GRS80 parameters. Equatorial radius is really, 6378137 m, while the
> polar radius is 6356752.3141 m.
>
> gerry
>
> Stephen Woodbridge wrote:
>
>> Dan,
>>
>> I understood that you probably wanted '2000' to mean meters, but just
>> because that is your intent, does not make the code nessacarily
>> execute that way. If the code interpreted 2000 as decimal degrees
>> instead of 2000 meters your SQL would still work and return the same
>> results. In fact your SQL will work and return the same results if you
>> remove
>>
>> the_geom && expand(setSRID(makepoint(-72.607912,
>> 42.058052),4326),2000) AND
>>
>> from the SQL statement. So why bother adding the phrase. The phrase is
>> supposed to reject objects that are outside the expanded box from
>> consideration from the clause that follows which is more expensive.
>>
>> Since your point is in SRID:4326 which is in decimal degrees, when you
>> expand the point's bbox you have to expand it in the units of that
>> projection, in this case, decimal degrees. So your example code is
>> expanding it by +-2000 decimal degrees (not meters as you expected).
>> It will reject NO objects and ALL the object have to go through the
>> expensive test, AND you get the correct result, AND it costs a lot of
>> time and required you to change the distance calc to be less costly
>> and less accurate one.
>>
>> So the radius of the earth is about 40075160 meters (from my high
>> school geography book) and there are 360 degrees in a ball or
>> approximately 111319 meters per degree or 0.179664 degrees in 2000
>> meters.
>>
>> So if you go back to your original SQL and change it to say:
>>
>> the_geom && expand(setSRID(makepoint(-72.607912,
>> 42.058052),4326),0.179664) AND
>>
>> And rerun it, it should be MUCH faster and give you the same results.
>>
>> I hope this all makes sense, and I hope that someone will speak up if
>> I have this wrong, but I think it is correct.
>>
>> Best regards,
>> -Stephen Woodbridge
>>
>> Dan Phillips wrote:
>>
>>> Hey Steve,
>>>
>>> The '2000' represents 2000 meters & the query returns the correct
>>> results
>>> for both distance_spheroid() & distance_sphere(). As previously noted,
>>> distance_sphere() is much faster. The units returned are in meters.
>>>
>>> Dan
>>>
>>>
>>>
>>> -----Original Message-----
>>> From: postgis-users-bounces at postgis.refractions.net
>>> [mailto:postgis-users-bounces at postgis.refractions.net]On Behalf Of
>>> Stephen Woodbridge
>>> Sent: Friday, June 24, 2005 4:18 PM
>>> To: PostGIS Users Discussion
>>> Subject: Re: [postgis-users] Spheroid Question
>>>
>>>
>>> Dan,
>>>
>>> I am be wrong on my understanding, but it looks like you might be doing
>>> a full table scan. Since SRID:4326 is in decimal degrees, and you are
>>> expanding you point by +-2000 decimal degrees which is likely
>>> overlapping every object in the table. If you want to select items in
>>> 2km of your point you might want to convert 2000 into its approximate
>>> degrees for the && clause.
>>>
>>> Also what units do the *_spheroid() return in?
>>>
>>> -Steve W.
>>>
>>> Dan Phillips wrote:
>>>
>>>> Okay, this works. It's just really slow (~40 minutes). Any
>>>> suggestions on
>>>> speeding this up?
>>>>
>>>> SELECT
>>>> CRID,
>>>> distance_spheroid(centroid(the_geom),
>>>> setSRID(makepoint(-72.607912, 42.058052),4326),
>>>> 'SPHEROID["GRS_1980",6378137,298.257222101]') as distance
>>>> FROM crrts
>>>> WHERE
>>>> the_geom && expand(setSRID(makepoint(-72.607912,
>>>> 42.058052),4326),2000)
>>>> AND distance_spheroid(centroid(the_geom),
>>>> setSRID(makepoint(-72.607912, 42.058052),4326),
>>>> 'SPHEROID["GRS_1980",6378137,298.257222101]')<2000 ;
>>>>
>>>> Thanks,
>>>>
>>>> Dan
>>>>
>>>> -----Original Message-----
>>>> From: postgis-users-bounces at postgis.refractions.net
>>>> [mailto:postgis-users-bounces at postgis.refractions.net]On Behalf Of
>>>> strk at refractions.net
>>>> Sent: Friday, June 24, 2005 11:39 AM
>>>> To: PostGIS Users Discussion
>>>> Subject: Re: [postgis-users] Spheroid Question
>>>>
>>>>
>>>> On Fri, Jun 24, 2005 at 11:36:27AM -0400, Dan Phillips wrote:
>>>>
>>>>
>>>>> Thanks Jeff & Paul. That was the problem.
>>>>>
>>>>> Now I'm getting "ERROR: Operation on two geometries with different
>>>>> SRIDs"
>>>>>
>>>>> I assume this is because I'm not setting the SRID for my
>>>>> makepoint(). How
>>>>
>>>>
>>>>
>>>> do
>>>>
>>>>
>>>>> I do this to make it match the SRID (4326) of my 'crrts' table?
>>>>
>>>>
>>>>
>>>>
>>>> Use the setSRID() function:
>>>> setSRID(makepoint())
>>>> --strk;
>>
>>
>> _______________________________________________
>> 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