'Polygon' object has no attribute 'lon'这个该怎么改呢?

想要画出四川省边界并在边界内标出四川省大气环境监测站点点位,能请看看应该怎么改吗?


import shapefile as sf
from shapely.geometry import Point, Polygon
import numpy as np

f=sf.Reader('./province.shp',)

name=[]
for i in range(925):
    name.append(f.records()[i][6])

name=list(set(name))

name=name[1:]

name

proXY=[]
for n in name:
    proXY.append([f.shapes()[i].points for i,j in enumerate(f.records()) if j[6]==n])
    
proSP=[]
for xy in proXY:
    proSP.append([Polygon(sp) for sp in xy ])

mask=np.ones((72,124),)
for sp in proSP[0]:
    for i,(sp.lonR,sp.latR) in enumerate(zip(sp.lon,sp.lat)):
        for j,(sp.lonP,sp.latP) in enumerate(zip(sp.lonR,sp.latR)):
            if sp.contains(Point(sp.lonP,sp.latP)):
                msk[i,j]=0.0
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_16284\1032237836.py in <module>
      1 mask=np.ones((72,124),)
      2 for sp in proSP[0]:
----> 3     for i,(sp.lonR,sp.latR) in enumerate(zip(sp.lon,sp.lat)):
      4         for j,(sp.lonP,sp.latP) in enumerate(zip(sp.lonR,sp.latR)):
      5             if sp.contains(Point(sp.lonP,sp.latP)):

AttributeError: 'Polygon' object has no attribute 'lon'

proSP[0][0]

检查您的sp对象的类型,确定其有lon方法,您第三行才可以正常调用lon方法。


  • 您报错行的属性调用

    img


  您的报错行实际上是for sp in [Polygon(sp) for sp in xy ],遍历的sp,实则Polygon(sp)。报错“Polygon”没有lon属性。您用dir(Polygon)查看就可以,如用dir()函数查看str.isdigit()方法一样——

  • 可以看到,str.isdigit()方法是存在的

    img

  dir()查阅之后,就可以有针对性修改您的代码了。🧐🧐


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    首先需要获取四川省的地理边界数据,可以使用GeoJSON格式的数据,这里提供一个下载链接:https://gitee.com/crazycoder2021/data/raw/main/sc.geojson

    然后需要将GeoJSON文件中的边界数据绘制在地图上,可以使用Python中的Folium库来实现,具体步骤如下:

    1.安装Folium库

    pip install folium
    

    2.读取GeoJSON文件中的边界数据

    import json
    
    with open('sc.geojson') as f:
        geojson_data = json.load(f)
    

    3.创建地图对象

    import folium
    
    m = folium.Map(location=[30.67, 104.06], zoom_start=7)
    

    4.将GeoJSON数据添加到地图上

    folium.GeoJson(geojson_data).add_to(m)
    

    5.读取大气环境监测站点数据

    可以在国家环境监测总站官网上下载相应的数据,这里提供一个下载链接:http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp

    6.将监测站点数据添加到地图上

    import pandas as pd
    
    df = pd.read_csv('monitor.csv')
    for index, row in df.iterrows():
        folium.Marker(location=[row['lat'], row['lon']], popup=row['name']).add_to(m)
    

    完整的代码如下:

    import json
    import folium
    import pandas as pd
    
    # 读取GeoJSON文件中的边界数据
    with open('sc.geojson') as f:
        geojson_data = json.load(f)
    
    # 创建地图对象
    m = folium.Map(location=[30.67, 104.06], zoom_start=7)
    
    # 添加边界数据到地图上
    folium.GeoJson(geojson_data).add_to(m)
    
    # 读取监测站点数据
    df = pd.read_csv('monitor.csv')
    
    # 添加监测站点到地图上
    for index, row in df.iterrows():
        folium.Marker(location=[row['lat'], row['lon']], popup=row['name']).add_to(m)
    
    # 显示地图
    m
    

    其中,'sc.geojson'为存储四川省边界数据的文件,'monitor.csv'为存储大气环境监测站点数据的CSV文件,包含监测站点名称、经纬度等信息。代码运行完成后,将在浏览器中显示地图,并且监测站点将以标记的形式显示在地图上。

    关于'Polygon' object has no attribute 'lon'的问题,需要查看代码中具体的调用方法和变量名称,可能是因为使用了错误的变量名称或者调用方法不正确导致的,建议检查代码中的相关部分以解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^