[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.
Réponses:
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.
La géométrie doit être sortie comme suit:
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.
la source
Tout d'abord, utilisez ogr pour ouvrir le fichier de formes:
convertir des géométries de fichiers de formes en géométries galbées
Pour les polygones du multipolygone:
Et maintenant, vous pouvez utiliser toutes les fonctions de galbées ( galbées )
la source
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.
la source
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:
la source