只有每5个形状有效读取shapefile

时间:2012-04-27 19:27:37

标签: python shapefile

我在佛罗里达州有一个干洗设施的形状文件。我正在使用shapefile.py在Python中读取该文件。我的问题是,虽然文件中的第一个形状显示正确,但之后只有每个第5个形状都是正确的。使用无效的类型代码(应该在0到31之间)并且没有点信息来提取连续的四个形状。以下是结果的一部分:

Site Name (.record[1])               .shapeType  .points
------------------------------------ ----------- --------------------
Granda Dry Cleaners                  21          [[783897.335, 215901.765]]
Scotch Dry Cleaners                  1093131927  []
J C Cleaners                         -1191051264 []
Royal Palm Cleaners                  -1606317767 []
Moorings Plaza Dry Cleaners          1091081765  []
Classic Touch Cleaners               21          [[778662.429, 221265.968]]
The Drycleaner                       1093095627  []
Randolphs Alterations & Dry Cleaner  -1140719616 []
Pelican French Cleaners              1580547967  []
Town & Country Cleaners              1091080779  []
Discount Dryclean Outlet             21          [[768035.181, 188652.929]]
The Drycleaner Cleaners              1093104359  []
Sample Cleaners                      -1090387968 []
Parisian Cleaners                    -1468878813 []
Roberts Cleaners & Tailors           1091022843  []

(注意:我稍微降低了点上的精度,使它们适合一条线)。

模式在我看来是正常的 - 一个“有效”记录,后跟四个记录,其中shapeType常量无效,没有点。

我是shapefile处理的新手。这些结果是否表明我可能做错了什么?

更新

以下代码演示了该问题(它打印了上述shapeType和points列):

from shapefile import Reader)
rdr = Reader('drycleaner_list')
for s in rdr.shapes():
   print s.shapeType, s.points

1 个答案:

答案 0 :(得分:0)

首先,您需要确定问题是否与shapefile有关。尝试使用真正的GIS工具(如QuantumGIS)加载文件。一旦确定您的SHP文件正确无误,请发布您的代码,以便我们了解您如何使用shapefile.py。我的猜测是SHP文件在某种程度上是不正确的,并且Quantum GIS要么修复它,要么告诉你什么是错误的。奖励:QuantumGIS已将python作为插件开发工具嵌入。

修改 我从佛罗里达州DEP下载了文件dryclean_apr12.shp。根据dbf数据,有1423条记录。当我使用你的代码片段时,我得到1423个形状,所有shapetype = 1表示每个形状都是单个点。

因此,您的代码是正确的,问题必须与文件有关。

我在样本数据中注意到shapetype是21或PointM,定义为

位置字段值类型编号顺序

Byte 0 Shape Type 21 Integer 1 Little
Byte 4 X X Double 1 Little
Byte 12 Y Y Double 1 Little
Byte 20 M M Double 1 Little

Point定义为

Position Field Value Type Number Order
Byte 0 Shape Type 1 Integer 1 Little
Byte 4 X X Double 1 Little
Byte 12 Y Y Double 1 Little

Shapefile已损坏或shapefile.py中存在错误。

PointM的Shapefile的布局为

IDDD
IDDD
IDDD
IDDD
IDDD
IDDD

如果Shapefile将其读作Point(IDD)

然后该文件被读为

IDD      Rec 1 Read OK
did      Rec 2 Error on Type
ddi      Rec 3 error on Type
ddd      Rec 4 error on Type
IDD      Rec 5 Read OK