有没有办法进行批量地理编码(通过地址获取纬度/经度,反之亦然)? [关闭]
Posted
技术标签:
【中文标题】有没有办法进行批量地理编码(通过地址获取纬度/经度,反之亦然)? [关闭]【英文标题】:Is there way to do batch geocoding (get lat/lon by address and vice-versa)? [closed] 【发布时间】:2012-04-15 04:38:32 【问题描述】:Google Geocoding API 有严重的限制(每天 2,500 个请求),我们总是会收到限制错误。他们的business license 售价 10,000 美元,对我们来说太贵了。 服务应该适用于不同的语言和不同的国家。 服务应验证地址并返回 lat/lng。地址可以是不同格式的字符串。
我们已准备好为此类服务付费,最好使用 RESTful API。
【问题讨论】:
另一个服务batchgeo.com 你能澄清一下吗?您在寻找美国地址吗?是否正在尝试验证地址是否存在,然后对其进行地理编码?或者您只是想找出如果要退出的地址“会”在哪里(地址近似值)。 @Jeffrey 我有一点更新。你还对什么感兴趣? 【参考方案1】:我在SmartyStreets工作,你描述的是他们的核心领域。
您可能对将地址转换为纬度/经度和can process thousands of requests per second 的 LiveAddress 感兴趣。它地理分布在 3 个数据中心,并具有 RESTful 端点。你可以做up to 100 addresses per request。如果您有 Excel 或 CSV 文件或类似文件,还有一个列表处理版本。
最高的price tag 是 1 万美元,但它可以让您在一年内无限次查找。
一些示例代码位于https://github.com/smartystreets/LiveAddressSamples。
他们的许可协议没有此类限制来限制您的使用。 Dbaseman 是对的:您会遇到限制错误,因为它违反了 TOS(除非您从他们那里获得营业执照,但即便如此,地址也是“最佳猜测”——没有像 CASS 认证服务那样标准化和验证. 这是需要牢记的)。
【讨论】:
我应该明确指定国家、城市、地址作为请求参数吗? SmartyStreets 能像谷歌一样解析不同的格式和语言吗?例如'Львів, вул。 Вірменська, 35' 目前我们只支持美国地址(无论它们是什么语言)。要进行处理,请求必须包含 街道地址 和 city/state/zip(这三个的任意组合)。如果您不能将它们分开,那么有 一种方法来处理地址,而无需分开不同的部分。 The algorithm for that is described here。请记住,虽然 Google 更灵活,但其目的却大不相同:近似地址,而不是验证地址。 更新:这里有点延迟,但您不再需要手动分隔单行地址的各个部分。 LiveAddress 为您完成。 SmartyStreets 是否支持反向地理编码(即经纬度 --> 街道地址)? @***user2010 目前,我们只是从地址进行转发地理编码。【参考方案2】:你看过Nominatim吗?您可以自己滚动OpenStreetMaps 数据,也可以向OpenStreetMaps 或MapQuest 发送请求。可能的缺点包括 CC 许可证(需要注明出处,对您来说可能是也可能不是问题)和验证问题(数据几乎完全是众包的,因此确实会发生不准确的情况)。优点包括限制较少的使用政策、频繁的更新、全球覆盖,当然还有您无法超越的价格。
见https://jsfiddle.net/4hzzrws5/
var Data =[
address: "17 rue de l'Abreuvoir. Nantilly. 28260 La Chaussée d'Ivry",
address: "52 rue Ernestine 95100 Argenteuil",
address: "3 allée Baudelaire 59139 Wattignies",
address: "165, Petit chemin d'aix 13320 Bouc Bel Air",
address: "54 avenue Yolande d'Aragon 49100 ANGERS",
address: "John Doe, Le Rouho Guidel 56520",
address: "51100",
address: "21 rue du Docteur Gallet - 74000 Annecy",
address: "4 Impasse des Cigales, 26500 Bourg lès Valence",
address: "83140 SIX FOURS LES PLAGES",
address: "35 cours Vitton 69006 Lyon",
address: "7 rue lallier 75009",
address: "Paul Michel, Villa Pétricciù,Ghjassu Pétricciù, 20221.CERVIONE"
]
var cityAndCountry = function(res)
var osmObj= res[0].address,
city=osmObj.town || osmObj.city || osmObj.county || '',
country=osmObj.country || '',
iso2 =osmObj.country_code || '';
var out = [ city, country, iso2];
return out
var latAndLon = function(res)
var lat= res[0].lat,
lon= res[0].lon;
var out = [lat,lon];
return out
var queryOsm = function(url)
$.getJSON(url, function (data)
data.length==0?
console.log(["","",""],data)
:console.log(cityAndCountry(data),latAndLon(data),data);
);
var delayedPing = function (i,data)
// console.log(i, data.length)
var d = data[data.length-i];
if(d.address)
// placeAddressOnMap(gc, d.address, d.service||"", d.customer||"")
var url = 'https://nominatim.openstreetmap.org/search/'+d.address+'?format=json&addressdetails=1&limit=1';
queryOsm(url)
else console.log(["","","",d.address])
var delay = 1000+200*Math.random();
if (--i > 0) setTimeout(function () delayedPing(i,data); , delay);
delayedPing(Data.length,Data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
【讨论】:
【参考方案3】:不,没有,如果您查看他们的许可,它明确旨在阻止您像这样使用他们的服务。基本上,你只打算在
的情况下使用它-
最终用户向 API 发起每个请求,并且
您的服务是免费的。
他们还禁止您将他们的服务结果保存/缓存到数据库。谷歌使用他们的工具可以很容易地进行原型制作,但是一旦你开始扩大规模,你就需要付费(在这方面与 M$ 没有太大区别)。
【讨论】:
【参考方案4】:以下选项可能适合您
-
GeoNames
Gisgraphy
GeoCoder
我直接与 Google 就 Google 地图许可问题进行了沟通。不幸的是,他们没有意识到由于成本而失去了巨大的市场份额。
【讨论】:
【参考方案5】:just try this YUI
使用限制
每个应用程序限制(由您的访问密钥标识):每天 100,000 次调用
每个 IP 限制:/v1/public/:每小时 1,000 次调用; /v1/yql/:每小时 10,000 次调用
ZIP / Postal Code + Country to Geo Coordinates
【讨论】:
以上是关于有没有办法进行批量地理编码(通过地址获取纬度/经度,反之亦然)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
python中的地理编码使用API密钥从地址获取纬度和经度