-- -- GeomFromKML regression test -- Written by Olivier Courtin - Oslandia -- -- -- spatial_ref_sys datas -- -- EPSG 4326 : WGS 84 INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs '); -- Empty Geometry SELECT 'empty_geom', ST_AsEWKT(ST_GeomFromKML(NULL)); -- -- XML -- -- ERROR: Empty String SELECT 'xml_1', ST_AsEWKT(ST_GeomFromKML('')); -- ERROR: Not well formed XML SELECT 'xml_2', ST_AsEWKT(ST_GeomFromKML('')); -- ERROR: Not a KML Geometry SELECT 'xml_3', ST_AsEWKT(ST_GeomFromKML('')); -- -- Point -- -- 1 Point SELECT 'point_1', ST_AsEWKT(ST_GeomFromKML('1,2')); -- ERROR: 2 points SELECT 'point_2', ST_AsEWKT(ST_GeomFromKML('1,2 3,4')); -- ERROR: empty point SELECT 'point_3', ST_AsEWKT(ST_GeomFromKML('')); -- -- LineString -- -- 2 Points SELECT 'linestring_1', ST_AsEWKT(ST_GeomFromKML('1,2 3,4')); -- ERROR 1 Point SELECT 'linestring_2', ST_AsEWKT(ST_GeomFromKML('1,2')); -- ERROR: empty coordinates SELECT 'linestring_3', ST_AsEWKT(ST_GeomFromKML('')); SELECT 'linestring_4', ST_AsEWKT(ST_GeomFromKML('')); -- XML not elements handle SELECT 'linestring_5', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4')); -- -- Polygon -- -- 1 ring SELECT 'polygon_1', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,2')); -- ERROR: In exterior ring: Last point is not the same as the first one SELECT 'polygon_2', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,3')); -- ERROR: In exterior 3D ring: Last point is not the same as the first one in Z SELECT 'polygon_3', ST_AsEWKT(ST_GeomFromKML('1,2,3 4,5,6 7,8,9 1,2,0')); -- ERROR: Only 3 points in exterior ring SELECT 'polygon_4', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 1,2')); -- ERROR: Empty exterior ring coordinates SELECT 'polygon_5', ST_AsEWKT(ST_GeomFromKML('')); SELECT 'polygon_6', ST_AsEWKT(ST_GeomFromKML('')); SELECT 'polygon_7', ST_AsEWKT(ST_GeomFromKML('')); SELECT 'polygon_8', ST_AsEWKT(ST_GeomFromKML('')); -- 2 rings SELECT 'polygon_9', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,27,8 9,10 11,12 7,8')); -- XML not elements handle SELECT 'polygon_10', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4 5,6 1,2 7,8 9,10 11,12 7,8')); -- Empty interior ring coordinates (even if defined) SELECT 'polygon_11', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,2')); -- ERROR: Only 3 points in interior ring SELECT 'polygon_12', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,27,8 9,10 7,8')); -- ERROR: In interior ring: Last point is not the same as the first one SELECT 'polygon_13', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,27,8 9,10 11,12 7,9')); -- ERROR: In interior 3D ring: Last point is not the same as the first one in Z SELECT 'polygon_14', ST_AsEWKT(ST_GeomFromKML('1,2,3 4,5,6 7,8,9 1,2,310,11,12 13,14,15 16,17,18 10,11,0')); -- 3 rings SELECT 'polygon_15', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,27,8 9,10 11,12 7,813,14 15,16 17,18 13,14')); -- -- MultiGeometry -- -- 1 point --SELECT 'multi_1', ST_AsEWKT(ST_GeomFromKML('1,2')); -- 2 points --SELECT 'multi_2', ST_AsEWKT(ST_GeomFromKML('1,21,2')); -- 1 line --SELECT 'multi_3', ST_AsEWKT(ST_GeomFromKML('1,2 3,4')); -- 2 lines --SELECT 'multi_4', ST_AsEWKT(ST_GeomFromKML('1,2 3,45,6 7,8')); -- 1 polygon --SELECT 'multi_5', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,2')); -- 2 polygons --SELECT 'multi_6', ST_AsEWKT(ST_GeomFromKML('1,2 3,4 5,6 1,27,8 9,10 11,12 7,8')); -- Point, LineString and Polygon SELECT 'multi_7', ST_AsEWKT(ST_GeomFromKML('1,23,4 5,67,8 9,10 11,12 7,8')); -- Empty collection SELECT 'multi_8', ST_AsEWKT(ST_GeomFromKML('')); -- Collection of collection SELECT 'multi_9', ST_AsEWKT(ST_GeomFromKML('1,23,4 5,67,8 9,10 11,12 7,8')); -- XML not elements handle SELECT 'multi_10', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4 5,6 7,8 9,10 11,12 7,8')); -- -- KML Namespace -- -- KML namespace SELECT 'ns_1', ST_AsEWKT(ST_GeomFromKML('1,2')); -- KML namespace without explicit prefix SELECT 'ns_2', ST_AsEWKT(ST_GeomFromKML('1,2')); -- ERROR wrong namespace SELECT 'ns_3', ST_AsEWKT(ST_GeomFromKML('1,2')); -- Several namespaces SELECT 'ns_4', ST_AsEWKT(ST_GeomFromKML('1,2')); -- Ignore other namespace element SELECT 'ns_5', ST_AsEWKT(ST_GeomFromKML('1,23,4')); -- Attribute without explicit namespace -- TODO SELECT 'ns_6', ST_AsEWKT(ST_GeomFromKML('1,2')); -- Attribute with explicit KML namespace -- TODO SELECT 'ns_8', ST_AsEWKT(ST_GeomFromKML('1,2')); -- Attribute with explicit prefix but unqualified namespace -- TODO SELECT 'ns_10', ST_AsEWKT(ST_GeomFromKML('1,2')); -- Ignore other namespace attribute -- TODO SELECT 'ns_11', ST_AsEWKT(ST_GeomFromKML('1,23,4')); -- -- Coordinates -- -- X,Y SELECT 'coordinates_1', ST_AsEWKT(ST_GeomFromKML('1,2')); -- ERROR: single X SELECT 'coordinates_2', ST_AsEWKT(ST_GeomFromKML('1')); -- X,Y,Z SELECT 'coordinates_3', ST_AsEWKT(ST_GeomFromKML('1,2,3')); -- ERROR: 4 dimension SELECT 'coordinates_4', ST_AsEWKT(ST_GeomFromKML('1,2,3,4')); -- ERROR: Only commas SELECT 'coordinates_5', ST_AsEWKT(ST_GeomFromKML(',')); SELECT 'coordinates_6', ST_AsEWKT(ST_GeomFromKML(' , ')); -- ERROR: empty or spaces SELECT 'coordinates_7', ST_AsEWKT(ST_GeomFromKML('')); SELECT 'coordinates_8', ST_AsEWKT(ST_GeomFromKML(' ')); -- ERROR: End on comma SELECT 'coordinates_9', ST_AsEWKT(ST_GeomFromKML('1,2,3,')); SELECT 'coordinates_10', ST_AsEWKT(ST_GeomFromKML('1,2,')); -- ERROR: Begin on comma SELECT 'coordinates_11', ST_AsEWKT(ST_GeomFromKML(',1 2,3')); -- Whitespaces before and after SELECT 'coordinates_12', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4 ')); SELECT 'coordinates_13', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4 ')); -- ERROR: Spaces insides SELECT 'coordinates_14', ST_AsEWKT(ST_GeomFromKML('1, 2 3, 4')); -- Several spaces as tuples separator SELECT 'coordinates_15', ST_AsEWKT(ST_GeomFromKML('1,2 3,4')); SELECT 'coordinates_16', ST_AsEWKT(ST_GeomFromKML(' 1,2 3,4 ')); -- ERROR: Junk SELECT 'coordinates_17', ST_AsEWKT(ST_GeomFromKML('!@#$%^*()"')); -- -- Bijective PostGIS KML test -- -- Point SELECT 'kml_1', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POINT(1 2)')))); -- Point - 3D SELECT 'kml_2', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POINT(1 2 3)')))); -- Linestring SELECT 'kml_3', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;LINESTRING(1 2,3 4)')))); -- Linestring - 3D SELECT 'kml_4', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;LINESTRING(1 2 3,4 5 6)')))); -- Polygon KML SELECT 'kml_5', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POLYGON((1 2,3 4,5 6,1 2))')))); -- Polygon KML - 3D SELECT 'kml_6', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POLYGON((1 2 3,4 5 6,7 8 9,1 2 3))')))); -- Multipoint SELECT 'kml_7', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2,3 4)')))); -- Multipoint - 3D SELECT 'kml_8', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2 3,4 5 6)')))); -- Multilinestring SELECT 'kml_9', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2,3 4),(5 6,7 8))')))); -- Multilinestring - 3D SELECT 'kml_10', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2 3,4 5 6),(7 8 9,10 11 12))')))); -- Multipolygon SELECT 'kml_11', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))')))); -- Multipolygon - 3D SELECT 'kml_12', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12)))')))); -- -- Double -- -- Several digits SELECT 'double_1', ST_AsEWKT(ST_GeomFromKML('1,1234567890')); -- Sign +/- SELECT 'double_2', ST_AsEWKT(ST_GeomFromKML('1,-1')); SELECT 'double_3', ST_AsEWKT(ST_GeomFromKML('1,+1')); -- ERROR: double sign SELECT 'double_4', ST_AsEWKT(ST_GeomFromKML('1,--1')); -- ERROR: sign inside digit SELECT 'double_5', ST_AsEWKT(ST_GeomFromKML('1,1-1')); -- Decimal part SELECT 'double_6', ST_AsEWKT(ST_GeomFromKML('1,1.2')); SELECT 'double_7', ST_AsEWKT(ST_GeomFromKML('1,1.23')); -- no digit after dot SELECT 'double_8', ST_AsEWKT(ST_GeomFromKML('1,1.')); -- ERROR: several dots SELECT 'double_9', ST_AsEWKT(ST_GeomFromKML('1,1.2.3')); -- ERROR: no digit before dot SELECT 'double_10', ST_AsEWKT(ST_GeomFromKML('1,.1')); SELECT 'double_11', ST_AsEWKT(ST_GeomFromKML('1,-.1')); -- ERROR: not a digit SELECT 'double_12', ST_AsEWKT(ST_GeomFromKML('1,a')); SELECT 'double_13', ST_AsEWKT(ST_GeomFromKML('1,1a')); SELECT 'double_14', ST_AsEWKT(ST_GeomFromKML('1,1a2')); -- Exp SELECT 'double_15', ST_AsEWKT(ST_GeomFromKML('1,1e2')); SELECT 'double_16', ST_AsEWKT(ST_GeomFromKML('1,1E+2')); SELECT 'double_17', ST_AsEWKT(ST_GeomFromKML('1,1e-2')); SELECT 'double_18', ST_AsEWKT(ST_GeomFromKML('1,1E-2')); -- Exp with decimal parts SELECT 'double_19', ST_AsEWKT(ST_GeomFromKML('1,1.23E2')); SELECT 'double_20', ST_AsEWKT(ST_GeomFromKML('1,1.23e2')); SELECT 'double_21', ST_AsEWKT(ST_GeomFromKML('1,-1.23E2')); -- ERROR: no exp digit SELECT 'double_22', ST_AsEWKT(ST_GeomFromKML('1,1E')); SELECT 'double_23', ST_AsEWKT(ST_GeomFromKML('1,1e')); -- ERROR: dot inside exp digits SELECT 'double_24', ST_AsEWKT(ST_GeomFromKML('1,1e2.3')); SELECT 'double_25', ST_AsEWKT(ST_GeomFromKML('1,1E2.3')); -- ERROR: spaces inside SELECT 'double_26', ST_AsEWKT(ST_GeomFromKML('1,- 1.23')); SELECT 'double_27', ST_AsEWKT(ST_GeomFromKML('1,-1 .23')); SELECT 'double_28', ST_AsEWKT(ST_GeomFromKML('1,-1. 23')); SELECT 'double_29', ST_AsEWKT(ST_GeomFromKML('1,-1.23 E2')); SELECT 'double_30', ST_AsEWKT(ST_GeomFromKML('1,-1.23E 2')); -- ERROR: Junk SELECT 'double_31', ST_AsEWKT(ST_GeomFromKML('1,$0%@#$^%#')); -- -- Delete inserted spatial data -- DELETE FROM spatial_ref_sys WHERE srid = 4326;