Suite

Améliorer les performances de Clip en utilisant OGR ?


J'ai un ensemble de points que j'essaie d'attacher à un ensemble de polygones. Les fichiers ont de nombreuses fonctionnalités (150 000 polys, 8 000 points). J'aimerais automatiser ce processus et l'exécuter une fois par jour, j'utilise donc python/gdal/ogr pour scripter l'opération. Cependant, il est d'une lenteur prohibitive. Effectuer la même opération à l'aide de l'outil Clip dans ArcGIS donne des résultats en quelques minutes seulement ! Voici un appel ogr que j'ai essayé :

ogr2ogr -clipsrc polygone.shp clipped_output.shp points.shp

et il tourne depuis 5 heures. J'ai également essayé d'utiliser un fichier VRT en combinaison avec une instruction SQL pour compter le nombre de points tombant à l'intérieur des polygones en utilisant :

'ogrinfo -dialect SQLITE -sql "SELECT COUNT(*) FROM polygones, points WHERE ST_Intersects(polygon.geometry,points.geometry)" input.vrt'

Cela a également pris jusqu'à présent environ 5 heures sur une machine virtuelle avec beaucoup de RAM et de puissance de traitement. Y a-t-il d'autres techniques ou méthodes que je ne connais pas qui pourraient réduire le temps de calcul ? Ou est-ce que je rate juste quelque chose ?


je ne suis pas sûr des outils de ligne de commande ogr2ogr, bien que j'aie tendance à faire des processus similaires en utilisant ogr en python - quelque chose comme : (en supposant que ce sont des fichiers de formes)

from osgeo import ogr def ogrClip(polys, points, clipppedPoints): # vous n'êtes pas certain qu'un pilote distinct soit requis pour chaque fichier de formes ? shpdrv = ogr.GetDriverByName('ESRI Shapefile') polyDS = shpdrv.Open(polys) ptsDS = shpdrv.Open(points) polys = polyDS.GetLayer(0) pts = ptsD.GetLayer(0) clipDS = shpdrv.CreatePointLayer( , geom_type=ogr.wkbPoint) #créer les champs souhaités dans clipDS - un par exemple fieldDef=ogr.FieldDefn('myIntegerColumn',ogr.OFTInteger) clipDS.CreateField(fieldDef) # boucle à travers les polys ou les points et définit le filtre spatial # parfois j'inverse cet ordre pour tester la vitesse… pour poly dans polys: polygeom = poly.GetGeometryRef() pts.SetSpatialFilter(polygeom) for pt in pts: # vous pouvez effectuer une intersection ici pour être certain # les points se trouvent dans le polygone, mais les géométries simples # semblent fonctionner correctement sans newfeat = ogr.Feature(clipDS.GetLayerDefn()) newfeat.SetGeometry(pt.GetGeometryRef()) # je pense que cela fonctionnerait newfeat.SetField('myIntegerColumm', pt.GetField(' originalColumn')) #… etc. clipDS.CreateFeature(newfeat) newfeat = Aucun shpdrv = Aucun

Je n'ai pas testé cela pour le moment - mais j'espère que vous avez l'idée générale.


Si votre zone de découpage est petite compte tenu de l'ensemble de la zone vectorielle, vous pouvez réduire beaucoup de temps en utilisant --spat xmin ymin xmax ymax. Le seul problème est que vous devez calculer xmin ymin xmax ymax avant.

Ce sera quelque chose comme

ogr2ogr --spat xmin ymin xmax ymax -clipsrc polygon.shp clipped_output.shp points.shp


Voir la vidéo: Conseils pour débuter lentrainement en course à pied et plan entrainement (Octobre 2021).