使用任何开源的位置的纬度和经度

use*_*413 -3 javascript api perl

如何检索位置纬度和经度.

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

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

需要注意的是:

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

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

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


ave*_*age 5

OpenStreetMap的

或者您可以使用openstreetmap数据.他们有一个全球数据库,全部23G.

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

您可以使用Geo :: Parse :: OSM来解析从openstreetmap获得的23千兆字节的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
Run Code Online (Sandbox Code Playgroud)

您可能遇到另一个问题,即lat/long究竟是什么意思,因为城市可能是一个点,一个圆或一个多边形,具体取决于您如何定义它.也许你想要一个半径来自城市的纬度/长度的点.

的MaxMind

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

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

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

谷歌地图

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

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