首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyshp读取shapefile:“错误: int太大,无法转换”

Pyshp读取shapefile:“错误: int太大,无法转换”
EN

Stack Overflow用户
提问于 2022-01-10 14:49:33
回答 2查看 79关注 0票数 1

后续从使用pysftp从SFTP读取SHP文件获得更多的上下文。

我正在尝试使用pyshp和pysftp读取一个shapefile并转换为一个GeoPandas geodataframe。在发生以下错误之前,这已成功地用于测试的所有文件。

代码:

代码语言:javascript
复制
from shapely.geometry import shape

r = shapefile.Reader(shp=shp, shx=shx, dbf=dbf)
fields = [field[0] for field in r.fields[1:]]

attributes = []
geometry = []

for row in r.shapeRecords():
     geometry.append(shape(row.shape.__geo_interface__))
     attributes.append(dict(zip(fields, row.record)))

错误:

代码语言:javascript
复制
~\miniconda3\lib\site-packages\shapefile.py in __shape(self)
   1039         record = Shape()
   1040         nParts = nPoints = zmin = zmax = mmin = mmax = None
-> 1041         (recNum, recLength) = unpack(">2i", f.read(8))
   1042         # Determine the start of the next record
   1043         next = f.tell() + (2 * recLength)

~\miniconda3\lib\site-packages\paramiko\file.py in read(self, size)

~\miniconda3\lib\site-packages\paramiko\sftp_file.py in _read(self, size)

~\miniconda3\lib\site-packages\paramiko\sftp_client.py in _request(self, t, *arg)

~\miniconda3\lib\site-packages\paramiko\sftp_client.py in _async_request(self, fileobj, t, *arg)

~\miniconda3\lib\site-packages\paramiko\message.py in add_int64(self, n)

error: int too large to convert

是否有一种方法可以转换此int或以块形式执行此操作以避免错误?导致错误的文件不是特别大(<2MB)。

EN

回答 2

Stack Overflow用户

发布于 2022-01-11 17:29:19

问题似乎是如何处理shapefile中的空几何图形。

虽然我不完全理解为什么这会引起问题,但根据文档(这里),pyshp“处理没有和弦的形状,并表示为geojson (GeoJSON null-等效)”。

当将记录添加到“属性”和“几何学”列表时,跳过空geoms似乎修复了错误:

代码语言:javascript
复制
 fields = [field[0] for field in r.fields[1:]]
        
 attributes = []
 geometry = []

 for row in r.shapeRecords():
      if row.shape.shapeType == 0:
           continue
      else:
           geometry.append(shape(row.shape.__geo_interface__))
           attributes.append(dict(zip(fields, row.record)))

不是最令人满意的解决方案,但可能是有用的,或可能有人能够详细阐述。

票数 1
EN

Stack Overflow用户

发布于 2022-01-10 15:00:38

这可能是由于可变交叉系统的最大尺寸。检查sys max大小与可变大小之间的关系。

代码语言:javascript
复制
import sys
sys.maxsize

我的输出

代码语言:javascript
复制
9223372036854775807

检查可变大小

代码语言:javascript
复制
import sys
sys.getsizeof(r)

为了解决这个问题。请将变量类型声明为int64。

代码语言:javascript
复制
dtype=variable.int64

如果这个错误没有解决,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70654269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档