utilisation galbée: conversion entre Polygones et MultiPolygons

12

[EDIT: la solution à cela était simplement d'utiliser OGR pour lire les fichiers de formes. Voir l'exemple de geographika.]

Dans un fichier de formes ESRI, il n'y a pas de distinction entre Polygones et MultiPolygons. De plus, il n'y a pas de distinction explicite entre les trous intérieurs et les anneaux extérieurs (en dehors de la "maniabilité" d'un polygone donné).

Donc, après avoir lu un fichier de formes, j'ai une liste de séquences de coordonnées décrivant les anneaux, mais sans un traitement plus intensif, je ne peux pas distinguer lesquels de ces anneaux sont des anneaux extérieurs, des trous intérieurs ou des polygones supplémentaires.

Il semble que pour bien faite « s constructeurs Polygon et MultiPolygon, il doit y avoir une distinction claire entre l' extérieur et anneaux intérieurs, comment dois - je passer d'une liste claire des anneaux à un ensemble ordonné de polygones séparés, avec des anneaux clairement intérieurs et extérieurs désignés ?

Pour résumer: si j'ai une liste d'anneaux de polygones, mais je ne sais pas quels anneaux sont des trous à l'intérieur ou des polygones séparés, comment dois-je les trier au mieux en polygones séparés avec des trous intérieurs désignés?

Je recherche une solution algorithmique simple que je peux implémenter en python, qui peut être utilisée pour traiter des centaines de polygones en ~ une minute ou moins, et je le fais pour effectuer un grand nombre d'intersections.

BenjaminGolder
la source
Cette question ne contient pas les informations cruciales sur ce que vous utilisez pour lire le Shapefile.
inc42
@ inc42 J'utilisais python pour lire le fichier directement.
BenjaminGolder
Ah, alors le bit Shapely est trompeur. Votre problème réel était de savoir comment déterminer le "type" de sonnerie au format Shapefile. :)
inc42

Réponses:

10

Suite à la réponse de relet sur la façon d'obtenir des polygones individuels, vous pouvez ensuite exécuter une intersection sur tous les polygones pour créer les trous. Si votre jeu de données contient des polygones qui se chevauchent, vous n'avez pas de chance.

Expliquez à nouveau ce qui ne va pas avec les lecteurs de fichiers de formes existants.

Ne serait-il pas plus facile d'exporter les ID d'entités et les valeurs M à partir du fichier de formes, puis de les joindre de nouveau aux polygones après avoir utilisé un lecteur de fichier de formes existant?

Pour les multipatchs, vous pouvez utiliser la même technique d'attribution d'ID de polygone à un "ID de patch", puis de rajouter cet attribut aux entités.

Edit: Alors que vous dites que vous ne voulez pas utiliser OGR, juste au cas où vous changeriez d'avis.

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

La géométrie doit être sortie comme suit:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

Le premier support contient les cordons de l'anneau extérieur, les crochets suivants les cordons des anneaux intérieurs. Si vous avez des valeurs Z, les points doivent être au format 79285 57742 10 (où la dernière coordonnée est une hauteur).

Sinon, vous pouvez utiliser les fonctions Shapely Contains et Within pour évaluer chaque polygone les uns avec les autres et appliquer un index spatial au préalable - http://pypi.python.org/pypi/Rtree/ pour accélérer le traitement.

geographika
la source
merci, ce n'est pas ce que je cherche, mais j'ai vu quelques précisions supplémentaires que je pourrais apporter à ma question. Pour répondre à vos questions: 1, parce que je les trie pour faire des tonnes d'intersections en premier lieu. 2, rien, j'en ai juste besoin d'un qui est léger et que je peux utiliser facilement depuis python, et je n'ai pas appris l'ogr. 3, non, ce ne serait pas plus facile dans ce cas.
BenjaminGolder,
1
Hou la la! Merci geographika! Je suis maintenant convaincu à 90% que l'ogr est la solution ici. J'ai rencontré des problèmes d'installation avec ogr, mais il semble qu'ils valent la peine d'être résolus. Alors ogr organise les anneaux dans sa sortie wkt? et est-ce bien avec les fichiers de formes 3D (j'utilise beaucoup de fichiers 3D)?
BenjaminGolder
Il semble que les réponses à mes questions soient oui et oui. Et merci de m'avoir présenté rtree. OGR semble résoudre entièrement mon problème - tant que je peux configurer correctement l'installation cette fois.
BenjaminGolder
Réinstallation d'OGR - n'oubliez pas que vous aurez besoin des binaires pour Windows et des liaisons Python correspondantes.
geographika
9

Tout d'abord, utilisez ogr pour ouvrir le fichier de formes:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

convertir des géométries de fichiers de formes en géométries galbées

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Pour les polygones du multipolygone:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

Et maintenant, vous pouvez utiliser toutes les fonctions de galbées ( galbées )

Constantinius
la source
1

Je ne sais pas trop comment les polygones sont réellement stockés dans les fichiers de formes, mais - un anneau polygonal ne devrait-il pas être une boucle fermée si et seulement si la coordonnée de début est répétée? Donc, si vous comparez chaque coordonnée suivante avec la coordonnée de départ, vous trouverez le premier point où un polygone est fermé. Si c'est la dernière coordonnée du polygone, c'est un polygone simple, sinon, c'est un multipolygone et nécessite de traiter les autres boucles.

C'est peut-être le `` traitement plus intensif '' que vous voulez éviter, mais ce n'est vraiment qu'une itération à travers les coordonnées qui est gratuite lorsque vous devez les lire de toute façon.

relouer
la source
Je m'excuse - ma question était un peu trompeuse et je l'ai modifiée. J'ai les anneaux polygonaux, et je sais quand j'ai une liste de plus d'un anneau polygonal, mais en dehors de l'ordre des points dans le sens horaire ou antihoraire, je ne sais pas s'il s'agit d'anneaux intérieurs ou extérieurs. S'il s'agit d'anneaux intérieurs, je n'ai aucun moyen de savoir à quel anneau extérieur ils appartiennent, à part mesurer leur emplacement.
BenjaminGolder
Je vois. Je suis également heureux de voir que vous avez trouvé votre chemin vers l'ogr. ;)
relouez le
-2

Comme indiqué par @ inc42 , à la page 8 de la description technique du fichier ESRI: un livre blanc ESRI - juillet 1998 (page 12 de 34 dans le PDF), il y a une discussion sur le contenu des enregistrements polygonaux qui peut être ce que vous recherchez:

Un polygone peut contenir plusieurs anneaux externes. L'ordre des sommets ou de l'orientation d'un anneau indique de quel côté de l'anneau se trouve l'intérieur du polygone.

PolyGeo
la source
p.10 dit: "Un polygone peut contenir plusieurs anneaux extérieurs. L'ordre des sommets ou l'orientation d'un anneau indique de quel côté de l'anneau se trouve l'intérieur du polygone."
inc42
@ inc42 a été mis à jour en conséquence, bien que je pense que le numéro de page devrait être 8 (ou 12 sur 34).
PolyGeo