Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I am trying to create a x mile square (or circle) around a central point, where all sides of the square would be x miles from the centre. I need the 4 corner coordinates.

It is scrambling my brain trying to get my head round it? I can work out the distance between two points using the haversine formula but maths is seriously not my strong point and I don't understand sin,cos etc.. and trying sort this out has lost me!

I have come across this post but I just don't get it!

Would anyone be kind enough to explain how I do this in apples and pears terms?

EDIT

To explain exactly what I trying to do;

I have a website, where users can search for buildings in a specific area. They will enter a town or place (which I will know the lat long of) and they search within a specific radius of say 10 miles of the place.

I need to find the min/max lat and longs of the 10mile radius so I can query my database using a where clause similar to:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

I need some kind of formula!

My coordinates are in decimal degrees

share|improve this question

5 Answers 5

Take the X coordinate of the center and subtract x miles from it this is the left side of your square. Then take the Y coordinate of the center and subtract X miles from it, this is the bottom of your square. Repeat these steps but adding instead of subtracting to get the right hand and top edges. You can now construct the four corners of your square.

Note the above assumes that your center point is in miles. If it is not first reproject it. Other wise all bets are off and your square will not be square.

share|improve this answer
    
Are you referring to the example page? How do I subtract miles from a coordinate and do I not need to take the curvature of the earth into account? –  Bex Oct 11 '11 at 13:21
    
No it's so simple there is no actual need to have a worked example. Maybe you need to specify what software you are using? As I said my solution assumes you have projected your coordinate to a local SRS (if you haven't then that should be your first question) –  iant Oct 11 '11 at 13:27
    
I am really confused now! I have updated my question to say exactly what I am trying to do. I kind of need to create a bounding box so I can find the min and max lat and long. –  Bex Oct 11 '11 at 13:35
3  
proj4js (proj4js.org) should help then –  iant Oct 11 '11 at 14:14
1  
My coordinates look like this: 51.498485,-0.129089 that is degrees isn't it? –  Bex Oct 11 '11 at 14:46

For this purpose simple approximations are more than good enough. North or south, one degree is about 69 miles but east or west, it is only 69*cos(latitude) miles. Because latitudes do not change much over a ten mile span, you can safely use the cosine of the central latitude of the "square." Therefore the desired coordinates for square vertices at distance r miles from a central location (f,l), given as lat-lon, are computed as

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

For example, suppose r = 10 miles and the central location is at latitude 50 degrees north, longitude 1 degree west, so that (f,l) = (50,-1) degrees. Then

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

and the coordinates are (49.855,-1.225), (50.145,-1.225), (50.145, -0.775), and (49.855, -0.775) as you march clockwise around the square starting at its southwestern corner.

Don't use this approximation near the poles or for squares larger than a few degrees on a side. Also, depending on limitations of the GIS, some care might be needed around the global cut in longitude, usually taken at +-180 degrees.

share|improve this answer
up vote 1 down vote accepted

Finally my answer is: (in c#)

I probably don't need the 4 coordinates but I think they are fairly accurate.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

EDIT

Having just realised if I set the corners of my square x miles from the center point, the edges of my square won't be the same x miles. (said maths wasn't my strong point) So to get the corner points distance from the center point if I want my squares edges to x miles I used Pythagoras' Theorem to work out the distance of the diagonal. (on a right angled triangle, the square on the hypotenuse (the diagonal) is equal to he square of the other two sides)

share|improve this answer
    
that won't be a square. –  iant Oct 11 '11 at 15:21
    
I have amended my bearings, it was a diamond.. it's now square –  Bex Oct 11 '11 at 15:41
    
Concerning the edit, the Pythagorean Theorem is ok for small squares, but in general it does not hold for spherical right triangles. It's strange, then, that your code uses spherical trigonometry together with this approximation based on plane geometry. –  whuber Oct 16 '11 at 14:49
    
My distance will never be more than 100 miles so I don't think it matters. As the inaccuracies will be small with that smaller distance. –  Bex Oct 17 '11 at 7:37

If you are using a spatially aware database you can convert your area of interest into the same coordinate system your data is stored in and then do an apples to apples comparison.

For example:

  1. User picks a location, resulting in lat/lon.
  2. Ask spatial database to convert this point into a projected coordinate system appropriate to the area (units of feet or meters, etc.).
  3. Build your area of interest around the projected point.
  4. Ask spatial database to convert this area of interest back to lat/lon.
  5. Do whatever comparisons you need to do.
share|improve this answer

I used what's in this page

Destination point given distance and bearing from start point

Formula:
lat2 = asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(θ))
lon2 = lon1 + atan2(sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2))

θ is the bearing (in radians, clockwise from north); d/R is the angular distance (in radians), where d is the distance travelled and R is the earth’s radius

For θ I used -45 degrees (in radians) for the "upper-left point" and 135 degrees for the "bottom-right" one

(I recently asked the same question in the math site)

share|improve this answer
    
The problem with this solution is you first have to figure out the distance for the diagonals of the square. It's easier instead to move along geodesics from the center to the midpoints of the sides and then, turning 90 degrees, to move along the square's sides. –  whuber Oct 16 '11 at 14:52
    
@whuber, If the distance is small enough, can't you use simple trigonometry for it? (d = opposing side / sin(adjacent side). I do that because I don't need that distance to be exact. Otherwise, you could apply this formula twice to do exactly what you say (first with θ=0 then with θ=-90 for the upper left for example) –  jmfsg Oct 16 '11 at 21:46
    
That is correct, Juan. But one is left wondering why you use the more complicated formulas of spherical geometry when you start out with an approximation that supposes Euclidean formulas will work in the first place. There's nothing wrong with using the spherical formulas, but it's unnecessary and computationally inefficient. –  whuber Oct 16 '11 at 23:43
    
@whuber, for the second case it isn't approximate (applying the formula twice for each side). You're right that it wouldn't make any sense to mix them though. I actually have this implemented, but I'll change it (oh, and the reason is because I'm not that good at math :) ) –  jmfsg Oct 17 '11 at 0:14

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.