ppa = (POINTARRAY**) lwalloc(sizeof(POINTARRAY*));
ppa[0] = parse_kml_coordinates(xb->children, hasz);
- if (ppa[0]->npoints < 4
- || (!*hasz && !ptarray_is_closed_2d(ppa[0]))
- || (*hasz && !ptarray_is_closed_3d(ppa[0])))
+ if (ppa[0]->npoints < 4)
lwpgerror("invalid KML representation");
+
+ if ((!*hasz && !ptarray_is_closed_2d(ppa[0])) ||
+ ( *hasz && !ptarray_is_closed_3d(ppa[0])))
+ {
+ POINT4D pt;
+ getPoint4d_p(ppa[0], 0, &pt);
+ ptarray_append_point(ppa[0], &pt, LW_TRUE);
+ lwpgnotice("forced closure on an un-closed KML polygon");
+ }
}
}
sizeof(POINTARRAY*) * (ring + 1));
ppa[ring] = parse_kml_coordinates(xb->children, hasz);
- if (ppa[ring]->npoints < 4
- || (!*hasz && !ptarray_is_closed_2d(ppa[ring]))
- || (*hasz && !ptarray_is_closed_3d(ppa[ring])))
+ if (ppa[ring]->npoints < 4)
lwpgerror("invalid KML representation");
+ if ((!*hasz && !ptarray_is_closed_2d(ppa[ring])) ||
+ ( *hasz && !ptarray_is_closed_3d(ppa[ring])))
+ {
+ POINT4D pt;
+ getPoint4d_p(ppa[ring], 0, &pt);
+ ptarray_append_point(ppa[ring], &pt, LW_TRUE);
+ lwpgnotice("forced closure on an un-closed KML polygon");
+ }
+
ring++;
}
}
-- ERROR: In exterior ring: Last point is not the same as the first one
SELECT 'polygon_2', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2 3,4 5,6 1,3</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon>'));
--- ERROR: In exterior 3D ring: Last point is not the same as the first one in Z
+-- FORCE CLOSE: In exterior 3D ring: Last point is not the same as the first one in Z
SELECT 'polygon_3', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2,3 4,5,6 7,8,9 1,2,0</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon>'));
--- ERROR: Only 3 points in exterior ring
+-- FORCE CLOSE: Only 3 points in exterior ring
SELECT 'polygon_4', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2 3,4 1,2</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon>'));
-- ERROR: Empty exterior ring coordinates
-- ERROR: Only 3 points in interior ring
SELECT 'polygon_12', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2 3,4 5,6 1,2</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs><kml:innerBoundaryIs><kml:LinearRing><kml:coordinates>7,8 9,10 7,8</kml:coordinates></kml:LinearRing></kml:innerBoundaryIs></kml:Polygon>'));
--- ERROR: In interior ring: Last point is not the same as the first one
+-- FORCE CLOSE: In interior ring: Last point is not the same as the first one
SELECT 'polygon_13', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2 3,4 5,6 1,2</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs><kml:innerBoundaryIs><kml:LinearRing><kml:coordinates>7,8 9,10 11,12 7,9</kml:coordinates></kml:LinearRing></kml:innerBoundaryIs></kml:Polygon>'));
--- ERROR: In interior 3D ring: Last point is not the same as the first one in Z
+-- FORCE CLOSE: In interior 3D ring: Last point is not the same as the first one in Z
SELECT 'polygon_14', ST_AsEWKT(ST_GeomFromKML('<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>1,2,3 4,5,6 7,8,9 1,2,3</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs><kml:innerBoundaryIs><kml:LinearRing><kml:coordinates>10,11,12 13,14,15 16,17,18 10,11,0</kml:coordinates></kml:LinearRing></kml:innerBoundaryIs></kml:Polygon>'));
-- 3 rings
ERROR: invalid KML representation
linestring_5|SRID=4326;LINESTRING(1 2,3 4)
polygon_1|SRID=4326;POLYGON((1 2,3 4,5 6,1 2))
-ERROR: invalid KML representation
-ERROR: invalid KML representation
+NOTICE: forced closure on an un-closed KML polygon
+polygon_2|SRID=4326;POLYGON((1 2,3 4,5 6,1 3,1 2))
+NOTICE: forced closure on an un-closed KML polygon
+polygon_3|SRID=4326;POLYGON((1 2 3,4 5 6,7 8 9,1 2 0,1 2 3))
ERROR: invalid KML representation
ERROR: invalid KML representation
ERROR: invalid KML representation
polygon_10|SRID=4326;POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8))
polygon_11|SRID=4326;POLYGON((1 2,3 4,5 6,1 2))
ERROR: invalid KML representation
-ERROR: invalid KML representation
-ERROR: invalid KML representation
+NOTICE: forced closure on an un-closed KML polygon
+polygon_13|SRID=4326;POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 9,7 8))
+NOTICE: forced closure on an un-closed KML polygon
+polygon_14|SRID=4326;POLYGON((1 2 3,4 5 6,7 8 9,1 2 3),(10 11 12,13 14 15,16 17 18,10 11 0,10 11 12))
polygon_15|SRID=4326;POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8),(13 14,15 16,17 18,13 14))
multi_7|SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),POLYGON((7 8,9 10,11 12,7 8)))
multi_8|SRID=4326;GEOMETRYCOLLECTION EMPTY