Mais

Pontos de LinearRing não formam uma cadeia de linha fechada - intersecção de um ponto


Estou tentando indexar dados geojson usando elasticsearch.

Existem alguns tipos de polígonos que causam um erro: "Os pontos de LinearRing não formam uma cadeia de linha fechada".

Parece que isso acontece porque esses polígonos têm interseção em um ponto:

Existe alguma maneira de indexar esses polígonos ou corrigi-los programaticamente?


Aqui está um polígono simples que está tocando seu próprio anel em um ponto:

WKT do polígono é

POLYGON ((76 224, 84 224, 84 216, 78 216, 78 221, 79 219, 79 223, 78 221, 76 224))

PostGIS relata que este polígono não é válido:

selecione ST_IsValid (ST_GeomFromText ('POLYGON ((76 224, 84 224, 84 216, 78 216, 78 221, 79 219, 79 223, 78 221, 76 224))')) === f

A função ST_MakeValid corrige o polígono convertendo a "inversão" em um orifício que está tocando o anel externo:

selecione ST_AsText (ST_MakeValid (ST_GeomFromText ('POLYGON ((76 224, 84 224, 84 216, 78 216, 78 221, 79 219, 79 223, 78 221, 76 224))'))) "POLYGON ((76 224, 84 224,84 216,78 216,78 221,76 224), (78 221,79 219,79 223,78 221)) "

Se você estava usando PostGIS, a resposta à sua pergunta seria usar ST_MakeValid. A correção de shapefiles deve ser possível com o dialeto ogr2ogr e sqlite, mas apenas se GDAL for compilado com o Spatialite mais recente que suporta ST_MakeValid obtido da biblioteca LWGEOM https://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html . O uso seria então

ogr2ogr -f "arquivo de forma ESRI" corrigido.shp input.shp -dialect sqlite -sql "SELECT ST_MakeValid (geometria), attribute1, attribute2,… FROM input"