Spatial Indexes: Calculating Distance
During my "Geolocation and Mapping with PHP" talk that I've given a few times I briefly touch on the subject of indexes on data-sets of spatial data. This isn't as simple as just solving Pythagoras theorem and this article is meant to clarify this.
The flat Earth model
Pythagoras theorem can be used to calculate the distance between two points quite easily; you take the square root of the square of the absolute vertical distance plus the square of the absolute horizontal distance; in short:d = aˆs(|x1 - x2|A² + |y1 - y2|A²)
or in PHP:$d = sqrt(pow(abs($x1 - $x2), 2) + pow(abs($y1 - $y2), 2));
If you take for example London's coordinates (51.50A°N, 0.13A°W) and Amsterdam's coordinates (52.37A°N, 4.90A°E) we can calculate the distance with:d = aˆs(|-0.13 - 4.90|A² + |51.50 - 52.37|A²) d = aˆs(5.03A² + 0.87A²) d = aˆs(26.0578) d a‰... 5.10
And on a map:
But what does a difference of "5.10A°" actually mean? How far is this in useful units, such as meters?
If we show the whole map of which the above is an extract, we come to:
The distance around the equator, and through the poles is roughly the same, 40.000km (please be aware that the blue line only shows half of it, the other half is going through the anti-meridian at 180A°W/E). 5.03A° in East-West difference is then about 40 000 ao• (5.03/360) = 559 km and the North-South difference about 20 000 ao• (0.87/180) = 97 km. Using those numbers within the Pythagoras theorem we end up with a distance of aˆs(559A² + 97A²) = 567 km. Although the calculation is correct, the answer is still wrong. The real distance is closer to 360 km.
The spherical Earth model
If we look at the Earth in its original (mostly) spherical 1 shape, then it's clear that 10A° longitude (East/West) at 60A°N is going to be less of a distance than 10A°E/W at the equator. It's actually fairly easy to calculate how much 1A° longitude is at 60A°N by using cos(60) * 1/360 * 6371 * 2I€ 2. Or in PHP:
This returns 55.597 km per A° for 60A°N. The same distance in degrees on the Equator gives 6371 * 2 * M_PI / 360 = 111.195.
The following diagram shows ones more that latitudinal degrees always correspond with the same distance in kilometer, whereas longitudinal degrees differ.
In the diagram the line A is a line from 0A°N, 90A°W to 10A°N, 90A°W. It has the same length as line B, from 30A°N, 90A°W to 40A°N, 90A°W: a 36th of the circumference of the Earth through the poles. Line C, from 0A°N, 30A°W to 0A°N, 20A°W has the same length. Line D however, from 50A°N, 30A°W to 50A°N, 20A°W is shorter by a factor of cos(50A°) a‰... 0.64.
If we look again at the distance between London and Amsterdam, ignore the differences in latitude and instead pick the average, we see:
Which is a bit shorter than the expected 360km, but that's because we conveniently forgot about the difference in latitude.
Sadly, we can't use Pythagoras's theorem to calculate the real distance with the latitude difference taken account as well. This is because the theorem is meant for Euclidean geometry, and a sphere does not follow the rules of this geometry. Instead we need to use a formula that is called the great-circle distance
Truncated by Planet PHP, read more at the original (another 2340 bytes)