-4

如何检索位置的经纬度。

输入:用户输入位置名称。

输出:用户输入的位置的经纬度。

需要注意的点:

它必须是免费的(不像 google。)并且每天还支持超过 2000 万个请求。解决方案可以是任何类型的在线(api、javascript)或离线(文本、.csv 文件)

已经通过 Mapquest,openstreet 地图服务,但在 Mapquest 的情况下,他们需要钱,而在 openstreet 的情况下,限制是查询的数量

我正在寻找一种解决方案,例如使用 mapquest 中的地图图块,使用传单 javascript 或 openlayer javascript 向 mapquest 服务器发送查询,根据我的搜索,这是免费的,但问题是要请求我们需要提供的地图他们提供位置的纬度和经度(位置的地理代码),在此基础上他们提供维护数据库的图块,这不是一个好的步骤,因为根据位置,有很多地方都同名在世界各地.. 但我们需要与谷歌相比,该位置的地理代码相同或大约 90% 正确。


4

2 回答 2

5

打开街道地图

或者您可以使用 openstreetmap 数据。他们有一个全球性的数据库,全是 23G

您可以下载所有这些并根据需要使用它。

您可以使用Geo::Parse::OSM解析从 openstreetmap 获得的 23 GB OSM 文件。

临时解决方案

如果您想按位置 lat/long 进行地理编码,我建议您在 Postgresql 中制作一个表并进行一些空间索引。您可以将 Maxmind 在其数据库中的所有内容(见下文)放入该表中,或者您可以将 Openstreetmap 中的数据(见下文)放入该表中。然后您可以在该表上进行快速搜索。Postgresql 可能具有四叉树数据结构或类似的结构,可以轻松搜索该表中的条目。

这是另一个演示文稿,它告诉您如何对表中的数据进行空间索引,以及您可以对其执行哪些类型的查询。这是一个例子:

create table pubs (name varchar,beer_price float4);
addgeometrycolumn(‘beer_db’,'pubs','location’,2167,'POINT',3);
insert into pubs values ( 'Garricks Head', 4.50, 
     GeometryFromText( 'POINT (1196131 383324)’   ,2167));

select name, beer_price, 
distance(location, GeometryFromText('POINT(1195722 
383854)',2167)) 
from pubs order by beer_price;

  name           | beer_price |     distance     
  ---------------+------------+------------------
  Fireside       |       4.25 | 1484.10275160491
  The Forge      |       4.33 | 1533.06561109862

您可能会遇到另一个问题,即纬度/经度到底是什么意思,因为城市可能是一个点、一个圆或一个多边形,具体取决于您如何定义它。也许您想要从城市的纬度/经度到某个半径范围内的点。

万能

我想这取决于您所说的位置。如果您正在谈论城市、国家、州、邮政编码、区号等,请使用Maxmind 网络服务。在该链接中,您可以找到有关查询 Maxmind 的信息。但是您需要一个可以从他们那里购买的许可证密钥。

他们还有一个用于查询该服务的 C API

或者,对于离线使用,您可以获得他们的免费离线 Maxmind db

谷歌地图

如果您想在街道级别进行地理定位,我建议您使用 Google Maps API。如果您想做这么多请求,您将需要一个 API 密钥,您必须为此付费。

他们也有一个商业套餐,你可以在这里看到详细的比较。它们允许您每天查找 100,000 个地址。

于 2013-03-06T11:10:59.830 回答
1

打开街道地图。免费的世界地图。这些数据可以免费下载(与谷歌不同)并在其开放许可下使用。

将震撼你的世界:)

于 2013-03-06T11:19:30.570 回答