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

Reply via email to