我正在使用 python 使用 Google App Engine 编写一个应用程序,并将一个大型维基百科列表转换为电子表格,然后将列表行输入到位置中。例如:http: //en.wikipedia.org/wiki/List_of_North_Carolina_state_parks,我需要将每个公园的名称转换为地址,我想它们不会准确,但只要它们几乎正确就可以了跟我一起好吧。
有什么办法可以在服务器端使用 python 来做到这一点吗?我知道 Google 的地理编码服务,但它都是用 javascript 完成的,而且速率有限。
有什么服务可以做到这一点吗?
更新:geopy 正是我所寻找的。我想知道处理多个结果的最佳方法是什么。这是我的尝试:
try:
place, (lat, lng) = g.geocode(title+", North Carolina")
except ValueError:
geocodespot = g.geocode(title+", North Carolina", exactly_one=False)
place, (lat, lng) = geocodespot[0]
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我想知道是否有更好的想法。
我已经成功设置了一个 Leaflet JS 地图,它使用 Google 地图地理编码器平移到地理编码地址。但我也尝试使用“map.fitBounds”从视口获取适当的缩放级别,但它似乎不起作用。我正在使用的代码是:
map.panTo([results[0].geometry.location.lat(),results[0].geometry.location.lng()]);
map.fitBounds([[results[0].geometry.viewport.southwest.lat(), results[0].geometry.viewport.southwest.lng()],[results[0].geometry.viewport.northeast.lat(), results[0].geometry.viewport.northeast.lng()]]);
Run Code Online (Sandbox Code Playgroud)
请参阅此处的示例:http ://chrismccreath.hostzi.com/geocode_test.html
我该如何修复它,以便它缩放到谷歌地图地理编码器结果返回的适当视口?
所以这似乎是一个奇怪的问题,但我有一个DataFrame带有地址的熊猫,我想对它进行地理编码,这样我就可以获得纬度和经度。
.apply()由于这个非常有用的线程(带有使用 geopy pandas 的坐标的新列),我的代码可以使用,但我的问题是所有开放 API 对每秒允许的请求数以及每天的请求数都有严格的限制。
我还没有找到任何方法来限制我的代码,以便符合 API 的限制。我的 DF 有 25K 行,但只有在创建最多 5 行的子集时,我才能成功进行地理编码。
我对 python 和 pandas 没有太多经验,但在 SAS 中,DATA 步骤一次迭代一行,因此我可以使用 sleep 命令来限制请求。使用 python/pandas 实现类似功能的最佳方法是什么?
编辑:所以根据到目前为止的答案,我想确认,我的代码将从: 更改
df_small['city_coord'] = df_small['Address'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude))
为:
df_small = df_clean[:5]
def f(x, delay=1):
# run your code
sleep(delay)
return geolocator.geocode(x)
df_small['city_coord'] = df_small['Address'].apply(f).apply(lambda x: (x.latitude, x.longitude))
Run Code Online (Sandbox Code Playgroud) 我正在尝试为一个国家/地区生成随机坐标
我用过这个库Faker
def geo_point():
"""make random cordinates"""
faker = factory.Faker('local_latlng', country_code = 'IN')
coords = faker.generate()
return (coords[1], coords[0])
Run Code Online (Sandbox Code Playgroud)
但问题是,它的坐标集非常有限,大约在 30-40 之间,我们至少需要 10,000 个坐标进行测试。
我尝试了一个简单的方法
def random_geo_cordinate():
"""make random geocordinates"""
x, y = uniform(-180,180), uniform(-90, 90)
return (y, x)
Run Code Online (Sandbox Code Playgroud)
但特定国家/地区只有 10-20 个坐标。
我发现通过 shape_files 我们可以生成很多参考文献,但在所有参考文献中,只有geom参数可用。
我找到了一种方法,可以通过 Geom 列检查这些坐标是否位于该国家/地区。
但在为一个国家生成随机坐标时我仍然缺少一些东西。
有没有什么简单直接的办法。
我正在使用
POST GIS Database
GeoDjango Server
Run Code Online (Sandbox Code Playgroud)
笔记:
我的Address类有一个geocode类方法,它返回一个地址对象数组,这些地址对象是通过对方法参数进行地理编码而得到的(如果地理编码导致完全匹配,则数组将有一个元素).
编写此方法的一个令人讨厌的部分是将GeoKit地址对象转换为我的地址对象(例如,"street_address" - >"address1").有一个更好的方法吗?
class Address < ActiveRecord::Base
def self.geocode(string)
return nil if string.nil?
results = Geokit::Geocoders::GoogleGeocoder.geocode(string)
address_objects = Array.new
results.all.each do |r|
params = Hash.new
params['address1'] = r.street_address
params['city'] = r.city
params['zipcode'] = r.zip
params['state'] = State.find_by_abbr(r.state)
params['country'] = Country.find_by_iso(r.country_code)
new_address = Address.new(params)
new_address.single_line_address = r.full_address
address_objects << new_address
end
return address_objects
end
end
Run Code Online (Sandbox Code Playgroud) 我已经看过关于如何进行反向地理编码的演示之后的API文档和演示 - 获取一个地址,给定一个Lat/Long位置.我需要做相反的事情.我假设这已经解决了问题,因为Apple的MapKit API完全避免了它.
我使用以下代码从用户输入获取lat和lng值.它似乎工作正常,直到最近.
if (status == google.maps.GeocoderStatus.OK) {
var lat = parseFloat(results[0].geometry.location.wa).toFixed(3);
var lng = parseFloat(results[0].geometry.location.xa).toFixed(3);
....
Run Code Online (Sandbox Code Playgroud)
现在,如果我控制台.log,results[0].geometry.location我得到(51.4793388, -2.5933342) { va=51.4793388, wa=-2.5933342}.
似乎xa已经改变了va.引用这些值的正确方法是什么?
openstreetmap响应中'importance'和'place_rank'字段的含义是什么?我在文档中的任何地方都找不到它:/
例如,此网址的响应:
http://nominatim.openstreetmap.org/search?q=135+pilkington+avenue,+birmingham&format=xml&polygon=1&addressdetails=1
Run Code Online (Sandbox Code Playgroud)
是:
<place place_id="62311100" osm_type="way" osm_id="90394480" place_rank="30" ...OMISSIS... importance="0.701">
在上面的回复中,我删除了所有我不感兴趣的XML部分.
这是JSON输出:我只想获取formatted_address值&long_name&short_name。我提到了人们已经问过的问题,但是我做错了。指:
{
"results" : [
{
"address_components" : [
{
"long_name" : "Jalan Sungai Chua",
"short_name" : "B11",
"types" : [ "route" ]
},
{
"long_name" : "Sungai Chua",
"short_name" : "Sungai Chua",
"types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
"long_name" : "Kajang",
"short_name" : "Kajang",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Selangor",
"short_name" : "Selangor",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Malaysia",
"short_name" : "MY",
"types" : [ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用R库Ggmap对地图进行地理定位.
location_google_10000 <- geocode(first10000_string, output = "latlon",
source = "dsk", messaging = FALSE)
Run Code Online (Sandbox Code Playgroud)
问题是我正在使用"dsk" - 数据科学工具包API-因此它没有速率限制为谷歌(限制为每天2500坐标).但是,当我尝试使用包含超过2500的向量运行时,它会弹出以下消息:
Error: google restricts requests to 2500 requests a day for non-business use.
Run Code Online (Sandbox Code Playgroud)
我尝试使用带有1000个地址的dsk运行代码,然后检查是否实际使用了google或dsk api:
> geocodeQueryCheck()
2500 geocoding queries remaining.
Run Code Online (Sandbox Code Playgroud)
所以出于某种原因,它不允许我使用超过2500与"dsk",但我相信它不使用谷歌.