想要画出四川省边界并在边界内标出四川省大气环境监测站点点位,能请看看应该怎么改吗?
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方法。
您的报错行实际上是for sp in [Polygon(sp) for sp in xy ],遍历的sp,实则Polygon(sp)。报错“Polygon”没有lon属性。您用dir(Polygon)查看就可以,如用dir()函数查看str.isdigit()方法一样——
dir()查阅之后,就可以有针对性修改您的代码了。🧐🧐
回答:
首先需要获取四川省的地理边界数据,可以使用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'的问题,需要查看代码中具体的调用方法和变量名称,可能是因为使用了错误的变量名称或者调用方法不正确导致的,建议检查代码中的相关部分以解决问题。