【问题标题】:Plotting polygons with Folium and Geopandas don't work用 Folium 和 Geopandas 绘制多边形不起作用
【发布时间】:2022-01-25 14:43:02
【问题描述】:

我尝试使用 Geopandas official tutorialthis 数据集绘制多边形以与 Geopandas 和 Folium 进行映射。我尝试尽可能地按照本教程进行操作,但 Folium 仍然不绘制多边形。 Matplotlib 地图有效,我也可以创建 Folium 地图。代码:

import pandas as pd
import geopandas as gdp
import folium
import matplotlib.pyplot as plt

df = pd.read_csv('https://geo.stat.fi/geoserver/wfs?service=WFS&version=2.0.0&request=GetFeature&typeName=postialue:pno_tilasto&outputFormat=csv')
df.to_csv('coordinates.csv')

#limit to Helsinki and drop unnecessary columns 
df['population_2019'] = df['he_vakiy']
df['zipcode'] = df['postinumeroalue'].astype(int)
df['population_2019'] = df['population_2019'].astype(int)
df = df[df['zipcode'] < 1000]
df = df[['zipcode', 'nimi', 'geom', 'population_2019']]
df.to_csv('coordinates_hki.csv')
df.head()

#this is from there: https://gis.stackexchange.com/questions/387225/set-geometry-in-#geodataframe-to-another-column-fails-typeerror-input-must-be
from shapely.wkt import loads
df = gdp.read_file('coordinates_hki.csv')
df.geometry =  df['geom'].apply(loads)
df.plot(figsize=(6, 6))
plt.show()

df = df.set_crs(epsg=4326)
print(df.crs)
df.plot(figsize=(6, 6))
plt.show()

m = folium.Map(location=[60.1674881,24.9427473], zoom_start=10, tiles='CartoDB positron')
m

for _, r in df.iterrows():
    # Without simplifying the representation of each borough,
    # the map might not be displayed
    sim_geo = gdp.GeoSeries(r['geometry']).simplify(tolerance=0.00001)
    geo_j = sim_geo.to_json()
    geo_j = folium.GeoJson(data=geo_j,
                           style_function=lambda x: {'fillColor': 'orange'})
      
    folium.Popup(r['nimi']).add_to(geo_j)
    geo_j.add_to(folium.Popup(r['nimi']))                  
m

【问题讨论】:

    标签: pandas geopandas folium


    【解决方案1】:

    这里的诀窍是要意识到您的数据不是以度为单位的。您可以通过查看多边形的质心来确定这一点:

    >>> print(df.geometry.centroid)
    0     POINT (381147.564 6673464.230)
    1     POINT (381878.124 6676471.194)
    2     POINT (381245.290 6677483.758)
    3     POINT (381050.952 6678206.603)
    4     POINT (382129.741 6677505.464)
                       ...              
    79    POINT (397465.125 6676003.926)
    80    POINT (393716.203 6675794.166)
    81    POINT (393436.954 6679515.888)
    82    POINT (395196.736 6677776.331)
    83    POINT (398338.591 6675428.040)
    Length: 84, dtype: geometry
    

    这些值远大于地理空间数据的正常范围,经度为 -180 到 180,纬度为 -90 到 90。下一步是弄清楚它实际在哪个 CRS 中。如果你获取数据集 URL,并去掉 &amp;outputFormat=csv 部分,你会得到这个 URL:

    https://geo.stat.fi/geoserver/wfs?service=WFS&version=2.0.0&request=GetFeature&typeName=postialue:pno_tilasto
    

    在该文档中搜索 CRS,您会发现:

    <gml:Envelope srsName="urn:ogc:def:crs:EPSG::3067" srsDimension="2">
    

    所以,事实证明您的数据位于EPSG:3067,这是代表芬兰坐标的标准。

    你需要告诉geopandas这件事,并转换成WGS84(最常见的坐标系)以使其与folium兼容。

    df.geometry =  df['geom'].apply(loads)
    df = df.set_crs('EPSG:3067')
    df = df.to_crs('WGS84')
    

    函数set_crs()改变了GeoPandas期望数据所在的坐标系,但不改变任何坐标。函数to_crs() 获取数据集中的点并将它们重新投影到新的坐标系中。这两个调用的效果是从 EPSG:3067 转换为 WGS84。

    通过添加这两行,我得到以下结果:

    【讨论】:

    • 感谢您提供翔实的回答!不幸的是,代码仍然无法工作。我认为这与“几何”列本身有关。不知何故,Geopandas 制作了具有 WGS84 格式值的新“几何”列,而旧的“几何”列仍然存在旧值。当我在循环内尝试“print(sim_geo)”时,它说值是多边形,而不是多多边形。
    • @Ville 当我按照您的描述设置代码时,这有效:nbviewer.org/gist/nickodell/ac335d4eb645c0a97e25de3d6025fda9 我还附上了我正在使用的每个包的版本,以防有用。是否存在问题中没有的元素?
    • 是的,现在它工作了,谢谢!我的代码的倒数第二行也是错误的。
    猜你喜欢
    • 2022-01-19
    • 2022-10-07
    • 1970-01-01
    • 2022-08-14
    • 2020-02-13
    • 2016-06-01
    • 2013-08-14
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多