请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 17806|回复: 12

[求助] python运行shp文件时编码报错

[复制链接]

新浪微博达人勋

发表于 2021-8-19 11:24:14 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 蔡小亦 于 2021-8-23 13:29 编辑

已破案:
同事给的shp有问题(原来版本的分镇有误,同事自行修改,我读取就报错)
但没有找到为何其他人可正常运行的原因。
anyway,感谢大神edwardli 悉心指导

———————————我是分割线—————————————

请问一下各位大佬:我按照“云台书吏”的教程画本地气象要素分布图。代码如下:
import numpy as np
import cartopy.crs as ccrs
import cartopy.feature as cfeat
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.io.shapereader import Reader
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

shp_path=r'D:\python\data\东莞.shp'

proj= ccrs.PlateCarree()  # 简写投影
fig = plt.figure(figsize=(4, 4), dpi=400)  # 创建画布
ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  # 创建子图

extent=[113,115,22.5,23.5]#限定绘图范围
reader = Reader(shp_path)
enshicity = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='k', facecolor='none')
ax.add_feature(enshicity, linewidth=0.7)#添加市界细节
ax.set_extent(extent, crs=proj)

但在运行的时候报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 0: invalid continuation byte”

问题:
1、我尝试了贴吧里的改“shapefile.py”的解决方法,依然不行;
2、把代码发给朋友,他运行之后完全正常,见附图。

实在不知道如何解决,求大神指导。











微信图片_20210819112345.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-8-19 16:41:59 | 显示全部楼层
notepad++安装了吧?把这个shp文件用notepad++打开,右下角状态栏可以看到编码方式
然后传递这个编码方式到reader中,例如
reader = Reader(china_city, encoding=“GBK”)
reader = Reader(china_city, encoding=“ANSI”)

另外,添加shp信息可参照此,把所有几何形状做成一个list,而非直接转为cartopyfeature对象之示例
shpriver=r'shp\hyd1_4l.shp'
adm1_shapes1=list(shpreader.Reader(shpriver).geometries())
ax.add_geometries(adm1_shapes1[:],ccrs.PlateCarree(),edgecolor='b',facecolor='None',linewidth=0.8)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-8-19 19:04:30 | 显示全部楼层
感谢大神回复!

编码方式是ANSI,我尝试了
reader = Reader(shp_path,encoding = 'ANSI')

但还是报错:
TypeError: __init__() got an unexpected keyword argument 'encoding'

查看了Reader() 只能传递文件名的。不知道是不是我操作有误?

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-19 21:33:27 | 显示全部楼层
蔡小亦 发表于 2021-8-19 19:04
感谢大神回复!

编码方式是ANSI,我尝试了

shapereader.py (备份后)修改
class BasicReader:
    """
    Provide an interface for accessing the contents of a shapefile.

    The primary methods used on a Reader instance are
    :meth:`~Reader.records` and :meth:`~Reader.geometries`.

    """
    def __init__(self, filename,encoding=“utf-8”):
        # Validate the filename/shapefile
        self._reader = reader = shapefile.Reader(filename,encoding=encoding)
        if reader.shp is None or reader.shx is None or reader.dbf is None:
            raise ValueError("Incomplete shapefile definition "
                             "in '%s'." % filename)

        self._fields = self._reader.fields
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-8-20 07:28:42 | 显示全部楼层
谢谢。
我修改后,在 import 各模块的时候就报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 2218: invalid start byte

原来是OLDLee大神,之前还看过你的可视化系列视频呢。加了您QQ,非常感谢呀。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-20 08:47:21 | 显示全部楼层
楼主,最后是如何解决的啊
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-8-20 09:24:53 | 显示全部楼层
学而不厌 发表于 2021-8-20 08:47
楼主,最后是如何解决的啊

还在处理,等解决了我把方案写出来。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-24 15:09:55 | 显示全部楼层
shapefile.py
  return v.decode('latin-1', encodingErrors)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-25 09:19:43 | 显示全部楼层
蔡小亦 发表于 2021-8-20 09:24
还在处理,等解决了我把方案写出来。

楼主加油,期待你的解决方案
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-8-25 11:16:35 | 显示全部楼层
pip install pyshp==1.2.12
别搞什么花里胡哨的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表