[postgis-users] Ellipses and WGS84

Bruce Rindahl rindahl at lrcwe.com
Tue Nov 18 10:18:42 PST 2008


Your parameter r is in map units.  For your example r = 1 or a 1 degree 
circle.  The center section should be :
buffer(GeomFromText('Point(0.0 0.0)', 4326), 1)
Now you have a circle (polygon actually) with a radius of 1 unit 
(degrees) centered at point 0,0.
Next you need to scale the circle to create an ellipse.  You do this 
with the scale factors a and b.  These parameters are dimensionless 
(ratios).
The query becomes scale(buffer(GeomFromText('Point(0.0 0.0)', 4326), 
1),a,b)  where a is the meters per degree of longitude and b is the 
meters per degree of latitude at your final point cx,cy.  This gives you 
an ellipse at point(0 0) with the correct shape. 
Next is a rotation function to create an arbitrary ellipse.  You do not 
need this so eliminate it.
Finally translate the ellipse to your desired location - cx cy.
translate(scale(buffer(GeomFromText('Point(0.0 0.0)', 4326), 1),a,b),cx,cy)

Read it from the inside out. Make a unit circle (buffer) then scale it 
differently in x and y (scale (...),a,b) then move it to the location 
you want (translate(...),cx,cy)

Bruce

 David W Talmage - CONTRACTOR wrote:
> Bruce Rindahl wrote:
>> The example creates an ellipse directly in a projected coordinate 
>> space.  What you need is the difference between latitude and 
>> longitude of 1 meter at the location you want.  Your code should be:
>> translate(rotate(scale(buffer(GeomFromText('Point(0.0 0.0)', 4326), 
>> r),a,b),alpha),cx,cy)
>>
>> Where r is the radius in decimal degrees of 1 meter at the equator, b 
>> =1 (the 1 meter distance does not change in the N/S direction), alpha 
>> is 0 since you will not rotate the ellipse, and cx and cy are you 
>> final lat/long locations.  The a parameter is tricky.  You need to 
>> know how much larger 1 degree of longitude is than 1 degree of 
>> latitude is at cx,cy.  You might try:
>> ...
>
> Thank you for helping me!
>
> I should have worded the problem differently.  I need to make an ellipse
> with a and b greater than 1.  Following the code, I start with a 1m
> circle, then scale it up to a-meters by b-meters.
>
> So the r, a, and b are all in degrees?  Then I have to figure out how 
> many meters per degree at latitude cy and divide r, a, and b by that 
> number, right?
>
> If that's right, then something strange is going on.  I'm creating the 
> ellipse that way and my SELECT asks for all things whose bounding box 
> intersects that of the ellipse.  PostGIS is returning far fewer things 
> that I expect.  Here's my SELECT:
>
>
> SELECT rf.name FROM raster_entry re, raster_file rf WHERE 
> re.raster_data_set_id = rf.raster_data_set_id AND rf.type = 'main' AND 
> (re.ground_geom && 
> translate(rotate(scale(buffer(GeomFromText('Point(0.0 0.0)', 4326), 
> ?), ?, ?), ?), ?, ?));
>
>
> I'm doing this in Java with a PreparedStatement.  The '?' correspond 
> to r, a, b, alpha, cx, and cy, respectively.
>
>
>> David W Talmage - CONTRACTOR wrote:
>>> Would someone please explain the units in this snippet modeled after 
>>> the exampled offered in
>>> http://postgis.refractions.net/pipermail/postgis-users/2007-March/014971.html 
>>> ?
>>>
>>> translate(rotate(scale(buffer(GeomFromText('Point(0.0 0.0)', 4326), 
>>> r),a,b),alpha),cx,cy)
>>>
>>> What are the units of r, a, and b?  I think they are radians.
>>>
>>> My intention is to create a 1-meter radius circle at the Equator, 
>>> morph  it into an ellipse and then move the ellipse to an area of 
>>> interest on the globe to select the things that are in that area.  
>>> All of my things are stored with coordinates in WGS84.
>>>
>>> I know the values of a and b in meters.  I have a function that 
>>> computes the number of meters per degree on an ellipsoid at any 
>>> latitude, so I can convert a and b to radians.
>>>
>>> I'm pretty sure that cx and cy are the longitude and latitude, 
>>> respectively, in degrees of the center of the ellipse.
>>>
>>> alpha is in radians.
>>>
>>> I've looked all over for an answer to this question and either I 
>>> can't find it or don't understand what I've found. :-(
>
>
>
> _______________________________________________
> 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