From dbca1878825a3c5f977c6d87003a7ac3a7510f2c Mon Sep 17 00:00:00 2001 From: No Body Date: Fri, 1 Jul 2005 14:43:37 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'pgis_1_0_2'. git-svn-id: http://svn.osgeo.org/postgis/tags/pgis_1_0_2@1803 b70326c6-7e19-0410-871a-916f4a2858ee --- CHANGES | 27 +++++ CREDITS | 5 + Makefile.config | 6 +- Version.config | 2 +- doc/man/pgsql2shp.1 | 4 + doc/man/shp2pgsql.1 | 2 +- doc/postgis.xml | 189 ++++++++++++++++++++++++--------- jdbc2/.cvsignore | 1 + jdbc2/Makefile | 2 +- loader/pgsql2shp.c | 163 +++++++++++++++------------- loader/shp2pgsql.c | 40 ++++++- lwgeom/Makefile | 15 +-- lwgeom/lwgeom_btree.c | 25 +++-- lwgeom/lwgeom_estimate.c | 90 +++++++++++++--- lwgeom/lwgeom_geos.c | 1 - lwgeom/lwgeom_gist.c | 79 ++++++++------ lwgeom/lwgeom_pg.c | 20 ++-- lwgeom/lwgeom_spheroid.c | 2 +- lwgeom/lwpostgis.sql.in | 12 ++- regress/test_index_concurrency | 59 ++++++++++ spatial_ref_sys.sql | 32 +++--- utils/postgis_proc_upgrade.pl | 112 +++++++++++++++++++ utils/postgis_restore.pl | 33 +++--- utils/test_estimation.pl | 31 ++++-- utils/test_joinestimation.pl | 7 +- 25 files changed, 705 insertions(+), 254 deletions(-) create mode 100755 regress/test_index_concurrency create mode 100755 utils/postgis_proc_upgrade.pl diff --git a/CHANGES b/CHANGES index 355966951..69196b6d7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,29 @@ +PostGIS 1.0.2 +2005/07/04 + - Fault tolerant btree ops + - Memory Leak fix in pg_error + - Rtree index fix. See: + http://archives.postgresql.org/pgsql-hackers/2005-06/msg01108.php + - Initial support for postgresql 8.1dev + - Cleaner build scripts: avoided mix of CFLAGS and CXXFLAGS + - NEW -I switch for pgsql2shp (GiST index) + +PostGIS 1.0.1 +2005/05/24 + - BUGFIX in shp2pgql escape functions + - BUGFIX in 3d computation of lenght_spheroid + - better support for concurrent postgis in multiple schemas + - documentation fixes + - BUGFIX in join selectivity estimator returning invalid estimates (>1) + - jdbc2: compile with "-target 1.2 -source 1.2" by default + - NEW -k switch for pgsql2shp + - NEW support for custom createdb options in postgis_restore.pl + - BUGFIX in pgsql2shp attribute names unicity enforcement + - BUGFIX in Paris projections definitions + - postgis_restore.pl cleanups + PostGIS 1.0.0 +2005/04/19 - NEW manual pages for loader/dumper - NEW shp2pgsql support for old (HWGEOM) postgis versions - NEW -p flag for shp2pgsql @@ -7,6 +32,8 @@ PostGIS 1.0.0 - NEW chapter about OGC compliancy enforcement - BUGFIX in shp2pgsql escape of values starting with "'" or "\t" - NEW autoconf support for JTS lib + - BUGFIX in estimator testers (support for LWGEOM and schema parsing) + - BUGFIX in join selectivity estimator (defaults, leaks, tuplecount, sd) PostGIS 1.0.0RC6 2005/03/30 diff --git a/CREDITS b/CREDITS index 224a27256..01119a3a4 100644 --- a/CREDITS +++ b/CREDITS @@ -42,5 +42,10 @@ Version 0.9 of PostGIS includes patches from: Olivier Courtin on AsSVG() Bruno Wolff III on the distance_sphere algorithm +Version 1.0.0 of PostGIS includes code from: + Mark Cave-Ayland with new positional + operators, join estimator and general testing and support. + Markus Schaber author of the jdbc2 interface + See the postgis manual for more contributors. diff --git a/Makefile.config b/Makefile.config index 1e343156b..aa4a869d3 100644 --- a/Makefile.config +++ b/Makefile.config @@ -124,7 +124,11 @@ else ifneq ($(findstring 7.4,$(VERSION)),) USE_VERSION=74 else - USE_VERSION=80 + ifneq ($(findstring 8.0,$(VERSION)),) + USE_VERSION=80 + else + USE_VERSION=81 + endif endif endif endif diff --git a/Version.config b/Version.config index 84d53f96e..d96ae0cc5 100644 --- a/Version.config +++ b/Version.config @@ -4,7 +4,7 @@ # shared library version SO_MAJOR_VERSION=1 SO_MINOR_VERSION=0 -SO_MICRO_VERSION=0 +SO_MICRO_VERSION=2 # sql scripts version SCRIPTS_VERSION=0.3.0 diff --git a/doc/man/pgsql2shp.1 b/doc/man/pgsql2shp.1 index 03f8cbb0e..aadd78450 100644 --- a/doc/man/pgsql2shp.1 +++ b/doc/man/pgsql2shp.1 @@ -56,6 +56,10 @@ Raw mode. Do not drop the gid field, or escape column names. \fB\-d\fR For backward compatibility: write a 3\-dimensional shape file when dumping from old (pre\-1.0.0) postgis databases (the default is to write a 2\-dimensional shape file in that case). Starting from postgis\-1.0.0+, dimensions are fully encoded. +.TP +\fB\-k\fR +Keep idendifiers case (don't uppercase field names). + .SH "AUTHORS" .LP diff --git a/doc/man/shp2pgsql.1 b/doc/man/shp2pgsql.1 index 6eb233f0a..09c02bc22 100644 --- a/doc/man/shp2pgsql.1 +++ b/doc/man/shp2pgsql.1 @@ -41,7 +41,7 @@ Creates and populates the geometry tables with the specified SRID. .TP \fB\-k\fR -Keep idendifiers case (column, schema and attributes). Note that attributes in Shapefile are all UPPERCASE. +Keep idendifiers case (column, schema and attributes). Note that attributes in Shapefile are usually all UPPERCASE. .TP \fB\-i\fR diff --git a/doc/postgis.xml b/doc/postgis.xml index 3f17e68dd..82dc4ab2d 100644 --- a/doc/postgis.xml +++ b/doc/postgis.xml @@ -155,7 +155,7 @@ The "Simple Features + url="http://www.opengis.org/docs/99-049.pdf">Simple Features for Specification for SQL" is available at the OpenGIS Consortium web site: http://www.opengis.org. @@ -260,7 +260,7 @@ Once your PostgreSQL installation is up-to-date, enter the "postgis" directory, and edit the - Makefile. + Makefile.config file. @@ -359,7 +359,7 @@ as follow: # Create a "custom-format" dump of the database you want # to upgrade (let's call it "olddb") - $ pg_dump -Fc olddb olddb.dump + $ pg_dump -Fc olddb > olddb.dump # Restore the dump contextually upgrading postgis into # a new database. The new database doesn't have to exist. @@ -384,7 +384,7 @@ as follow: # If you did make additions we assume you know how to backup them before # upgrading the table. Replace of it with the new one is done like this: $ psql newdb - newdb=> drop table spatial_ref_sys; + newdb=> delete from spatial_ref_sys; DROP newdb=> \i spatial_ref_sys.sql @@ -448,7 +448,7 @@ as a "backup" in case postgis_restore.pl won't work for you: Also check that you have made any necessary changes to the top - of the Makefile. This includes: + of the Makefile.config. This includes: @@ -456,7 +456,7 @@ as a "backup" in case postgis_restore.pl won't work for you: must install the Proj4 library on your system, set the USE_PROJ variable to 1 and the PROJ_DIR to your installation prefix in the - Makefile. + Makefile.config. @@ -464,7 +464,7 @@ as a "backup" in case postgis_restore.pl won't work for you: install the GEOS library on your system, and set the USE_GEOS to 1 and the GEOS_DIR to your installation prefix in the - Makefile. + Makefile.config @@ -1518,7 +1518,7 @@ WHERE AsText(GEOM) AS GEOM FROM ROADS_GEOM WHERE - GEOM && GeomFromText('BOX3D(191232 243117,191232 243119)'::box3d,-1); + GEOM && SetSRID('BOX3D(191232 243117,191232 243119)'::box3d,-1); Note the use of the SRID, to specify the projection of the BOX3D. The value -1 is used to indicate no specified SRID. @@ -2755,7 +2755,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - SetSRID(geometry) + SetSRID(geometry, integer) Set the SRID on a geometry to a particular integer value. @@ -2770,7 +2770,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Distance(geometry,geometry) + Distance(geometry, geometry) Return the cartesian distance between two geometries in @@ -2779,13 +2779,13 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Equals(geometry,geometry) + Equals(geometry, geometry) - Returns 1 (TRUE) if this Geometry is "spatially equal" to - anotherGeometry. Use this for a 'better' answer than '='. equals - ('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)') is - true. + Returns 1 (TRUE) if the given Geometries are + "spatially equal". Use this for a 'better' answer than '='. + equals('LINESTRING(0 0, 10 10)','LINESTRING(0 0, 5 5, 10 10)') + is true. Performed by the GEOS module @@ -2794,11 +2794,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Disjoint(geometry,geometry) + Disjoint(geometry, geometry) - Returns 1 (TRUE) if this Geometry is "spatially disjoint" - from anotherGeometry. + Returns 1 (TRUE) if the Geometries are "spatially disjoint". + Performed by the GEOS module @@ -2814,11 +2814,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Intersects(geometry,geometry) + Intersects(geometry, geometry) - Returns 1 (TRUE) if this Geometry "spatially intersects" - anotherGeometry. + Returns 1 (TRUE) if the Geometries "spatially intersect". + Performed by the GEOS module @@ -2834,11 +2834,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Touches(geometry,geometry) + Touches(geometry, geometry) - Returns 1 (TRUE) if this Geometry "spatially touches" - anotherGeometry. + Returns 1 (TRUE) if the Geometries "spatially touch". + Performed by the GEOS module @@ -2855,11 +2855,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Crosses(geometry,geometry) + Crosses(geometry, geometry) - Returns 1 (TRUE) if this Geometry "spatially crosses" - anotherGeometry. + Returns 1 (TRUE) if the Geometries "spatially cross". + Performed by the GEOS module @@ -2875,11 +2875,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Within(geometry,geometry) + Within(geometry A, geometry B) - Returns 1 (TRUE) if this Geometry is "spatially within" - anotherGeometry. + Returns 1 (TRUE) if Geometry A is "spatially within" + Geometry B. Performed by the GEOS module @@ -2895,11 +2895,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Overlaps(geometry,geometry) + Overlaps(geometry, geometry) - Returns 1 (TRUE) if this Geometry is "spatially - overlapping" anotherGeometry. + Returns 1 (TRUE) if the Geometries "spatially + overlap". Performed by the GEOS module @@ -2914,11 +2914,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Contains(geometry,geometry) + Contains(geometry A, geometry B) - Returns 1 (TRUE) if this Geometry is "spatially contains" - anotherGeometry. + Returns 1 (TRUE) if Geometry A "spatially contains" + Geometry B. Performed by the GEOS module @@ -2929,16 +2929,16 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. boolean, not an integer. OGC SPEC s2.1.1.2 // s2.1.13.3 - same as - within(geometry,geometry) + within(geometry B, geometry A) - Intersects(geometry,geometry) + Intersects(geometry, geometry) - Returns 1 (TRUE) if this Geometry is "spatially - intersects" anotherGeometry. + Returns 1 (TRUE) if the Geometries "spatially + intersect". Performed by the GEOS module @@ -2949,12 +2949,12 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. boolean, not an integer. OGC SPEC s2.1.1.2 // s2.1.13.3 - NOT - disjoint(geometry,geometry) + disjoint(geometry, geometry) - Relate(geometry,geometry, intersectionPatternMatrix) + Relate(geometry, geometry, intersectionPatternMatrix) Returns 1 (TRUE) if this Geometry is spatially related to @@ -2975,7 +2975,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Relate(geometry,geometry) + Relate(geometry, geometry) returns the DE-9IM (dimensionally extended @@ -3060,7 +3060,7 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Buffer(geometry,double,[integer]) + Buffer(geometry, double, [integer]) Returns a geometry that represents all points whose @@ -3093,11 +3093,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Intersection(geometry,geometry) + Intersection(geometry, geometry) Returns a geometry that represents the point set - intersection of this Geometry with anotherGeometry. + intersection of the Geometies. Performed by the GEOS module @@ -3109,11 +3109,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - SymDifference(geometry,geometry) + SymDifference(geometry A, geometry B) Returns a geometry that represents the point set symmetric - difference of this Geometry with anotherGeometry. + difference of Geometry A with Geometry B. Performed by the GEOS module @@ -3125,11 +3125,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - Difference(geometry,geometry) + Difference(geometry A, geometry B) Returns a geometry that represents the point set symmetric - difference of this Geometry with anotherGeometry. + difference of Geometry A with Geometry B. Performed by the GEOS module @@ -3141,11 +3141,11 @@ dimension(the_geom)>2" skips re-writing of geometries that already are in 2D. - GeomUnion(geometry,geometry) + GeomUnion(geometry, geometry) Returns a geometry that represents the point set union of - this Geometry with anotherGeometry. + the Geometries. Performed by the GEOS module @@ -4661,9 +4661,90 @@ FROM geometry_table; Release Notes + + Release 1.0.2 + Release date: 2005/07/04 + + + Contains a few bug fixes and improvements. + + + + Upgrading + + If you are upgrading from + release 1.0.0RC6 or up you DO + NOT need a dump/reload. + + Upgrading from older releases + requires a dump/reload. + See the upgrading + chapter for more informations. + + + + Bug fixes + Fault tolerant btree ops + Memory leak plugged in pg_error + Rtree index fix + Cleaner build scripts (avoided mix of CFLAGS and CXXFLAGS) + + + + Improvements + New index creation capabilities in loader (-I switch) + Initial support for postgresql 8.1dev + + + + + + Release 1.0.1 + Release date: 2005/05/24 + + + Contains a few bug fixes and some improvements. + + + + Upgrading + + If you are upgrading from + release 1.0.0RC6 or up you DO + NOT need a dump/reload. + + Upgrading from older releases + requires a dump/reload. + See the upgrading + chapter for more informations. + + + + Library changes + BUGFIX in 3d computation of lenght_spheroid() + BUGFIX in join selectivity estimator + + + + Other changes/additions + BUGFIX in shp2pgql escape functions + better support for concurrent postgis in multiple schemas + documentation fixes + jdbc2: compile with "-target 1.2 -source 1.2" by default + NEW -k switch for pgsql2shp + NEW support for custom createdb options in postgis_restore.pl + BUGFIX in pgsql2shp attribute names unicity enforcement + BUGFIX in Paris projections definitions + postgis_restore.pl cleanups + + + + Release 1.0.0 - Release date: 2005/04/?? + Release date: 2005/04/19 Final 1.0.0 release. Contains a few bug fixes, some improvements @@ -4689,6 +4770,7 @@ FROM geometry_table; Library changes BUGFIX in transform() releasing random memory address BUGFIX in force_3dm() allocating less memory then required + BUGFIX in join selectivity estimator (defaults, leaks, tuplecount, sd) @@ -4699,6 +4781,7 @@ FROM geometry_table; NEW -p (prepare) flag for shp2pgsql NEW manual chapter about OGC compliancy enforcement NEW autoconf support for JTS lib + BUGFIX in estimator testers (support for LWGEOM and schema parsing) diff --git a/jdbc2/.cvsignore b/jdbc2/.cvsignore index 3cc40d652..5ad8b1efd 100644 --- a/jdbc2/.cvsignore +++ b/jdbc2/.cvsignore @@ -5,3 +5,4 @@ stubbin stubcompile jtscompile versionstamp +eclipsebin diff --git a/jdbc2/Makefile b/jdbc2/Makefile index 7fdd57048..ed11a8f3b 100644 --- a/jdbc2/Makefile +++ b/jdbc2/Makefile @@ -27,7 +27,7 @@ # Configure the helper executables used during build. -JAVAC?=javac +JAVAC?=javac -target 1.2 -source 1.2 JAVA?=java JAR?=jar MKDIR?=mkdir -p diff --git a/loader/pgsql2shp.c b/loader/pgsql2shp.c index 1d5e9a3cb..1a05c03a6 100644 --- a/loader/pgsql2shp.c +++ b/loader/pgsql2shp.c @@ -73,6 +73,7 @@ int dswitchprovided; int includegid; int unescapedattrs; int binary; +int keep_fieldname_case; SHPObject * (*shape_creator)(byte *, int); int big_endian = 0; int pgis_major_version; @@ -166,6 +167,7 @@ main(int ARGC, char **ARGV) includegid=0; unescapedattrs=0; binary = 0; + keep_fieldname_case = 0; #ifdef DEBUG FILE *debug; #endif @@ -2272,7 +2274,8 @@ usage(int status) printf(" -b Use a binary cursor.\n"); printf(" -r Raw mode. Do not assume table has been created by \n"); printf(" the loader. This would not unescape attribute names\n"); - printf(" and will not skip the 'gid' attribute."); + printf(" and will not skip the 'gid' attribute.\n"); + printf(" -k Keep postgresql identifiers case.\n"); printf("\n"); exit (status); } @@ -2287,50 +2290,52 @@ parse_commandline(int ARGC, char **ARGV) buf[1023] = '\0'; // just in case... /* Parse command line */ - while ((c = getopt(ARGC, ARGV, "bf:h:du:p:P:g:r")) != EOF){ - switch (c) { - case 'b': - binary = 1; - break; - case 'f': - shp_file = optarg; - break; - case 'h': - //setenv("PGHOST", optarg, 1); - snprintf(buf, 255, "PGHOST=%s", optarg); - putenv(strdup(buf)); - break; - case 'd': - dswitchprovided = 1; - outtype = 'z'; - break; - case 'r': - includegid = 1; - unescapedattrs = 1; - break; - case 'u': - //setenv("PGUSER", optarg, 1); - snprintf(buf, 255, "PGUSER=%s", optarg); - putenv(strdup(buf)); - break; - case 'p': - //setenv("PGPORT", optarg, 1); - snprintf(buf, 255, "PGPORT=%s", optarg); - putenv(strdup(buf)); - break; - case 'P': - //setenv("PGPASSWORD", optarg, 1); - snprintf(buf, 255, "PGPASSWORD=%s", optarg); - putenv(strdup(buf)); - break; - case 'g': - geo_col_name = optarg; - break; - case '?': - return 0; - default: - return 0; - } + while ((c = getopt(ARGC, ARGV, "bf:h:du:p:P:g:rk")) != EOF){ + switch (c) { + case 'b': + binary = 1; + break; + case 'f': + shp_file = optarg; + break; + case 'h': + //setenv("PGHOST", optarg, 1); + snprintf(buf, 255, "PGHOST=%s", optarg); + putenv(strdup(buf)); + break; + case 'd': + dswitchprovided = 1; + outtype = 'z'; + break; + case 'r': + includegid = 1; + unescapedattrs = 1; + break; + case 'u': + //setenv("PGUSER", optarg, 1); + snprintf(buf, 255, "PGUSER=%s", optarg); + putenv(strdup(buf)); + break; + case 'p': + //setenv("PGPORT", optarg, 1); + snprintf(buf, 255, "PGPORT=%s", optarg); + putenv(strdup(buf)); + break; + case 'P': + //setenv("PGPASSWORD", optarg, 1); + snprintf(buf, 255, "PGPASSWORD=%s", optarg); + putenv(strdup(buf)); + break; + case 'g': + geo_col_name = optarg; + break; + case 'k': + keep_fieldname_case = 1; + break; + case '?': + default: + return 0; + } } curindex=0; @@ -2365,7 +2370,6 @@ get_postgis_major_version(void) exit(1); } - res = PQexec(conn, query); version = PQgetvalue(res, 0, 0); ver = atoi(version); PQclear(res); @@ -2390,6 +2394,8 @@ initialize(void) int mainscan_nflds=0; int size; int gidfound=0; + char *dbf_flds[256]; + int dbf_nfields=0; /* Detect postgis version */ pgis_major_version = get_postgis_major_version(); @@ -2499,7 +2505,7 @@ initialize(void) * This is exactly the geometry privided * by the user. */ - else if (!strcmp(geo_col_name,fname)) + else if (!strcmp(geo_col_name, fname)) { geom_fld = mainscan_nflds; type_ary[mainscan_nflds]=9; @@ -2533,42 +2539,38 @@ initialize(void) * becomes __xmin when escaped */ - - if(strlen(ptr) <32) strcpy(field_name, ptr); - else - { - /* - * TODO: you find an appropriate name if - * running in RAW mode - */ - printf("dbf attribute name %s is too long, must be " - "less than 32 characters.\n", ptr); - return 0; - } - - - /* make UPPERCASE */ - for(j=0; j < strlen(field_name); j++) - field_name[j] = toupper(field_name[j]); + /* Limit dbf field name to 10-digits */ + strncpy(field_name, ptr, 10); + field_name[10] = 0; /* * make sure the fields all have unique names, - * 10-digit limit on dbf names... */ - for(j=0;j= 3.2.2 set GLIBCPP_FORCE_NEW at runtime instead #override CXXFLAGS += -D__USE_MALLOC diff --git a/lwgeom/lwgeom_btree.c b/lwgeom/lwgeom_btree.c index 70598fae7..359b599a5 100644 --- a/lwgeom/lwgeom_btree.c +++ b/lwgeom/lwgeom_btree.c @@ -29,6 +29,16 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS); //#define PGIS_DEBUG +#if USE_VERSION == 72 +#define BTREE_SRID_MISMATCH_SEVERITY NOTICE +#else +#if USE_VERSION < 80 +#define BTREE_SRID_MISMATCH_SEVERITY WARNING +#else +#define BTREE_SRID_MISMATCH_SEVERITY ERROR +#endif +#endif + PG_FUNCTION_INFO_V1(lwgeom_lt); Datum lwgeom_lt(PG_FUNCTION_ARGS) { @@ -43,7 +53,7 @@ Datum lwgeom_lt(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -100,7 +110,7 @@ Datum lwgeom_le(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -180,7 +190,7 @@ Datum lwgeom_eq(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -240,7 +250,7 @@ Datum lwgeom_ge(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -312,7 +322,7 @@ Datum lwgeom_gt(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -380,7 +390,7 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS) if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2)) { - elog(ERROR, + elog(BTREE_SRID_MISMATCH_SEVERITY, "Operation on two GEOMETRIES with different SRIDs\n"); if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1); @@ -449,6 +459,9 @@ Datum lwgeom_cmp(PG_FUNCTION_ARGS) /*********************************************************** * * $Log$ + * Revision 1.7.2.1 2005/06/15 16:04:31 strk + * fault tolerant btree ops + * * Revision 1.7 2005/02/07 13:21:10 strk * Replaced DEBUG* macros with PGIS_DEBUG*, to avoid clashes with postgresql DEBUG * diff --git a/lwgeom/lwgeom_estimate.c b/lwgeom/lwgeom_estimate.c index 55ded4a16..a4cc30c5b 100644 --- a/lwgeom/lwgeom_estimate.c +++ b/lwgeom/lwgeom_estimate.c @@ -775,7 +775,11 @@ calculate_column_intersection(BOX2DFLOAT4 *search_box, GEOM_STATS *geomstats1, G PG_FUNCTION_INFO_V1(LWGEOM_gist_joinsel); Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) { +#if USE_VERSION < 81 Query *root = (Query *) PG_GETARG_POINTER(0); +#else + PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0); +#endif //Oid operator = PG_GETARG_OID(1); List *args = (List *) PG_GETARG_POINTER(2); JoinType jointype = (JoinType) PG_GETARG_INT16(3); @@ -828,9 +832,14 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) } var1 = (Var *)arg1; - relid1 = getrelid(var1->varno, root->rtable); var2 = (Var *)arg2; +#if USE_VERSION < 81 + relid1 = getrelid(var1->varno, root->rtable); relid2 = getrelid(var2->varno, root->rtable); +#else + relid1 = getrelid(var1->varno, root->parse->rtable); + relid2 = getrelid(var2->varno, root->parse->rtable); +#endif #if DEBUG_GEOMETRY_STATS elog(NOTICE, "Working with relations oids: %d %d", relid1, relid2); @@ -841,9 +850,9 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) if ( ! stats1_tuple ) { #if DEBUG_GEOMETRY_STATS - elog(NOTICE, " No statistics, returning default estimate"); + elog(NOTICE, " No statistics, returning default geometry join selectivity"); #endif - PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL); + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); } @@ -853,10 +862,10 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) (float4 **)&geomstats1, &geomstats1_nvalues) ) { #if DEBUG_GEOMETRY_STATS - elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry selectivity"); + elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry join selectivity"); #endif ReleaseSysCache(stats1_tuple); - PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL); + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); } @@ -865,9 +874,12 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) if ( ! stats2_tuple ) { #if DEBUG_GEOMETRY_STATS - elog(NOTICE, " No statistics, returning default estimate"); + elog(NOTICE, " No statistics, returning default geometry join selectivity"); #endif - PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL); + free_attstatsslot(0, NULL, 0, (float *)geomstats1, + geomstats1_nvalues); + ReleaseSysCache(stats1_tuple); + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); } @@ -876,10 +888,13 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) (float4 **)&geomstats2, &geomstats2_nvalues) ) { #if DEBUG_GEOMETRY_STATS - elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry selectivity"); + elog(NOTICE, " STATISTIC_KIND_GEOMETRY stats not found - returning default geometry join selectivity"); #endif + free_attstatsslot(0, NULL, 0, (float *)geomstats1, + geomstats1_nvalues); ReleaseSysCache(stats2_tuple); - PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_SEL); + ReleaseSysCache(stats1_tuple); + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); } @@ -963,6 +978,24 @@ Datum LWGEOM_gist_joinsel(PG_FUNCTION_ARGS) elog(NOTICE, "Estimated rows returned: %f", rows_returned); #endif + /* + * One (or both) tuple count is zero... + * We return default selectivity estimate. + * We could probably attempt at an estimate + * w/out looking at tables tuple count, with + * a function of selectivity1, selectivity2. + */ + if ( ! total_tuples ) + { +#if DEBUG_GEOMETRY_STATS + elog(NOTICE, "Total tuples == 0, returning default join selectivity"); +#endif + PG_RETURN_FLOAT8(DEFAULT_GEOMETRY_JOINSEL); + } + + if ( rows_returned > total_tuples ) + PG_RETURN_FLOAT8(1.0); + PG_RETURN_FLOAT8(rows_returned / total_tuples); } @@ -1329,7 +1362,9 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS) * of a search_box looking at data in the GEOM_STATS * structure. * - * TODO: handle box dimension collapses + * TODO: handle box dimension collapses (probably should be handled + * by the statistic generator, avoiding GEOM_STATS with collapsed + * dimensions) */ static float8 estimate_selectivity(BOX2DFLOAT4 *box, GEOM_STATS *geomstats) @@ -1381,6 +1416,11 @@ estimate_selectivity(BOX2DFLOAT4 *box, GEOM_STATS *geomstats) histocols = geomstats->cols; historows = geomstats->rows; +#if DEBUG_GEOMETRY_STATS + elog(NOTICE, " histogram has %d cols, %d rows", histocols, historows); + elog(NOTICE, " histogram geosize is %fx%f", geow, geoh); +#endif + cell_area = (geow*geoh) / (histocols*historows); //box_area = (box->high.x-box->low.x)*(box->high.y-box->low.y); box_area = (box->xmax-box->xmin)*(box->ymax-box->ymin); @@ -1571,7 +1611,11 @@ elog(NOTICE, " avg feat overlaps %f cells", avg_feat_cells); PG_FUNCTION_INFO_V1(LWGEOM_gist_sel); Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS) { +#if USE_VERSION < 81 Query *root = (Query *) PG_GETARG_POINTER(0); +#else + PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0); +#endif //Oid operator = PG_GETARG_OID(1); List *args = (List *) PG_GETARG_POINTER(2); //int varRelid = PG_GETARG_INT32(3); @@ -1656,8 +1700,12 @@ Datum LWGEOM_gist_sel(PG_FUNCTION_ARGS) * Get pg_statistic row */ +#if USE_VERSION < 81 // relid = getrelid(varRelid, root->rtable); relid = getrelid(self->varno, root->rtable); +#else + relid = getrelid(self->varno, root->parse->rtable); +#endif stats_tuple = SearchSysCache(STATRELATT, ObjectIdGetDatum(relid), Int16GetDatum(self->varattno), 0, 0); if ( ! stats_tuple ) @@ -1917,10 +1965,10 @@ compute_geometry_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc, sdHIGx += (box->xmax - avgHIGx) * (box->xmax - avgHIGx); sdHIGy += (box->ymax - avgHIGy) * (box->ymax - avgHIGy); } - sdLOWx = sqrt(sdLOWx/(notnull_cnt-1)); - sdLOWy = sqrt(sdLOWy/(notnull_cnt-1)); - sdHIGx = sqrt(sdHIGx/(notnull_cnt-1)); - sdHIGy = sqrt(sdHIGy/(notnull_cnt-1)); + sdLOWx = sqrt(sdLOWx/notnull_cnt); + sdLOWy = sqrt(sdLOWy/notnull_cnt); + sdHIGx = sqrt(sdHIGx/notnull_cnt); + sdHIGy = sqrt(sdHIGy/notnull_cnt); #if DEBUG_GEOMETRY_STATS elog(NOTICE, " standard deviations:"); @@ -2454,6 +2502,20 @@ Datum LWGEOM_estimated_extent(PG_FUNCTION_ARGS) /********************************************************************** * $Log$ + * Revision 1.29.2.4 2005/06/28 22:00:05 strk + * Fixed extimators to work with postgresql 8.1.x + * + * Revision 1.29.2.3 2005/04/22 01:05:41 strk + * Fixed bug in join selectivity estimator returning invalid estimates (>1) + * + * Revision 1.29.2.2 2005/04/18 14:12:59 strk + * Slightly changed standard deviation computation to be more corner-case-friendly. + * + * Revision 1.29.2.1 2005/04/18 10:57:01 strk + * Applied patched by Ron Mayer fixing memory leakages and invalid results + * in join selectivity estimator. Fixed some return to use default JOIN + * selectivity estimate instead of default RESTRICT selectivity estimate. + * * Revision 1.29 2005/03/25 09:34:25 strk * code cleanup * diff --git a/lwgeom/lwgeom_geos.c b/lwgeom/lwgeom_geos.c index e1a080e61..8a5aa3b4c 100644 --- a/lwgeom/lwgeom_geos.c +++ b/lwgeom/lwgeom_geos.c @@ -255,7 +255,6 @@ Datum unite_garray(PG_FUNCTION_ARGS) } - //select geomunion('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))'); PG_FUNCTION_INFO_V1(geomunion); Datum geomunion(PG_FUNCTION_ARGS) diff --git a/lwgeom/lwgeom_gist.c b/lwgeom/lwgeom_gist.c index 98a0ae84d..0e8c78ed7 100644 --- a/lwgeom/lwgeom_gist.c +++ b/lwgeom/lwgeom_gist.c @@ -7,6 +7,9 @@ #include "postgres.h" #include "access/gist.h" #include "access/itup.h" +#if USE_VERSION > 80 +#include "access/rtree.h" +#endif #include "fmgr.h" #include "utils/elog.h" @@ -592,10 +595,6 @@ Datum LWGEOM_gist_consistent(PG_FUNCTION_ARGS) bool result; BOX2DFLOAT4 box; - /* - * if entry is not leaf, use rtree_internal_consistent, - * else use rtree_leaf_consistent - */ #ifdef PGIS_DEBUG_CALLS elog(NOTICE,"GIST: LWGEOM_gist_consistent called"); #endif @@ -639,11 +638,13 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query, #endif switch(strategy) { - case RTLeftStrategyNumber: - case RTOverLeftStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTOverlapStrategyNumber: //optimized for speed + case RTLeftStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverLeftStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_right, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverlapStrategyNumber: //optimized for speed retval = (((key->xmax>= query->xmax) && (key->xmin <= query->xmax)) || @@ -670,33 +671,41 @@ lwgeom_rtree_internal_consistent(BOX2DFLOAT4 *key, BOX2DFLOAT4 *query, elog(NOTICE,"%i:(int)<%.8g %.8g,%.8g %.8g>&&<%.8g %.8g,%.8g %.8g> %i",counter_intern,key->xmin,key->ymin,key->xmax,key->ymax, query->xmin,query->ymin,query->xmax,query->ymax, (int) retval); -#endif counter_intern++; - return(retval); - break; - case RTOverRightStrategyNumber: - case RTRightStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overright, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTOverBelowStrategyNumber: - case RTBelowStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTAboveStrategyNumber: - case RTOverAboveStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTSameStrategyNumber: - case RTContainsStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - case RTContainedByStrategyNumber: - retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) ); - break; - default: - retval = FALSE; - } - return(retval); +#endif + + return(retval); + break; + + case RTOverRightStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_left, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTRightStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overleft, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverBelowStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_above, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTBelowStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overabove, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTAboveStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_overbelow, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTOverAboveStrategyNumber: + retval = !DatumGetBool( DirectFunctionCall2( BOX2D_below, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTSameStrategyNumber: + case RTContainsStrategyNumber: + retval = DatumGetBool( DirectFunctionCall2( BOX2D_contain, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + case RTContainedByStrategyNumber: + retval = DatumGetBool( DirectFunctionCall2( BOX2D_overlap, PointerGetDatum(key), PointerGetDatum(query) ) ); + break; + default: + retval = FALSE; + } + return(retval); } diff --git a/lwgeom/lwgeom_pg.c b/lwgeom/lwgeom_pg.c index 9dca71732..02824c92e 100644 --- a/lwgeom/lwgeom_pg.c +++ b/lwgeom/lwgeom_pg.c @@ -50,23 +50,17 @@ pg_free(void *ptr) void pg_error(const char *fmt, ...) { - char *msg; +#define ERRMSG_MAXLEN 256 + + char errmsg[ERRMSG_MAXLEN+1]; va_list ap; va_start (ap, fmt); + vsnprintf (errmsg, ERRMSG_MAXLEN, fmt, ap); + va_end (ap); - /* - * This is a GNU extension. - * Dunno how to handle errors here. - */ - if (!vasprintf (&msg, fmt, ap)) - { - va_end (ap); - return; - } - elog(ERROR, "%s", msg); - va_end(ap); - free(msg); + errmsg[ERRMSG_MAXLEN]='\0'; + elog(ERROR, "%s", errmsg); } void diff --git a/lwgeom/lwgeom_spheroid.c b/lwgeom/lwgeom_spheroid.c index 6b9f85f95..d3dda2af4 100644 --- a/lwgeom/lwgeom_spheroid.c +++ b/lwgeom/lwgeom_spheroid.c @@ -302,7 +302,7 @@ double lwgeom_pointarray_length_ellipse(POINTARRAY *pts, SPHEROID *sphere) distellips = distance_ellipse( frm.y*M_PI/180.0, frm.x*M_PI/180.0, to.y*M_PI/180.0, to.x*M_PI/180.0, sphere); - dist += sqrt(distellips*distellips + (frm.z*frm.z)); + dist += sqrt(distellips*distellips + (frm.z-to.z)*(frm.z-to.z)); } return dist; } diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index bb176752d..952ad5b77 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -825,8 +825,13 @@ CREATE OPERATOR CLASS gist_geometry_ops FUNCTION 7 LWGEOM_gist_same (box2d, box2d, internal); UPDATE pg_opclass - SET opckeytype = (select oid from pg_type where typname = 'box2d') - WHERE opcname = 'gist_geometry_ops'; + SET opckeytype = (SELECT oid FROM pg_type + WHERE typname = 'box2d' + AND typnamespace = (SELECT oid FROM pg_namespace + WHERE nspname=current_schema())) + WHERE opcname = 'gist_geometry_ops' + AND opcnamespace = (SELECT oid from pg_namespace + WHERE nspname=current_schema()); -- TODO: add btree binding... @@ -1982,7 +1987,8 @@ CREATE TABLE geometry_columns ( f_table_catalog, f_table_schema, f_table_name, - f_geometry_column ) ); + f_geometry_column ) +) WITH OIDS; ----------------------------------------------------------------------- -- RENAME_GEOMETRY_TABLE_CONSTRAINTS() diff --git a/regress/test_index_concurrency b/regress/test_index_concurrency new file mode 100755 index 000000000..3a4b6ca5c --- /dev/null +++ b/regress/test_index_concurrency @@ -0,0 +1,59 @@ +#!/bin/sh + +if [ -z "$TMPDIR" ]; then + TMPDIR=/tmp +fi + +OUTFILE="${TMPDIR}/regress_index_out_$$" + +echo "Running GiST concurrency Regression." + +DB=postgis_reg +export PGDATABASE=$DB + +if [ "$1" = "prepare" ]; then + echo "" + echo "Index Creation will take some time..." + echo "" + + createdb > /dev/null + createlang plpgsql > /dev/null + psql -f ../lwpostgis.sql > /dev/null 2>&1 + + psql -f regress_lots_of_points.sql + psql -c "INSERT INTO test SELECT num+5000, translate(the_geom, 1, 1, 0) FROM test" + psql -c "INSERT INTO test SELECT num+10000, translate(the_geom, -1, -1) FROM test" + psql -c "CREATE INDEX quick_gist on test using gist (the_geom)" +else +if [ "$1" = "run" ]; then + +if [ -n "$2" ]; then + NUMCLIENTS=$2 +else + NUMCLIENTS=3 +fi + + +o=$((1000/$NUMCLIENTS)) +f=0 +t=$o + # Concurrent clients: + echo "Concurrent clients: $NUMCLIENTS" + for n in `seq 1 $NUMCLIENTS`; do + +echo "update test set num=-num WHERE the_geom && 'BOX3D($f $f,$t $t)'::box3d;" | psql & +f=$((f+o)) +t=$((t+o)) + done + + wait + +else +if [ "$1" = "drop" ]; then + dropdb $DB > /dev/null +else + echo "Usage: $0 prepare | run [nclients] | drop" +fi +fi +fi + diff --git a/spatial_ref_sys.sql b/spatial_ref_sys.sql index 129773566..588aa42b4 100644 --- a/spatial_ref_sys.sql +++ b/spatial_ref_sys.sql @@ -6454,67 +6454,67 @@ INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4tex --- --- EPSG 27561 : NTF (Paris) / Lambert Nord France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27561,'EPSG',27561,'PROJCS["NTF (Paris) / Lambert Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27561"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27561,'EPSG',27561,'PROJCS["NTF (Paris) / Lambert Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27561"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27562 : NTF (Paris) / Lambert Centre France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27562,'EPSG',27562,'PROJCS["NTF (Paris) / Lambert Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27562"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27562,'EPSG',27562,'PROJCS["NTF (Paris) / Lambert Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27562"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27563 : NTF (Paris) / Lambert Sud France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27563,'EPSG',27563,'PROJCS["NTF (Paris) / Lambert Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27563"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27563,'EPSG',27563,'PROJCS["NTF (Paris) / Lambert Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27563"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27564 : NTF (Paris) / Lambert Corse --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27564,'EPSG',27564,'PROJCS["NTF (Paris) / Lambert Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27564"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27564,'EPSG',27564,'PROJCS["NTF (Paris) / Lambert Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27564"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27571 : NTF (Paris) / Lambert zone I --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27571,'EPSG',27571,'PROJCS["NTF (Paris) / Lambert zone I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27571"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27571,'EPSG',27571,'PROJCS["NTF (Paris) / Lambert zone I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27571"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27572 : NTF (Paris) / Lambert zone II --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27572,'EPSG',27572,'PROJCS["NTF (Paris) / Lambert zone II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27572"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27572,'EPSG',27572,'PROJCS["NTF (Paris) / Lambert zone II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27572"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27573 : NTF (Paris) / Lambert zone III --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27573,'EPSG',27573,'PROJCS["NTF (Paris) / Lambert zone III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27573"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27573,'EPSG',27573,'PROJCS["NTF (Paris) / Lambert zone III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27573"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27574 : NTF (Paris) / Lambert zone IV --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27574,'EPSG',27574,'PROJCS["NTF (Paris) / Lambert zone IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27574"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27574,'EPSG',27574,'PROJCS["NTF (Paris) / Lambert zone IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27574"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27581 : NTF (Paris) / France I --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27581,'EPSG',27581,'PROJCS["NTF (Paris) / France I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27581"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27581,'EPSG',27581,'PROJCS["NTF (Paris) / France I",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",1200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27581"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27582 : NTF (Paris) / France II --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27582,'EPSG',27582,'PROJCS["NTF (Paris) / France II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27582"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27582,'EPSG',27582,'PROJCS["NTF (Paris) / France II",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",2200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27582"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27583 : NTF (Paris) / France III --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27583,'EPSG',27583,'PROJCS["NTF (Paris) / France III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27583"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27583,'EPSG',27583,'PROJCS["NTF (Paris) / France III",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",3200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27583"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27584 : NTF (Paris) / France IV --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27584,'EPSG',27584,'PROJCS["NTF (Paris) / France IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27584"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27584,'EPSG',27584,'PROJCS["NTF (Paris) / France IV",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",4185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27584"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27591 : NTF (Paris) / Nord France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27591,'EPSG',27591,'PROJCS["NTF (Paris) / Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27591"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27591,'EPSG',27591,'PROJCS["NTF (Paris) / Nord France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",55],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877341],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27591"]]','+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27592 : NTF (Paris) / Centre France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27592,'EPSG',27592,'PROJCS["NTF (Paris) / Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27592"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27592,'EPSG',27592,'PROJCS["NTF (Paris) / Centre France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",52],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99987742],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27592"]]','+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27593 : NTF (Paris) / Sud France --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27593,'EPSG',27593,'PROJCS["NTF (Paris) / Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27593"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27593,'EPSG',27593,'PROJCS["NTF (Paris) / Sud France",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.999877499],PARAMETER["false_easting",600000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27593"]]','+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27594 : NTF (Paris) / Corse --- -INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27594,'EPSG',27594,'PROJCS["NTF (Paris) / Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27594"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (27594,'EPSG',27594,'PROJCS["NTF (Paris) / Corse",GEOGCS["NTF (Paris)",DATUM["Nouvelle_Triangulation_Francaise_Paris",SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269,AUTHORITY["EPSG","7011"]],TOWGS84[-168,-60,320,0,0,0,0],AUTHORITY["EPSG","6807"]],PRIMEM["Paris",2.33722917,AUTHORITY["EPSG","8903"]],UNIT["grad",0.01570796326794897,AUTHORITY["EPSG","9105"]],AUTHORITY["EPSG","4807"]],PROJECTION["Lambert_Conformal_Conic_1SP"],PARAMETER["latitude_of_origin",46.85],PARAMETER["central_meridian",0],PARAMETER["scale_factor",0.99994471],PARAMETER["false_easting",234.358],PARAMETER["false_northing",185861.369],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27594"]]','+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs '); --- --- EPSG 27700 : OSGB 1936 / British National Grid --- diff --git a/utils/postgis_proc_upgrade.pl b/utils/postgis_proc_upgrade.pl new file mode 100755 index 000000000..eec853a1a --- /dev/null +++ b/utils/postgis_proc_upgrade.pl @@ -0,0 +1,112 @@ +#/bin/sh + +eval "exec perl -w $0 $@" + if (0); + +use strict; + +($#ARGV == 0) || die "Usage: perl postgis_funxupgrade.pl \nCreates a new SQL script to upgrade all of the PostGIS functions.\n"; + +my $NEWVERSION = "UNDEF"; + +print "BEGIN;\n"; + +open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n"; + +FUNC: +while() +{ + if (m/^create or replace function postgis_scripts_installed()/i) + { + while() + { + if ( m/SELECT .'(\d\.\d\.\d).'::text/i ) + { + $NEWVERSION = $1; + last FUNC; + } + } + } +} + +while() +{ + s/NEWVERSION/$NEWVERSION/g; + print; +} + +close(INPUT); open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n"; +while() +{ + my $checkit = 0; + if (m/^create or replace function/i) + { + $checkit = 1 if m/postgis_scripts_installed()/i; + print $_; + while() + { + if ( $checkit && m/SELECT .'(\d\.\d\.\d).'::text/i ) + { + $NEWVERSION = $1; + } + print $_; + last if m/^\s*LANGUAGE '/; + } + } + +# # This code handles aggregates by dropping and recreating them. +# # The DROP would fail on aggregates as they would not exist +# # in old postgis installations, thus we avoid this until we +# # find a better strategy. +# +# if (m/^create aggregate (.*) *\(/i) +# { +# my $aggname = $1; +# my $basetype = 'unknown'; +# my $def = $_; +# while() +# { +# $def .= $_; +# $basetype = $1 if (m/basetype *= *([^,]*) *,/); +# last if m/\);/; +# } +# print "DROP AGGREGATE $aggname($basetype);\n"; +# print "$def"; +# } + +} + +close( INPUT ); + +print "COMMIT;\n"; + +1; + +__END__ + +CREATE OR REPLACE FUNCTION postgis_script_version_check() +RETURNS text +AS ' +DECLARE + old_scripts text; + new_scripts text; + old_majmin text; + new_majmin text; +BEGIN + SELECT into old_scripts postgis_scripts_installed(); + SELECT into new_scripts ''NEWVERSION''; + SELECT into old_majmin substring(old_scripts from ''[^\.]*\.[^\.]*''); + SELECT into new_majmin substring(new_scripts from ''[^\.]*\.[^\.]*''); + + IF old_majmin != new_majmin THEN + RAISE EXCEPTION ''Scripts upgrade from version % to version % requires a dump/reload. See postgis manual for instructions'', old_scripts, new_scripts; + ELSE + RETURN ''Scripts versions checked for upgrade: ok''; + END IF; +END +' +LANGUAGE 'plpgsql'; + +SELECT postgis_script_version_check(); + +DROP FUNCTION postgis_script_version_check(); diff --git a/utils/postgis_restore.pl b/utils/postgis_restore.pl index 0e034d416..4913afe00 100644 --- a/utils/postgis_restore.pl +++ b/utils/postgis_restore.pl @@ -36,13 +36,14 @@ # pg_dump-743/pg743 => pg_restore-800/pg800 # pg_dump-800/pg800 => pg_restore-800/pg800 # - eval "exec perl -w $0 $@" if (0); -(@ARGV == 3) || die "Usage: postgis_restore.pl \nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n"; +use strict; + +(@ARGV >= 3) || die "Usage: postgis_restore.pl []\nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n"; -$DEBUG=1; +my $DEBUG=1; my %aggs = (); my %fncasts = (); @@ -98,15 +99,19 @@ my %obsoleted_function = ( 'unite_finalfunc', 1 ); -my $postgissql = $ARGV[0]; -my $dbname = $ARGV[1]; -my $dump = $ARGV[2]; +my $postgissql = $ARGV[0]; shift(@ARGV); +my $dbname = $ARGV[0]; shift(@ARGV); +my $dump = $ARGV[0]; shift(@ARGV); +my $createdb_opt = ''; my $dumplist=$dump.".list"; my $dumpascii=$dump.".ascii"; +$createdb_opt = join(' ', @ARGV) if @ARGV; + print "postgis.sql is $postgissql\n"; print "dbname is $dbname\n"; print "dumpfile is $dump\n"; +print "database creation options: $createdb_opt\n" if $createdb_opt; # # Scan postgis.sql @@ -127,7 +132,7 @@ while( my $line = ) my $geomfound = 0; for (my $i=0; $i<@args; $i++) { - $arg = lc($args[$i]); + my $arg = lc($args[$i]); #print "ARG1: [$arg]\n"; $arg =~ s/^ *//; $arg =~ s/ *$//; @@ -162,7 +167,7 @@ while( my $line = ) { for (my $i=0; $i<@args; $i++) { - $arg = $args[$i]; + my $arg = $args[$i]; $arg = 'geometry' if ($arg eq 'oldgeometry'); $args[$i] = $arg; } @@ -342,7 +347,7 @@ while( my $line = ) my $wkbinvolved = 0; for (my $i=0; $i<@args; $i++) { - $arg = lc($args[$i]); + my $arg = lc($args[$i]); $arg =~ s/^ *//; $arg =~ s/ *$//; $arg =~ s/^public.//; @@ -354,7 +359,7 @@ while( my $line = ) $wkbinvolved++ if ( $arg eq 'wkb' ); } - $args = join(', ', @args); + my $args = join(', ', @args); #print "ARGS SCALAR: [$args]\n"; my $id = $funcname."(".$args.")"; #print "ID: [$id]\n"; @@ -392,7 +397,7 @@ while( my $line = ) my @args = split(",", $3); for (my $i=0; $i<@args; $i++) { - $arg = lc($args[$i]); + my $arg = lc($args[$i]); $arg =~ s/^ *//; $arg =~ s/ *$//; $arg =~ s/^public.//; @@ -402,7 +407,7 @@ while( my $line = ) } $args[$i] = $arg; } - $args = join(', ', @args); + my $args = join(', ', @args); my $id = $name."(".$args.")"; if ( $aggs{$id} ) { @@ -595,8 +600,8 @@ close(OUTPUT); # Create the new db and install plpgsql language # print "Creating db ($dbname)\n"; -`createdb $dbname`; -die "Can't restore in an existing database\n" if ($?); +`createdb $dbname $createdb_opt`; +die "Database creation failed\n" if ($?); print "Adding plpgsql\n"; `createlang plpgsql $dbname`; diff --git a/utils/test_estimation.pl b/utils/test_estimation.pl index 5616f802d..ee7c80901 100755 --- a/utils/test_estimation.pl +++ b/utils/test_estimation.pl @@ -111,11 +111,25 @@ $SRID = $res->getvalue(0, 0); # parse extent -$EXTENT =~ /^BOX3D\((.*) (.*) (.*),(.*) (.*) (.*)\)$/; -$ext{xmin} = $1; -$ext{ymin} = $2; -$ext{xmax} = $4; -$ext{ymax} = $5; +if ( $EXTENT =~ /^BOX3D\((.*) (.*) (.*),(.*) (.*) (.*)\)$/ ) +{ + $ext{xmin} = $1; + $ext{ymin} = $2; + $ext{xmax} = $4; + $ext{ymax} = $5; +} +elsif ( $EXTENT =~ /^BOX\((.*) (.*),(.*) (.*)\)$/ ) +{ + $ext{xmin} = $1; + $ext{ymin} = $2; + $ext{xmax} = $3; + $ext{ymax} = $4; +} +else +{ + print STDERR "Couldn't parse EXTENT: $EXTENT\n"; + exit(1); +} # vacuum analyze table if ( $VACUUM ) @@ -251,9 +265,9 @@ sub test_extent # Test whole extent query $query = 'explain analyze select oid from "'. $SCHEMA.'"."'.$TABLE.'" WHERE "'.$COLUMN.'" && '. - "'SRID=$SRID;BOX3D(".$ext->{'xmin'}." ". + "setSRID('BOX3D(".$ext->{'xmin'}." ". $ext->{'ymin'}.", ".$ext->{'xmax'}." ". - $ext->{'ymax'}.")'"; + $ext->{'ymax'}.")'::BOX3D, $SRID)"; $res = $conn->exec($query); if ( $res->resultStatus != PGRES_TUPLES_OK ) { print STDERR $conn->errorMessage; @@ -272,6 +286,9 @@ sub test_extent # # $Log$ +# Revision 1.8.4.1 2005/04/18 13:28:19 strk +# Fixed to work against LWGEOM installations +# # Revision 1.8 2004/03/08 17:21:57 strk # changed error computation code to delta/totrows # diff --git a/utils/test_joinestimation.pl b/utils/test_joinestimation.pl index 1b29e1ecc..50a213ced 100755 --- a/utils/test_joinestimation.pl +++ b/utils/test_joinestimation.pl @@ -83,8 +83,8 @@ $SCHEMA2 = 'public'; $COLUMN2 = 'the_geom' if ( $COLUMN2 eq '' ); if ( $TABLE2 =~ /(.*)\.(.*)/ ) { - $SCHEMA1 = $1; - $TABLE1 = $2; + $SCHEMA2 = $1; + $TABLE2 = $2; } #connect @@ -256,6 +256,9 @@ sub get_num_rows # # $Log$ +# Revision 1.2.2.1 2005/04/18 13:49:55 strk +# Fixed bug in table2 schema parsing. +# # Revision 1.2 2004/12/23 14:48:25 strk # Fixed help string, and added a TODO item # -- 2.50.1