文章目录
- 问题
- 解决方法
问题
使用python的cartopy库读取shapefile文件即.shp文件乱码
我在使用python的cartopy库读取shapefile文件时出现了乱码
record的.attributes的[‘name’]都是乱码
from cartopy.io import shapereader
shp_path=r'/home/mw/project/北京市1.shp'#文件路径
reader=shapereader.Reader(shp_path)#读文件
for record in reader.records(): #逐个文件读取
print(record.attributes['name'])
东城区
西城区
æœé˜³åŒº
丰å°åŒº
if record.attributes['name']=='门头沟区':#如果是门头沟区
ax.add_geometries([record.geometry],ccrs.PlateCarree(),
facecolor='r',#红色现实
edgecolor='black',
)
无法判断出乱码是不是门头沟区
解决方法
打开阿里云地图选择器工具:http://datav.aliyun.com/tools/atlas
打开后只要在左上角位置输入需要的行政区划范围名称,就可以快速获取到该范围的矢量底图数据。提供的获取方式有JSON API,也可以直接下载geojson或者svg格式。
如果直接下载了geojson格式的数据,会得到一个对应区域的 .json 文件
使用python 用 这个.json文件生成一个.shp,也就是shapefile文件,并且指定编码,问题即可解决。
import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd
from shapely import geometry
import os
data = gpd.read_file(r'北京市.json')
print(data)
data.to_file('北京市1.shp',
driver='ESRI Shapefile',
encoding='utf-8')
运行后会在对应目录生成四个文件
此时再执行代码
shp_path=r'/home/mw/project/北京市1.shp'#文件路径
reader=shapereader.Reader(shp_path)#读文件
问题解决!
可正常画出图
from cartopy.io import shapereader
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(8,6),dpi=200)
ax=fig.add_subplot(projection=ccrs.PlateCarree())
shp_path=r'/home/mw/project/北京市1.shp'#文件路径
reader=shapereader.Reader(shp_path)#读文件
for record in reader.records(): #逐个文件读取
print(record.attributes['name'])
if record.attributes['name']=='门头沟区':#如果是门头沟区
ax.add_geometries([record.geometry],ccrs.PlateCarree(),
facecolor='r',#红色现实
edgecolor='black',
)
else:
ax.add_geometries([record.geometry],ccrs.PlateCarree(),
facecolor='b',
edgecolor='black',
)
extent=[115,118,39,41.5]#局部现实
ax.set_extent(extent,ccrs.PlateCarree())