Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>To start with, I think you have your <a href="http://en.wikipedia.org/wiki/Latitude" rel="nofollow noreferrer">latitude</a> and <a href="http://en.wikipedia.org/wiki/Longitude" rel="nofollow noreferrer">longitude</a> reversed. Longitude measures X, and latitude measures Y.</p> <p>The latitude is easy to turn into a north-south distance. We know that 360 degrees is a full circle around the earth through the poles, and <a href="http://geography.about.com/library/faq/blqzcircumference.htm" rel="nofollow noreferrer">that distance is 40008000 meters</a>. As long as you don't need to account for the errors due to the earth being not perfectly spherical, the formula is <code>deltaLatitude * 40008000 / 360</code>.</p> <p>The tricky part is converting longitude to X, as you suspected. Since it depends on the latitude you need to decide which latitude you're going to use - you could choose the latitude of your origin, the latitude of your destination, or some arbitrary point in between. The circumference at the equator (latitude 0) is 40075160 meters. The circumference of a circle at a given latitude will be proportional to the cosine, so the formula will be <code>deltaLongitude * 40075160 * cos(latitude) / 360</code>.</p> <p><strong>Edit:</strong> Your comment indicates you had some trouble with the longitude formula; you might have used degrees instead of radians in the call to <code>cos</code>, that's a common rookie mistake. To make sure there's no ambiguity, here's working code in Python.</p> <pre><code>def asRadians(degrees): return degrees * pi / 180 def getXYpos(relativeNullPoint, p): """ Calculates X and Y distances in meters. """ deltaLatitude = p.latitude - relativeNullPoint.latitude deltaLongitude = p.longitude - relativeNullPoint.longitude latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude)) resultX = deltaLongitude * latitudeCircumference / 360 resultY = deltaLatitude * 40008000 / 360 return resultX, resultY </code></pre> <p>I chose to use the relativeNullPoint latitude for the X calculation. This has the benefit that if you convert multiple points with the same longitude, they'll have the same X; north-south lines will be vertical.</p> <p><strong>Edit again:</strong> I should have pointed out that this is a very simple formula and you should know its limitations. Obviously the earth is not flat, so any attempt to map it to XY coordinates will involve some compromises. The formula I derived above works best when the area you're converting is small enough to consider flat, and where the slight curvature and non-parallelism of north-south lines can be ignored. There's a whole science to map projections; if you want to see some possibilities a good place to start would be <a href="http://en.wikipedia.org/wiki/Map_projection" rel="nofollow noreferrer">Wikipedia</a>. This specific projection is known as <a href="https://en.wikipedia.org/wiki/Equirectangular_projection" rel="nofollow noreferrer">the Equirectangular projection</a>, with some added scaling.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload