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

文章讲述了在使用Python的cartopy库读取shapefile(.shp)文件时遇到的乱码问题。通过阿里云地图选择器获取正确编码的geojson数据,然后利用geopandas转换为shapefile文件,指定utf-8编码,从而解决了乱码问题。最后,展示了修正后的代码能够正常绘制地图。
摘要由CSDN通过智能技术生成

文章目录

问题

使用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())

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铃音.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值