我会使用Geonames的API,但我的应用程序无法访问互联网。所以它必须独立运行。我看到有很多来自Geonames.org的文件可供下载,但我没有看到任何软件可以帮助进行反向地理编码。我想提供纬度/经度并返回国家代码。我考虑下载数据并将其放入MySQL数据库中。
请问反向地理编码使用了哪种算法,以便我可以在geonames.org下载中使用它。我的项目是用PHP编写的。谢谢!
请问反向地理编码使用了哪种算法,以便我可以在geonames.org下载中使用它。我的项目是用PHP编写的。谢谢!
Geonames 提供了大部分国家的数据,这些数据可以导入到MySQL数据库中。通过使用经纬度进行搜索。
问题是文件中可能有太多的数据超出您的要求。您可以删除除所需国家的lat、lng和国家代码以外的所有字段,然后将它们合并为1个记录。
MySQL查询:
SELECT country code
FROM XX
WHERE lat
BETWEEN 55 AND 55.5 AND lng
BETWEEN -2 AND -1.5
这将在111kM的“盒子”中拉取数据。您可以根据需要更改范围。
从下面的表格中可以看出,111kM“盒子”仅在赤道(0°)有效。对于其他纬度,lng范围需要增加。
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> select country from geoname where latitude=40.7172740 and longitude=-74.0089860;
空集(用时8.27秒)
mysql> select country from geoname where latitude=40 and longitude=-74;
空集(用时8.10秒)
- Edwardgeonames的下载主要是以.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;
将数据导入到此表的MySQL查询
LOAD DATA INFILE '/path/to/your/file/geoname.txt' INTO TABLE `geoname`;
.txt
文件形式提供的,可以将其导入到MySQL数据库中。 - WatsMyName