Php 如何从列表中找到最近的国家

Php 如何从列表中找到最近的国家,php,api,google-maps,geolocation,geography,Php,Api,Google Maps,Geolocation,Geography,我有一份ISO 3166国家代码列表(240)和一份8个国家/地区/地区(澳大利亚、丹麦、荷兰、卡塔尔、南非、阿联酋、英国和美国)的列表。我想浏览一下国家代码列表,并为每个国家代码找出8个国家代码列表中最接近的国家代码。指标(地理距离、直线距离、驾驶时间等)并不特别重要,因为它不需要完美,只要合理 8个位置的列表可能会定期更改,因此手动执行任务是不切实际的。我曾尝试使用谷歌地图API,但迄今为止都没有成功。理想的解决方案是使用PHP,并将生成一个数组,其中国家代码作为索引,最近的国家(从8个列表

我有一份ISO 3166国家代码列表(240)和一份8个国家/地区/地区(澳大利亚、丹麦、荷兰、卡塔尔、南非、阿联酋、英国和美国)的列表。我想浏览一下国家代码列表,并为每个国家代码找出8个国家代码列表中最接近的国家代码。指标(地理距离、直线距离、驾驶时间等)并不特别重要,因为它不需要完美,只要合理


8个位置的列表可能会定期更改,因此手动执行任务是不切实际的。我曾尝试使用谷歌地图API,但迄今为止都没有成功。理想的解决方案是使用PHP,并将生成一个数组,其中国家代码作为索引,最近的国家(从8个列表中)作为值。感谢您的帮助

geonames项目有您可以使用的公共数据

现在您可以获得地理日期之间的距离

function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lng1 *= $pi80;
    $lat2 *= $pi80;
    $lng2 *= $pi80;

    $r = 6372.797; // mean radius of Earth in km
    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;

    return ($miles ? ($km * 0.621371192) : $km);
}
对于您的用例,您可以使用国家的资本。对于大国,你可能应该在边界附近增加更多的国家

这是一个解决办法。您还可以在数据库中存储近似国家的几何形状,并进行精确查询

然而,起点是数据。你到底想要什么?你有什么数据


如果效率是一个问题,我建议建立一个图表,每个国家都被存储并与其边境国家联系起来。如果您只查看边境国家,这将大大减少计算工作量。

geonames项目有您可以使用的公共数据

现在您可以获得地理日期之间的距离

function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lng1 *= $pi80;
    $lat2 *= $pi80;
    $lng2 *= $pi80;

    $r = 6372.797; // mean radius of Earth in km
    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;

    return ($miles ? ($km * 0.621371192) : $km);
}
对于您的用例,您可以使用国家的资本。对于大国,你可能应该在边界附近增加更多的国家

这是一个解决办法。您还可以在数据库中存储近似国家的几何形状,并进行精确查询

然而,起点是数据。你到底想要什么?你有什么数据


如果效率是一个问题,我建议建立一个图表,每个国家都被存储并与其边境国家联系起来。如果只看边境国家,这将大大减少计算工作量。

谢谢,这看起来很有希望!它希望参数采用什么格式?N/S和E/W分别为正整数和负整数?我目前拥有的数据是所有ISO 3166-1国家的列表和8个位置的列表(如上所列),我希望ISO 3166中的每个国家的数据都链接到8个位置中最近的位置。我在MySQL中存储数据,其中一个表用于国家,另一个表用于带有简单连接表的地方。非常简单的数据结构,但这是预期的目的-一旦我知道如何提供所需的数据,像上面这样的功能将是完美的!谢谢,这看起来很有希望!它希望参数采用什么格式?N/S和E/W分别为正整数和负整数?我目前拥有的数据是所有ISO 3166-1国家的列表和8个位置的列表(如上所列),我希望ISO 3166中的每个国家的数据都链接到8个位置中最近的位置。我在MySQL中存储数据,其中一个表用于国家,另一个表用于带有简单连接表的地方。非常简单的数据结构,但这是预期的目的-一旦我知道如何提供所需的数据,像上面这样的功能将是完美的!