3

我会使用 API Geonames,但我的应用程序无法访问互联网。所以它必须独立运行。我看到有许多来自 Geonames.org 的文件可供下载,但我没有看到任何软件可以帮助进行反向地理编码。我想提供纬度/经度并让它返回国家代码。我正在考虑下载数据并将其放入 MySQL 数据库。

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

4

3 回答 3

3

Geonames为大多数国家/地区提供数据。该数据可以导入 MySQL 数据库。这可以使用 lat lng 进行搜索。

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

MySQL 查询

country code 从55 和 55.5以及 -2 和 -1.5XX之间选择latlng

这将在 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
于 2012-09-26T10:59:13.610 回答
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

希望这可以帮助!

于 2012-09-26T10:48:44.050 回答
1

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

于 2012-09-26T15:33:54.903 回答