地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇

Posted

技术标签:

【中文标题】地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇【英文标题】:Geocoding returns wrong town when applied to dataframe - returns correct one when applied to text 【发布时间】:2021-10-31 19:55:35 【问题描述】:

我有一个愚蠢的问题:我正在尝试对德国的几个城镇进行地理编码,这些城镇的名称存储在数据框中的一列中。编码适用于所有城镇,除了一个:明斯特。

我的数据框看起来像这样(在此处粘贴有趣的部分):

68  1034291939  Lüneburg        2010    330       (Lüneburg, Niedersachsen, Deutschland, (53.248...
69  1003394345  Kassel          2010    330       (Kassel, Niestetal, Hessen, Deutschland, (51.3...
70  100975873X  Magdeburg       2010    330.157   (Magdeburg, Sachsen-Anhalt, Deutschland, (52.1...
71  1191280594  Ludwigsburg     2010    340       (Ludwigsburg, Landkreis Ludwigsburg, Baden-Wür...
72  1010526499  Potsdam         2010    338.947   (Potsdam, Brandenburg, Deutschland, (52.400930...
73  1008154156  Duisburg        2010    658.72    (Duisburg, Nordrhein-Westfalen, Deutschland, (...
74  1011028336  Münster         2010    330       (Munster, Éire / Ireland, (52.307621600000004,...
75  1008507016  Jena            2010    338.04    (Jena, Thüringen, Deutschland, (50.9281717, 11...

如您所见,数据框中的其他城镇名称包含特殊字符,例如“ü”(“Lüneburg”),不会导致任何问题,但明斯特(无论出于何种原因)被地理编码为爱尔兰的明斯特.作为记录,我使用以下代码对城镇名称进行地理编码:

df_geo['geo_code'] = df_short.Ort.apply(geocode)

我已尝试检查这是否是数据库的一般问题,但如果我运行 location = geocode('Münster') 它返回 Münster, Nordrhein-Westfalen, Deutschland 就好了。我现在完全不知道为什么当我将它应用于数据框时它不起作用。我认为这可能是 ü 的问题,但是我从中读取数据的表是用 utf-8 编码的,并且当我打开它时(例如在 Excel 中)正确显示 ü。有谁知道问题可能是什么以及我该如何解决?在对数据帧运行地理编码之前,我是否需要对数据进行不同的编码或解码?

编辑:编辑数据框以便更容易发现不同的列

Edit2:为了解决这个问题,我现在尝试提取位置名称并将它们转储到一个列表中,然后通过地理编码器循环运行该列表,但我仍然遇到同样的问题:所有名称都正确转换,除了 Münster,它总是被编码为 Munster, Ireland。我尝试了以下代码:

for entry in places: 
    location = geocode(places)
    print(location)

此外,我随后再次尝试对字符串进行地理编码,突然间,明斯特也转向了明斯特。有趣的是,我现在发现,使用 " " 作为字符串与 ' ' 之间似乎存在差异:

location = geocode("Münster")
print(location)
location2 = geocode('Münster')
print(location2)

返回:

Munster, Éire / Ireland
Münster, Nordrhein-Westfalen, Deutschland

这是为什么呢?所以我现在认为问题在于,当我使用变量(位置)时,它会以某种方式将代码视为双引号,而我需要将其视为单引号。我该如何改变呢?我想将所有名称转换为字符串并不能真正解决问题(因为它们已经是字符串)并且会不必要地复杂......

【问题讨论】:

不是因为330移位了吗?我的意思是这是巧合吗?尝试改变它的位置或手动修改坐标。 330 不是地理编码使用的列的一部分,它位于单独的列中。 我现在什至尝试将字符串包装成单引号,虽然这在直接使用字符串时有效,但一旦我将其解析为变量,它仍然不起作用。老实说,我不明白这一点。 【参考方案1】:

所以,经过多次反复试验,我终于发现底层编码存在问题。我添加了以下代码,现在地理编码运行顺利,并将“Münster”翻译成德国的 Münster。

def normalize(text): 
    new = unicodedata.normalize('NFC', text)
    return new 

df_geo['Ort'] = df_geo['Ort'].apply(normalize)

places = df_geo['Ort'].tolist()

for entry in places: 
    location = geocode(entry)
    print(location)

【讨论】:

以上是关于地理编码在应用于数据框时返回错误的城镇 - 在应用于文本时返回正确的城镇的主要内容,如果未能解决你的问题,请参考以下文章

我可以按城镇限制谷歌地理编码器结果吗?

从地理编码纬度和经度获取地址

地理数据编码(国家/地区/城市的标准代码)

如何让用户选择他们的城镇,所以我的应用程序可以知道坐标

pygeocoder 返回错误的地理编码

使用地名进行弹性搜索的地理定位(地理编码)