Suite

GDAL Python OGRFeature .GetGeometryRef vs .Clone().GetGeometryRef


Tout récemment, j'essayais d'obtenir la géométrie d'un polygone stockée dans un ESRI Shapefile. Dans le script, j'essayais de lire le polygone comme suit :

import ogr path = "shape.shp" ds = ogr.Open(path, 0) layer = ds.GetLayer() layer.GetFeature(0).GetGeometryRef().GetGeometryName()

ce qui a entraîné une erreur d'accès à la mémoire.

J'ai ensuite essayé ceci :

import ogr path = "shape.shp" ds = ogr.Open(path, 0) layer = ds.GetLayer() layer.GetFeature(0).Clone().GetGeometryRef().GetGeometryName()

Ce qui a fonctionné.

Pourquoi ça marche mais pas l'autre approche ? Lequel d'entre eux est « bon » ?


Le module osgeo n'est pas vraiment très "Pythonic" (liaisons Python générées par SWIG pour les librairies GDAL et OGR C/C++)

Votre première solution ne fonctionne pas. Pourquoi ?
Regardez segfault avec Clone() appelé sur GeometryRef of Feature

Il s'agit certainement d'un problème de portée variable. J'appellerais ça un bug, mais il ne sera pas corrigé de si tôt. Veuillez utiliser des appels de méthode plus détaillés pour vous assurer que les variables intermédiaires ne sortent pas de la portée.

Le journal du crash confirmant la remarque précédente est

Type d'exception : EXC_BAD_ACCESS (SIGSEGV) Codes d'exception : KERN_INVALID_ADDRESS à 0x00000000000000090

Par conséquent, cette solution plus détaillée fonctionne :

depuis osgeo import ogr ds = ogr.Open("test.shp") layer = ds.GetLayer(0) # première fonctionnalité feat = layer.GetFeature(0) geom = feat.GetGeometryRef() print geom.GetGeometryName() LINESTRING

Lorsque vous utilisezlayer.GetFeature(0).Clone()vous travaillez avec une copie de la fonctionnalité (différente) (OGRFeature * OGRFeature::Clone()) avec moins de problèmes.

C'est pourquoi Sean Gillies crée Fiona pour "simplifier" le port Python de la bibliothèque C/C++ ogr.

import fiona layer = fiona.open("test.shp") print layer.schema['geometry'] LineString # directement print fiona.open("test.shp").schema['geometry'] LineString


Voir la vidéo: How to Convert Coordinates from CSV to ESRI Shapefile (Octobre 2021).