我会使用API Geonames,但我的应用程序无法访问互联网。所以它必须独立运行。我看到有很多来自Geonames.org的文件要下载,但我没有看到任何软件可以帮助我们进行反向地理编码。我想提供lat / lon并让它返回国家代码。我正在考虑下载数据并将其放入MySQL数据库。
反向地理编码使用了什么算法,因此我可以使用geonames.org下载来使用它。我的项目是用PHP编写的。谢谢!
答案 0 :(得分:3)
Geonames为大多数国家/地区提供数据。这些数据可以导入MySQL数据库。可以使用lat lng搜索。
问题是文件中的数据可能太多,无法满足您的要求。您可以删除所有所需国家/地区除lat,lng和国家/地区代码之外的所有字段,然后将它们合并为1条记录。
MySQL查询
SELECT country code
FROM XX
在{55}和55.5之间lat
以及在{-2}之间lng
-2
和-1.5
这将通过111kM的“Box”提取数据。您可以更改范围以适应。
从下表中可以看出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
答案 1 :(得分:2)
geonames downloads主要在.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`;
设置完毕后,您可以使用lat / long查询此表以获取国家/地区名称
以下是您可以参考的链接
http://sgowtham.net/blog/2009/07/29/importing-geonames-org-data-into-mysql/
http://forum.geonames.org/gforum/posts/list/732.page
希望这有帮助!
答案 2 :(得分:1)
您正在寻找的算法更多的是数据结构,而不是复杂的公式。 Mysql支持R树和空间索引查询。该概念是一个分层树,其中lat长对作为边界框,树的根在边界框中具有整个世界。 Kd树也可以。在极少数情况下,您需要查找四元组或空间填充曲线。这是一个分形,并将维度减少到一个数字。公式为H(x,y)= H(x)+ H(y)。分形也预先设置了一些接近度信息,我不知道它是如何用R树解决的。