Suite

WriteOGR modifie les trous MultiPolygon


j'ai du mal à utiliserécrireOGRpour écrire des fichiers GeoJSON, lorsqu'il y a des objets MultiPolygon. Voici un exemple : je crée unSpatialPolygonsDataFrameobjet de GeoJSON, avec une seule entité composée de deux polygones. Lorsque j'exporte vers GeoJSON, le fichier écrit a une seule entité avec un polygone et un trou.

Pourquoi est-ce, et comment puis-je persuader writeOGR d'écrire deux polygones ?

# Créez SpatialPolygonsDataFrame avec une entité, deux polygones spdf <- readOGR(layer='OGRGeoJSON', verbose=FALSE, '{ "type": "FeatureCollection", "features": [{ "type": "Feature", "id " : 0, "properties": {"label":"CENTRAL"}, "geometry": { "type": "MultiPolygon", "coordinates": [[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0 ]]]] } }] }') # Lorsque j'enregistre et recharge cet objet, les coordonnées ont une longueur 1, # c'est-à-dire que l'entité est un polygone et un trou. fn <- tempfile() writeOGR(spdf, fn, layer="whatever", driver="GeoJSON") length(fromJSON(file=fn)$features[[1]]$geometry$coordinates)

J'utilise R 3.1.2 et rgdal 0.9.1 sur OSX Yosemite.

MISE À JOUR : Voici le fichier temporaire GeoJSON qui est créé. Comme vous pouvez le voir, le tableau de coordonnées a été modifié par rapport à l'original.

{ "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, " features": [ { "type": "Feature", "id": 0, "properties": { "label": "CENTRAL" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 102.0, 2.0 ], [ 102.0, 3.0 ], [ 103.0, 3.0 ], [ 103.0, 2.0 ], [ 102.0, 2.0 ] ], [ [ 100.0, 0.0 ], [ 100.0, 1.0 ], [ 101.0, 1.0 ], [ 101.0, 0.0 ], [ 100.0, 0.0 ] ] ] ] } } ] }

je n'ai pas trouvé le moyen d'obtenirécrireOGRtravailler - alors à la place, j'ai écrit le mienvers GeoJSONune fonction. Je ne collerai pas le code complet, mais le bit le plus utile est le suivant, pour un objetXde classe'Polygones':

require(maptools) require(rgeos) y <- maptools::checkPolygonsHoles(x) insideWhich <- as.numeric(strsplit(rgeos::createPolygonsComment(y),")[[1]]) plotOrder <- [email protected]

Par exemple, vous pourriez obtenir

plotOrder = c(3,5,4,1,2) insideWhich = c(4,3,0,0,0)

Cela signifie : "Tracer le polygone 4, puis 5, puis 1, puis 3, puis 2. De plus, le polygone 1 est un trou à l'intérieur de 4, et 2 est un trou à l'intérieur de 3." Les deux fonctionscheckPolygonesTrousetcreatePolygonsCommenttravailler ensemble pour calculer ces faits. Avec ces informations, le reste de la création d'un objet GeoJSON est assez simple.


Merci de suivre ce fil :

https://stat.ethz.ch/pipermail/r-sig-geo/2015-October/023609.html

comme les développeurs de rgdal ne lisent pas SO, le bogue affecte plusieurs pilotes, donc tout l'intérêt d'utiliser GDAL comme une interface unique pour tous les formats de données est vaincu en répartissant les efforts.

Le problème réside dans la façon dont les objets wkbtype MultiPolygon sont écrits via le système de classes OGR - rgdal (OGR_write.cpp pour ce wkbtype) peut ne pas le faire d'une manière qui convient à tous les pilotes et semble échouer sur ceux compatibles SFS.


Voir la vidéo: QGIS - - Simplify by Smooth vectorized polygon lines (Octobre 2021).