打开街道地图
或者您可以使用 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 个地址。