Решение без API. Это дает вам преимущество в том, что вы не зависите от каких-либо сторонних поставщиков, что может привести к потере или стоимости, или ограничению скорости, замедлению ответов и т. Д. И т. Д.
Сначала конвертируйте ваши местоположения в широты и долготы. Для этого вам понадобится база данных городов и городов, но я думаю, что это можно найти довольно легко. В Великобритании эти данные можно бесплатно получить из различных правительственных агентств. Затем с помощью координат вы можете рассчитать расстояние между ними. Ниже приведен java, но он должен быть прямым для переноса на javascript (или php):
public static double R_EARTH_EQUATORIAL = 6378137.0;
public static double R_EARTH_POLAR = 6356752.3;
// The shortest dist between two points on a globe. Lat/lngs are in RADIANS
public static double greatCircleDistance(double lat_1, double lng_1, double lat_2, double lng_2) {
double d_lat = lat_1 - lat_2;
double d_lng = lng_1 - lng_2;
double lat_ave = (lat_1 + lat_2) / 2;
double h = haversin(d_lat) + Math.cos(lat_1) * Math.cos(lat_2) * haversin(d_lng);
return 2 * R_EARTH(lat_ave) * Math.asin(Math.pow(h, 0.5));
}
public static double haversin(Double x) {
return Math.pow(Math.sin(x/2),2);
}
// Returns radius of earth at a given latitude
public static double R_EARTH(double latitude) {
double a = R_EARTH_EQUATORIAL;
double b = R_EARTH_POLAR;
double x = latitude;
double p = Math.pow((Math.pow(a,2) * Math.cos(x)),2);
double q = Math.pow((Math.pow(b,2) * Math.sin(x)),2);
double r = Math.pow(a * Math.cos(x),2);
double s = Math.pow(b * Math.sin(x),2);
return Math.pow(((p + q) / (r + s)), 0.5);
}