Php 使用Geonames.org下载的反向地理编码使用什么算法?

Php 使用Geonames.org下载的反向地理编码使用什么算法?,php,mysql,geonames,Php,Mysql,Geonames,我会使用API Geonames,但我的应用程序无法访问internet。因此,它必须独立运行。我看到Geonames.org上有很多文件需要下载,但我没有看到任何软件可以帮助进行反向地理编码。我想提供lat/lon并让它返回国家代码。我正在考虑下载数据并将其放入MySQL数据库 反向地理编码使用什么算法,这样我就可以在geonames.org下载中使用它了。我的项目是用PHP编写的。谢谢 geonames下载的文件主要是.txt文件,这些文件可以通过SQLYog导入mysql数据库 表格结构

我会使用API Geonames,但我的应用程序无法访问internet。因此,它必须独立运行。我看到Geonames.org上有很多文件需要下载,但我没有看到任何软件可以帮助进行反向地理编码。我想提供lat/lon并让它返回国家代码。我正在考虑下载数据并将其放入MySQL数据库


反向地理编码使用什么算法,这样我就可以在geonames.org下载中使用它了。我的项目是用PHP编写的。谢谢

geonames下载的文件主要是
.txt
文件,这些文件可以通过SQLYog导入mysql数据库

表格结构

CREATE DATABASE geonames;
USE geonames;

CREATE TABLE geoname (
geonameid int PRIMARY KEY,
name varchar(200),
asciiname varchar(200),
alternatenames varchar(4000),
latitude decimal(10,7),
longitude decimal(10,7),
fclass char(1),
fcode varchar(10),
country varchar(2),
cc2 varchar(60),
admin1 varchar(20),
admin2 varchar(80),
admin3 varchar(20),
admin4 varchar(20),
population int,
elevation int,
gtopo30 int,
timezone varchar(40),
moddate date
) CHARACTER SET utf8; 
LOAD DATA INFILE '/path/to/your/file/geoname.txt' INTO TABLE `geoname`;
MYsql查询将数据导入此表

CREATE DATABASE geonames;
USE geonames;

CREATE TABLE geoname (
geonameid int PRIMARY KEY,
name varchar(200),
asciiname varchar(200),
alternatenames varchar(4000),
latitude decimal(10,7),
longitude decimal(10,7),
fclass char(1),
fcode varchar(10),
country varchar(2),
cc2 varchar(60),
admin1 varchar(20),
admin2 varchar(80),
admin3 varchar(20),
admin4 varchar(20),
population int,
elevation int,
gtopo30 int,
timezone varchar(40),
moddate date
) CHARACTER SET utf8; 
LOAD DATA INFILE '/path/to/your/file/geoname.txt' INTO TABLE `geoname`;
设置完毕后,您可以根据lat/long查询此表以获取国家名称

这是你可以参考的链接

希望这有帮助

提供了大多数国家的数据。这些数据可以导入MySQL数据库。可使用lat lng进行搜索

问题是文件中的数据可能太多,无法满足您的需求。您可以删除所有所需国家/地区的所有字段(lat、lng和国家/地区代码除外),然后将它们合并到一个记录中

MySQL查询

XX
中选择
country code
,其中
lat
介于55和55.5之间,以及
lng
介于-2之间
和-1.5

这将在111公里的“盒子”上拉入数据。您可以根据需要更改范围

从下表可以看出,111kM“框”仅在赤道(0°)有效。对于其他纬度地区,需要增加液化天然气的射程

    lat                 lng
0°  110.574 km  111.320 km
15° 110.649 km  107.551 km
30° 110.852 km  96.486 km
45° 111.132 km  78.847 km
60° 111.412 km  55.800 km
75° 111.618 km  28.902 km
90° 111.694 km  0.000 km

您正在寻找的算法与其说是一个复杂的公式,不如说是一个数据结构。Mysql支持R树和空间索引查询。该概念是一个层次树,以lat-long对作为边界框。树的根在边界框中具有整个世界。Kd树也可以很好。在极少数情况下,您需要查找四键或空间填充曲线。这是一个分形,将维数减少到一个数字。公式为H(x,y)=H(x)+H(y)。分形还保存了一些邻近信息,我不知道如何用R-树解决这些信息。

geonames下载的文件主要是
.txt
文件,这些文件可以导入mysql数据库是的,我的问题是如何使用这些数据库进行反向地理编码。什么是算法或PHP软件来实现这一点?谢谢谢谢,这有助于加载数据库。然而,这些查询(请参阅我对下面“david strachan”的评论。我肯定遗漏了什么。查询没有返回我与lat/lon一起输入的纽约位置的美国国家。除非有某种方式知道每个国家的lat/lon范围,否则该数据库将如何找到正确的国家?谢谢!谢谢你的帖子。我对h感到困惑。)下面是我的测试:mysql>从geoname中选择国家,其中纬度=55,经度=2;+----------------++++--国家+-----------++--一行(8.10秒)mysql>从地理名称中选择国家,其中纬度=40.7172740,经度=-74.0089860;空集(8.27秒)mysql>从地理名称中选择国家,其中纬度=40,经度=-74;空集(8.10秒)这表明数据库在数据库中找不到符合此标准的记录。小数点后6位的精度约为111米,因此我将此限制为您会注意到的,我还将其降低到lat为40,lon为-74,但仍然没有找到。似乎需要另一种具有la范围的查找表每一个国家的t/lon数据是否有效?但我不知道这类数据存在于何处,除非它在我忽略的另一个geonames数据集中可用。-74应该是360-74=286。此外,查询上的参数应该与您的数据库上的参数完全相同谢谢您的答复。因此,听起来需要有一个范围estab的查找表每个国家的英语水平?如果是的话,似乎有人已经这样做了,它会在某个地方出现吗?