BLAH BLAH BLAHBLAH BLAHBLAHBLAHBLAHBLAHBLAHBLAH
Tabel | Ingen fejl | Geometrifejl | SQL |
---|---|---|---|
Flader.tab | 2073 | 58 | SELECT count(*), st_isvalid(wkb_geometry), ST_GeometryType(wkb_geometry) gtype FROM tmp.flader GROUP BY st_isvalid,gtype order by st_isvalid asc |
Linjer.Tab | 180 | 0 | SELECT count(*), st_isvalid(wkb_geometry), ST_GeometryType(wkb_geometry) gtype FROM tmp.linier GROUP BY st_isvalid,gtype order by st_isvalid asc |
Punkter.Tab | 5428 | 0 | SELECT count(*), st_isvalid(wkb_geometry), ST_GeometryType(wkb_geometry) gtype FROM tmp.punkter GROUP BY st_isvalid,gtype order by st_isvalid asc |
Arbejdssted.Tab | 109 | 15 | SELECT count(*), st_isvalid(wkb_geometry), ST_GeometryType(wkb_geometry) gtype FROM tmp.arbejdssted GROUP BY st_isvalid,gtype order by st_isvalid asc |
I tabellen kan vi se, at det kun er nødvendigt at rette fejlene i tabellen Flader.Tab og Arbejdssted.Tab
Tabellen kan indlæses i en PostgreSQL database med følgende kommando i kommandprompten
ogr2ogr -f "postgresql" pg:"host=pg1.septima.dk user=martin dbname=herlev" Flader.TAB -lco SCHEMA=tmp -overwrite -lco OVERWRITE=YES
Inden vi påbegynder oprettelsen fejlbehæftede geometrier skal vi have et overblik over antal af fejl fordelt på geometrityper:
SELECT count(*), st_isvalid(wkb_geometry), ST_GeometryType(wkb_geometry) gtype
FROM tmp.flader
GROUP BY st_isvalid,gtype
order by st_isvalid asc
Hvilket giver følgende resultat:
count | st_isvalid | gtype |
---|---|---|
58 | f | ST_MultiPolygon |
2073 | t | ST_MultiPolygon |
Altså har vi, at tabellen som udgangspunkt kun indeholder geometrier af typen ST_MultiPolygon og af dem er der 58, der returnerer false i testen ST_Isvalid(). Dermed skal vi forsøge at finde en metode til at gøre geometrierne gyldige ved at udføre forskellige manipulationer af geometrierne.
Vi kan også undersøge, hvilke typer af fejl geometrierne indeholder
SELECT ST_IsValidReason(wkb_geometry) as aarsag,ogc_fid as id
FROM tmp.flader
WHERE not st_isvalid(wkb_geometry)
Ovenstående SQL forespørgsel giver følgende resultat (trunkeret)
aarsag | id |
---|---|
Self-intersection[715210.553283185 6181676.29453083] | 3 |
Self-intersection[715437.904062876 6180562.61435407] | 11 |
Self-intersection[713184.042703904 6183292.0187917] | 19 |
Ring Self-intersection[713269.156308728 6183466.97318024] | 18 |
-- | -- |
Vi kan se, at der er mange fejl af typerne self-intersection og Ring Self-intersection
PostGIS indeholder en indbygget funktion, som forsøger at gøre geometrierne uden at fjerne vertices
SELECT count(*),
st_isvalid(st_makevalid) st_isvalid,
ST_GeometryType(st_makevalid) geomtype
FROM (
SELECT st_makevalid(wkb_geometry)
FROM tmp.flader
) foo
GROUP BY st_isvalid, geomtype;
Vi kan se, at vi nu har gyldige geometrier, men at funktionen st_makevalid() har resulteret i at der nu er geometrityper, der ikke længere er af typen ST_MultiPolygon. Dem vil vi i det følgende forsøge at håndtere.
count | st_isvalid | geomtype |
---|---|---|
2099 | t | ST_MultiPolygon |
31 | t | ST_GeometryCollection |
1 | t | ST_MultiLineString |
Lad os starte med at oprette en ny tabel (tmp.flader_valid), hvor geometrierne er gyldige, men transformationen har medført nye geometrityper som ovenfor.
DROP TABLE IF EXISTS tmp.flader_valid;
CREATE TABLE tmp.flader_valid AS
SELECT ST_MakeValid(wkb_geometry), element, elementnavn, underelement, vedlniveau,
arealtype, arbejdsstednr
FROM tmp.flader;
Først finder vi den ene, som er blevet til en ST_MultiLineString
SELECT ST_Astext(wkb_geometry),*
FROM tmp.flader_valid
WHERE ST_GeometryType(wkb_geometry) ='ST_MultiLineString'
Og vi kan se at den har id 1222. Når vi åbner den i MapInfo/QGIS eller lign kan vi se, at der mangler et linie segment i den ene side, som desværre er blevet klippet af i processen. Derved er polygonen ikke længere en Closed Linestring
Vi retter denne geomtri ved at tilføje et ekstra punkt samme sted som startpunktet og derefter opretter vi en polygon af linegeomtrien.
Tabellen kan indlæses i en PostgreSQL database med følgende kommando i kommandprompten
ogr2ogr -f "postgresql" pg:"host=pg1.septima.dk user=martin dbname=herlev" Arbejdssted.TAB -lco SCHEMA=tmp -overwrite -lco OVERWRITE=YES