J'ai ramassé une copie du livre super méchant «Python Geospatial Development» d'Erik Westra ( lien Amazon ), et je travaille dessus. Actuellement, il m'apprend à charger des données côtières GSHHS à partir d'un fichier de formes dans une base de données PostGIS, en préparation de la construction d'une application Web géospatiale.
Mon problème est le suivant: lorsque j'essaie d'importer les données GSHHS dans PostGIS, elles sont rejetées car les polygones du littoral ne sont pas considérés comme «valides». Plus précisément, je reçois un message d'erreur décrivant certains (mais pas tous) des polygones du littoral comme étant des «anneaux non fermés».
Je comprends que cette erreur essaie de me dire que les premier et dernier points du polygone ne sont pas les mêmes. Cependant, ce n'est tout simplement pas vrai. J'ai examiné la représentation WKT de nombreux polygones, et ils sont corrects. Ils commencent et se terminent définitivement par la même coordonnée.
Les polygones sont extraits des fichiers de formes à l'aide de la bibliothèque OGR et exportent chaque entité surfacique vers WKT. J'ai essayé de reconstituer le polygone via Shapely et expérimenté avec WKB, mais en vain. J'ai été en mesure de charger les mêmes données dans PostGIS comme une table MULTIPOLYGON, en utilisant le chargeur de shp2pgsql.
Je me demandais si quelqu'un là-bas avait:
(a) peut-être utilisé le même livre, était coincé avec le même problème et avait la réponse pour moi?
(b) a rencontré un problème similaire et a trouvé une solution?
(c) à défaut, a-t-il des conseils sur les «meilleures pratiques» pour garantir une géométrie valide avant le chargement dans PostGIS?
MISE À JOUR: un collègue a suggéré que le problème des «anneaux non fermés» pourrait simplement être le symptôme d'un autre problème. Il est possible que ma configuration PostGIS / PostgreSQL ait des limites de taille (sur les transactions d'insertion, les paquets reçus, les chaînes de texte, etc.).
Comme j'utilise de très longs polygones WKT en entrée, PostGIS peut les couper trop tôt pour permettre à chaque polygone de se terminer. Je vais le tester demain, mais cela semble probable. Mon insert de frontières de pays n'acceptait que certains enregistrements et pas d'autres. De mémoire, les géométries acceptées étaient pour de petites nations insulaires comme Antigua (et avaient donc probablement de courtes représentations WKT).
Ainsi, cela pourrait devenir plus un thread d'administration de base de données PostGIS, plutôt qu'un thread de géométrie non valide.
Réponses:
J'ai regardé vos données et l'exemple de livre, le problème est qu'il y a trois polygones invalides dans les données qui sont traités dans le livre:
GSHHS_l_L1.shp
ID = 92-W
ID = 486-W
GSHHS_l_L2.shp
ID = 7333-W
Étant donné qu'il s'agit d'un exemple, il serait plus simple de supprimer ces polygones du jeu de données ou d'en ajouter simplement un si l'instruction dans votre code
la source