【问题标题】:What algorithm is used for Reverse Geocoding using Geonames.org downloads?使用 Geonames.org 下载的反向地理编码使用什么算法?
【发布时间】:2012-09-28 20:28:00
【问题描述】:

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

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

【问题讨论】:

  • geonames下载主要在.txt文件中,这些可以导入mysql数据库
  • 是的,我的问题是关于如何使用这些数据库进行反向地理编码。执行此操作的算法或 PHP 软件是什么?谢谢!

标签: php mysql geonames


【解决方案1】:

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

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

MySQL 查询

XX 中选择country code,其中lat 在55 和55.5 之间以及lng 在-2 之间
和 -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; +---------+ |国家 | +---------+ |国标 | +---------+ 1 行 in set (8.10 sec) mysql> 从地理名称中选择国家,其中纬度=40.7172740 和经度=-74.0089860;空集(8.27 秒)mysql> 从地理名称中选择国家,其中纬度=40 和经度=-74;空集(8.10 秒)
  • 这表明数据库在数据库中没有找到满足该条件的记录。 6 位小数给出了大约 0.111 米的精度,所以我会限制这一点,请参阅 en.wikipedia.org/wiki/Decimal_degrees
  • 你会注意到,我也将它修剪到 40 的纬度和 -74 的经度,但它仍然没有找到它。似乎需要另一种查找表,其中每个国家/地区的纬度/经度范围才能正常工作?但我不知道这种数据存在哪里,除非它在我忽略的另一个地名数据集中可用。
  • -74 应该是 360-74 = 286。查询上的参数也应该和你的数据库上的完全一样
  • 感谢您的回复。所以听起来需要为每个国家/地区建立一个范围查找表?如果是这样,似乎有人已经这样做了,并且可以在某个地方使用?
【解决方案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

希望这会有所帮助!

【讨论】:

  • 谢谢,这有助于加载数据库。但是,查询(请参阅下面我对“david strachan”的评论。
  • 我一定错过了什么。对于我输入的带有纬度/经度的纽约位置,该查询没有返回美国国家/地区。除非有某种方法可以知道每个国家/地区的纬度/经度范围是多少,否则该数据库将如何找到正确的国家?谢谢!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2021-01-26
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多