Recently I've stumbled across this:
I needed to read DSID layer from S-57 chart, in particular DSID_CSCL "Feature"
(means chart's compilation scale), but since DSID layer is a meta-info layer,
features there lacks attached geometries.
So WorldMill just crashes (see Appendix).
With this patch I propose we extend Feature(id, properties, wkb) to allow wkb
to be None - that would mean "feature has no geometry attached."
Appendix
========
#!/usr/bin/env python
import mill
w = mill.workspace('data/RU5NTKT1.000')
dsid = w['DSID']
list(dsid.all) # this segfaults
--------
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7e048c0 (LWP 23905)]
0xb78f22b9 in OGR_G_WkbSize () from /usr/lib/libgdal1.5.0.so.1
(gdb) bt
#0 0xb78f22b9 in OGR_G_WkbSize () from /usr/lib/libgdal1.5.0.so.1
#1 0xb7fbe592 in __pyx_f_4mill_10collection_8Iterator__marshal_feature
(__pyx_v_self=0xb7d9f57c,
__pyx_v_cogr_feature=0x8838968, __pyx_v_fid=0) at src/mill/collection.c:1364
#2 0xb7fbcdb4 in __pyx_pf_4mill_10collection_8Iterator___next__
(__pyx_v_self=0xb7d9f57c)
at src/mill/collection.c:1086
#3 0x0807d929 in ?? ()
#4 0xb7d9f57c in ?? ()
#5 0xbfee483c in ?? ()
#6 0xb7d9f57c in ?? ()
#7 0xb7fbcd30 in ?? () from
/home/kirr/src/tools/gispy/WorldMill/src/mill/collection.so
#8 0xb7fc1480 in __pyx_type_4mill_10collection_Session ()
from /home/kirr/src/tools/gispy/WorldMill/src/mill/collection.so
#9 0xb7d9f57c in ?? ()
#10 0xbfee4858 in ?? ()
#11 0x08148ba0 in ?? ()
#12 0x08148ba0 in ?? ()
#13 0x00000000 in ?? ()
(gdb) f 1
#1 0xb7fbe592 in __pyx_f_4mill_10collection_8Iterator__marshal_feature
(__pyx_v_self=0xb7d9f57c,
__pyx_v_cogr_feature=0x8838968, __pyx_v_fid=0) at src/mill/collection.c:1364
1364 __pyx_v_wkbsize = OGR_G_WkbSize(__pyx_v_cogr_geometry);
(gdb) p __pyx_v_cogr_geometry
$1 = (void *) 0x0
--------
Here is `ogrinfo -ro data/RU5NTKT1.000 DSID`:
INFO: Open of `data/RU5NTKT1.000'
using driver `S57' successful.
Layer name: DSID
Geometry: None
Feature Count: 1
Extent: (29.661621, 59.903238) - (29.814396, 60.007962)
Layer SRS WKT:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
TOWGS84[0,0,0,0,0,0,0],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9108"]],
AXIS["Lat",NORTH],
AXIS["Long",EAST],
AUTHORITY["EPSG","4326"]]
DSID_EXPP: Integer (3.0)
DSID_INTU: Integer (3.0)
DSID_DSNM: String (0.0)
DSID_EDTN: String (0.0)
DSID_UPDN: String (0.0)
DSID_UADT: String (8.0)
DSID_ISDT: String (8.0)
DSID_STED: Real (11.6)
DSID_PRSP: Integer (3.0)
DSID_PSDN: String (0.0)
DSID_PRED: String (0.0)
DSID_PROF: Integer (3.0)
DSID_AGEN: Integer (5.0)
DSID_COMT: String (0.0)
DSSI_DSTR: Integer (3.0)
DSSI_AALL: Integer (3.0)
DSSI_NALL: Integer (3.0)
DSSI_NOMR: Integer (10.0)
DSSI_NOCR: Integer (10.0)
DSSI_NOGR: Integer (10.0)
DSSI_NOLR: Integer (10.0)
DSSI_NOIN: Integer (10.0)
DSSI_NOCN: Integer (10.0)
DSSI_NOED: Integer (10.0)
DSSI_NOFA: Integer (10.0)
DSPM_HDAT: Integer (3.0)
DSPM_VDAT: Integer (3.0)
DSPM_SDAT: Integer (3.0)
DSPM_CSCL: Integer (10.0)
DSPM_DUNI: Integer (3.0)
DSPM_HUNI: Integer (3.0)
DSPM_PUNI: Integer (3.0)
DSPM_COUN: Integer (3.0)
DSPM_COMF: Integer (10.0)
DSPM_SOMF: Integer (10.0)
DSPM_COMT: String (0.0)
OGRFeature(DSID):0
DSID_EXPP (Integer) = 1
DSID_INTU (Integer) = 5
DSID_DSNM (String) = RU5NTKT1.000
DSID_EDTN (String) = 3
DSID_UPDN (String) = 0
DSID_UADT (String) = 20030705
DSID_ISDT (String) = 20030705
DSID_STED (Real) = 3.000000
DSID_PRSP (Integer) = 1
DSID_PSDN (String) =
DSID_PRED (String) = 1.0
DSID_PROF (Integer) = 1
DSID_AGEN (Integer) = 420
DSID_COMT (String) =
DSSI_DSTR (Integer) = 2
DSSI_AALL (Integer) = 1
DSSI_NALL (Integer) = 2
DSSI_NOMR (Integer) = 3
DSSI_NOCR (Integer) = 0
DSSI_NOGR (Integer) = 1658
DSSI_NOLR (Integer) = 28
DSSI_NOIN (Integer) = 961
DSSI_NOCN (Integer) = 697
DSSI_NOED (Integer) = 899
DSSI_NOFA (Integer) = 0
DSPM_HDAT (Integer) = 2
DSPM_VDAT (Integer) = 24
DSPM_SDAT (Integer) = 3
DSPM_CSCL (Integer) = 12500
DSPM_DUNI (Integer) = 1
DSPM_HUNI (Integer) = 1
DSPM_PUNI (Integer) = 1
DSPM_COUN (Integer) = 1
DSPM_COMF (Integer) = 10000000
DSPM_SOMF (Integer) = 10
DSPM_COMT (String) =
So you can see, that Feature with FID=0 has no geometry.
Signed-off-by: Kirill Smelkov <[EMAIL PROTECTED]>
Cc: [EMAIL PROTECTED]
src/mill/collection.pyx | 13 ++++++++-----
1 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/mill/collection.pyx b/src/mill/collection.pyx
index 18cae42..fb66f8c 100644
--- a/src/mill/collection.pyx
+++ b/src/mill/collection.pyx
@@ -133,12 +133,15 @@ cdef class Iterator:
else:
props[name] = None
- # Marshal the OGR geometry
+ # Marshal the OGR geometry (if present)
cogr_geometry = ograpi.OGR_F_GetGeometryRef(cogr_feature)
- wkbsize = ograpi.OGR_G_WkbSize(cogr_geometry)
- string = PyString_FromStringAndSize(NULL, wkbsize)
- buffer = PyString_AsString(string)
- ograpi.OGR_G_ExportToWkb(cogr_geometry, 1, buffer)
+ if cogr_geometry != NULL:
+ wkbsize = ograpi.OGR_G_WkbSize(cogr_geometry)
+ string = PyString_FromStringAndSize(NULL, wkbsize)
+ buffer = PyString_AsString(string)
+ ograpi.OGR_G_ExportToWkb(cogr_geometry, 1, buffer)
+ else:
+ string = None
# The object hook protocol calls object_hook with three arguments
#
--
tg: (007a205..) t/feature-without-geometry (depends on: master)
_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community