> 文章列表 > 使用python的cartopy库读取shapefile文件 .shp文件是乱码

使用python的cartopy库读取shapefile文件 .shp文件是乱码

使用python的cartopy库读取shapefile文件 .shp文件是乱码

文章目录

    • 问题
    • 解决方法

问题

使用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'])

东城区
西城区
朝阳区
丰台区
使用python的cartopy库读取shapefile文件 .shp文件是乱码

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')

运行后会在对应目录生成四个文件
使用python的cartopy库读取shapefile文件 .shp文件是乱码
此时再执行代码

shp_path=r'/home/mw/project/北京市1.shp'#文件路径
reader=shapereader.Reader(shp_path)#读文件

使用python的cartopy库读取shapefile文件 .shp文件是乱码
问题解决!
可正常画出图

from cartopy.io import shapereader
import cartopy.crs as ccrs
import matplotlib.pyplot as pltfig=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())

使用python的cartopy库读取shapefile文件 .shp文件是乱码