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

3
我会使用Geonames的API,但我的应用程序无法访问互联网。所以它必须独立运行。我看到有很多来自Geonames.org的文件可供下载,但我没有看到任何软件可以帮助进行反向地理编码。我想提供纬度/经度并返回国家代码。我考虑下载数据并将其放入MySQL数据库中。
请问反向地理编码使用了哪种算法,以便我可以在geonames.org下载中使用它。我的项目是用PHP编写的。谢谢!

geonames的下载主要是以.txt文件形式提供的,可以将其导入到MySQL数据库中。 - WatsMyName
1
是的,我的问题是关于如何使用这些数据库进行反向地理编码。有什么算法或PHP软件可以做到这一点吗?谢谢! - Edward
3个回答

3

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=55 and longitude=-2; +---------+ | country | +---------+ | GB | +---------+ 共1行(用时8.10秒)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秒) - Edward
你会注意到,我将其缩小到纬度40和经度-74,但仍然找不到它。似乎需要另一种查找表,其中包含每个国家的纬度/经度范围才能使其正常工作?但是我不知道这种数据存在于哪里,除非它在我忽略的另一个geonames数据集中可用。 - Edward
谢谢回复。所以听起来需要为每个国家建立一个范围查找表?如果是这样,似乎已经有人做过了,应该可以在某个地方找到? - Edward
是的,我确实尝试过了。但是你怎么知道每个纬度/经度之间的范围偏移量应该用于查找国家代码?你说,“你可以更改范围以适应”。但是你怎么知道范围之间的差异可能是什么?这就是为什么我说也许需要一个偏移量之间范围的查找表。 - Edward
请查看答案的补充部分。这是您要找的吗?您正在使用哪个桌面应用程序? - david strachan
显示剩余3条评论

2

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; 

将数据导入到此表的MySQL查询

LOAD DATA INFILE '/path/to/your/file/geoname.txt' INTO TABLE `geoname`;

一旦所有设置完成,您可以根据纬度/经度查询此表以获取国家名称。以下是您可以参考的链接:http://sgowtham.net/blog/2009/07/29/importing-geonames-org-data-into-mysql/http://forum.geonames.org/gforum/posts/list/732.page。希望这能帮到您!请注意保留HTML标签。

谢谢,这对于加载数据库很有帮助。然而,查询语句(请参阅我对 'david strachan' 的评论)。 - Edward
我一定是漏掉了什么。我用经纬度输入了一个纽约位置,但查询没有返回美国这个国家。如果没有某种方式知道每个国家的经纬度范围,这个数据库怎么能找到正确的国家呢?谢谢! - Edward

1
你要寻找的算法更像是一种数据结构而不是一个复杂的公式。Mysql支持R-tree和空间索引查询。这个概念是一个分层树,以纬度和经度对作为边界框,树的根节点具有整个世界的边界框。Kd-tree也可以很好地使用。在罕见的情况下,您可能想要查找quadkey或空间填充曲线。它是一种分形,将维度降低到一个数字。公式是H(x,y) = H(x) + H(y)。这个分形还保留了一些接近信息,我不知道如何用R-tree解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接