+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
- 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
Olivier Courtin <pnine@free.fr> on AsSVG()
Bruno Wolff III on the distance_sphere algorithm
+Version 1.0.0 of PostGIS includes code from:
+ Mark Cave-Ayland <m.cave-ayland@webbased.co.uk> with new positional
+ operators, join estimator and general testing and support.
+ Markus Schaber <markus@schabi.de> author of the jdbc2 interface
+
See the postgis manual for more contributors.
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
# 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
\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
.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
<listitem>
<para>The "<ulink
- url="http://www.opengis.org/techno/specs/99-049.pdf">Simple Features
+ url="http://www.opengis.org/docs/99-049.pdf">Simple Features
for Specification for SQL</ulink>" is available at the OpenGIS
Consortium web site: <ulink
url="http://www.opengis.org">http://www.opengis.org</ulink>.</para>
<listitem>
<para>Once your PostgreSQL installation is up-to-date, enter the
"postgis" directory, and edit the
- <filename>Makefile</filename>.</para>
+ <filename>Makefile.config</filename> file.</para>
<itemizedlist>
<listitem>
<programlisting>
# 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.
# 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
</programlisting>
</orderedlist>
<para>Also check that you have made any necessary changes to the top
- of the Makefile. This includes:</para>
+ of the Makefile.config. This includes:</para>
<orderedlist>
<listitem>
must install the Proj4 library on your system, set the
<varname>USE_PROJ</varname> variable to 1 and the
<varname>PROJ_DIR</varname> to your installation prefix in the
- Makefile.</para>
+ Makefile.config.</para>
</listitem>
<listitem>
install the GEOS library on your system, and set the
<varname>USE_GEOS</varname> to 1 and the
<varname>GEOS_DIR</varname> to your installation prefix in the
- Makefile.</para>
+ Makefile.config</para>
</listitem>
</orderedlist>
</sect2>
AsText(GEOM) AS GEOM
FROM ROADS_GEOM
WHERE
- GEOM && GeomFromText('BOX3D(191232 243117,191232 243119)'::box3d,-1);</programlisting>
+ GEOM && SetSRID('BOX3D(191232 243117,191232 243119)'::box3d,-1);</programlisting>
<para>Note the use of the SRID, to specify the projection of the
BOX3D. The value -1 is used to indicate no specified SRID.</para>
</varlistentry>
<varlistentry>
- <term>SetSRID(geometry)</term>
+ <term>SetSRID(geometry, integer)</term>
<listitem>
<para>Set the SRID on a geometry to a particular integer value.
<variablelist>
<varlistentry>
- <term>Distance(geometry,geometry)</term>
+ <term>Distance(geometry, geometry)</term>
<listitem>
<para>Return the cartesian distance between two geometries in
</varlistentry>
<varlistentry>
- <term>Equals(geometry,geometry)</term>
+ <term>Equals(geometry, geometry)</term>
<listitem>
- <para>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.</para>
+ <para>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.</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Disjoint(geometry,geometry)</term>
+ <term>Disjoint(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry is "spatially disjoint"
- from anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries are "spatially disjoint".
+ </para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Intersects(geometry,geometry)</term>
+ <term>Intersects(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry "spatially intersects"
- anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries "spatially intersect".
+ </para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Touches(geometry,geometry)</term>
+ <term>Touches(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry "spatially touches"
- anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries "spatially touch".
+ </para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Crosses(geometry,geometry)</term>
+ <term>Crosses(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry "spatially crosses"
- anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries "spatially cross".
+ </para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Within(geometry,geometry)</term>
+ <term>Within(geometry A, geometry B)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry is "spatially within"
- anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if Geometry A is "spatially within"
+ Geometry B.</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Overlaps(geometry,geometry)</term>
+ <term>Overlaps(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry is "spatially
- overlapping" anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries "spatially
+ overlap".</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Contains(geometry,geometry)</term>
+ <term>Contains(geometry A, geometry B)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry is "spatially contains"
- anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if Geometry A "spatially contains"
+ Geometry B.</para>
<para>Performed by the GEOS module</para>
boolean, not an integer.</para>
<para>OGC SPEC s2.1.1.2 // s2.1.13.3 - same as
- within(geometry,geometry)</para>
+ within(geometry B, geometry A)</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>Intersects(geometry,geometry)</term>
+ <term>Intersects(geometry, geometry)</term>
<listitem>
- <para>Returns 1 (TRUE) if this Geometry is "spatially
- intersects" anotherGeometry.</para>
+ <para>Returns 1 (TRUE) if the Geometries "spatially
+ intersect".</para>
<para>Performed by the GEOS module</para>
boolean, not an integer.</para>
<para>OGC SPEC s2.1.1.2 // s2.1.13.3 - NOT
- disjoint(geometry,geometry)</para>
+ disjoint(geometry, geometry)</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>Relate(geometry,geometry, intersectionPatternMatrix)</term>
+ <term>Relate(geometry, geometry, intersectionPatternMatrix)</term>
<listitem>
<para>Returns 1 (TRUE) if this Geometry is spatially related to
</varlistentry>
<varlistentry>
- <term>Relate(geometry,geometry)</term>
+ <term>Relate(geometry, geometry)</term>
<listitem>
<para>returns the DE-9IM (dimensionally extended
</varlistentry>
<varlistentry>
- <term>Buffer(geometry,double,[integer])</term>
+ <term>Buffer(geometry, double, [integer])</term>
<listitem>
<para>Returns a geometry that represents all points whose
</varlistentry>
<varlistentry>
- <term>Intersection(geometry,geometry)</term>
+ <term>Intersection(geometry, geometry)</term>
<listitem>
<para>Returns a geometry that represents the point set
- intersection of this Geometry with anotherGeometry.</para>
+ intersection of the Geometies.</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>SymDifference(geometry,geometry)</term>
+ <term>SymDifference(geometry A, geometry B)</term>
<listitem>
<para>Returns a geometry that represents the point set symmetric
- difference of this Geometry with anotherGeometry.</para>
+ difference of Geometry A with Geometry B.</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>Difference(geometry,geometry)</term>
+ <term>Difference(geometry A, geometry B)</term>
<listitem>
<para>Returns a geometry that represents the point set symmetric
- difference of this Geometry with anotherGeometry.</para>
+ difference of Geometry A with Geometry B.</para>
<para>Performed by the GEOS module</para>
</varlistentry>
<varlistentry>
- <term>GeomUnion(geometry,geometry)</term>
+ <term>GeomUnion(geometry, geometry)</term>
<listitem>
<para>Returns a geometry that represents the point set union of
- this Geometry with anotherGeometry.</para>
+ the Geometries.</para>
<para>Performed by the GEOS module</para>
<appendix>
<title>Release Notes</title>
+ <sect1>
+ <title>Release 1.0.2</title>
+ <para>Release date: 2005/07/04</para>
+
+ <para>
+ Contains a few bug fixes and improvements.
+ </para>
+
+ <sect2>
+ <title>Upgrading</title>
+
+ <para>If you are upgrading from
+ release 1.0.0RC6 or up you <emphasis>DO
+ NOT</emphasis> need a dump/reload.</para>
+
+ <para>Upgrading from older releases
+ requires a dump/reload.
+ See the <link
+ linkend="upgrading">upgrading</link>
+ chapter for more informations.</para>
+ </sect2>
+
+ <sect2>
+ <title>Bug fixes</title>
+ <para>Fault tolerant btree ops</para>
+ <para>Memory leak plugged in pg_error</para>
+ <para>Rtree index fix</para>
+ <para>Cleaner build scripts (avoided mix of CFLAGS and CXXFLAGS)</para>
+ </sect2>
+
+ <sect2>
+ <title>Improvements</title>
+ <para>New index creation capabilities in loader (-I switch)</para>
+ <para>Initial support for postgresql 8.1dev</para>
+ </sect2>
+
+ </sect1>
+
+ <sect1>
+ <title>Release 1.0.1</title>
+ <para>Release date: 2005/05/24</para>
+
+ <para>
+ Contains a few bug fixes and some improvements.
+ </para>
+
+ <sect2>
+ <title>Upgrading</title>
+
+ <para>If you are upgrading from
+ release 1.0.0RC6 or up you <emphasis>DO
+ NOT</emphasis> need a dump/reload.</para>
+
+ <para>Upgrading from older releases
+ requires a dump/reload.
+ See the <link
+ linkend="upgrading">upgrading</link>
+ chapter for more informations.</para>
+ </sect2>
+
+ <sect2>
+ <title>Library changes</title>
+ <para>BUGFIX in 3d computation of lenght_spheroid()</para>
+ <para>BUGFIX in join selectivity estimator</para>
+ </sect2>
+
+ <sect2>
+ <title>Other changes/additions</title>
+ <para>BUGFIX in shp2pgql escape functions</para>
+ <para>better support for concurrent postgis in multiple schemas</para>
+ <para>documentation fixes</para>
+ <para>jdbc2: compile with "-target 1.2 -source 1.2" by default</para>
+ <para>NEW -k switch for pgsql2shp</para>
+ <para>NEW support for custom createdb options in postgis_restore.pl</para>
+ <para>BUGFIX in pgsql2shp attribute names unicity enforcement</para>
+ <para>BUGFIX in Paris projections definitions</para>
+ <para>postgis_restore.pl cleanups</para>
+ </sect2>
+
+ </sect1>
+
<sect1>
<title>Release 1.0.0</title>
- <para>Release date: 2005/04/??</para>
+ <para>Release date: 2005/04/19</para>
<para>Final 1.0.0 release.
Contains a few bug fixes, some improvements
<title>Library changes</title>
<para>BUGFIX in transform() releasing random memory address</para>
<para>BUGFIX in force_3dm() allocating less memory then required</para>
+ <para>BUGFIX in join selectivity estimator (defaults, leaks, tuplecount, sd)</para>
</sect2>
<sect2>
<para>NEW -p (prepare) flag for shp2pgsql</para>
<para>NEW manual chapter about OGC compliancy enforcement</para>
<para>NEW autoconf support for JTS lib</para>
+ <para>BUGFIX in estimator testers (support for LWGEOM and schema parsing)</para>
</sect2>
</sect1>
stubcompile
jtscompile
versionstamp
+eclipsebin
# Configure the helper executables used during build.
-JAVAC?=javac
+JAVAC?=javac -target 1.2 -source 1.2
JAVA?=java
JAR?=jar
MKDIR?=mkdir -p
int includegid;
int unescapedattrs;
int binary;
+int keep_fieldname_case;
SHPObject * (*shape_creator)(byte *, int);
int big_endian = 0;
int pgis_major_version;
includegid=0;
unescapedattrs=0;
binary = 0;
+ keep_fieldname_case = 0;
#ifdef DEBUG
FILE *debug;
#endif
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);
}
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;
exit(1);
}
- res = PQexec(conn, query);
version = PQgetvalue(res, 0, 0);
ver = atoi(version);
PQclear(res);
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();
* 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;
* 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<i;j++)
+ tmpint=1;
+ for(j=0; j<dbf_nfields; j++)
{
- if(strncmp(field_name, PQgetvalue(res, j, 0),10) == 0)
+ if(!strncasecmp(field_name, dbf_flds[j], 10))
{
- printf("\nWarning: Field '%s' has first 10 characters which "
- "duplicate a previous field name's.\n"
- "Renaming it to be: '",field_name);
- strncpy(field_name,field_name,9);
- field_name[9] = 0;
- sprintf(field_name,"%s%d",field_name,i);
- printf("%s'\n\n",field_name);
+ sprintf(field_name,"%.7s_%.2d",
+ ptr,
+ tmpint++);
+ j=-1; continue;
}
}
+ /* make UPPERCASE if keep_fieldname_case = 0 */
+ if (keep_fieldname_case == 0)
+ for(j=0; j<strlen(field_name); j++)
+ field_name[j] = toupper(field_name[j]);
+
+ if ( strcasecmp(fname, field_name) ) {
+ fprintf(stderr, "Warning, field %s renamed to %s\n",
+ fname, field_name);
+ }
+
+ //fprintf(stderr, "DBFfield: %s\n", field_name);
+ dbf_flds[dbf_nfields++] = strdup(field_name);
+
/*
* Find appropriate type of dbf attributes
*/
/* integer type */
if(type == 20 || type == 21 || type == 23)
{
- if(DBFAddField(dbf, field_name,FTInteger,16,0) == -1)
+ if(DBFAddField(dbf, field_name, FTInteger,16,0) == -1)
{
printf( "error - Field could not "
"be created.\n");
//printf( "FIELD_NAME: %s, SIZE: %d\n", field_name, size);
/* generic type (use string representation) */
- if(DBFAddField(dbf, field_name,FTString,size,0) == -1)
+ if(DBFAddField(dbf, field_name, FTString, size, 0) == -1)
{
printf( "error - Field could not "
"be created.\n");
mainscan_flds[mainscan_nflds++] = fname;
}
+ /* Release dbf field memory */
+ for (i=0; i<dbf_nfields; i++) free(dbf_flds[i]);
+
/*
* If no geometry has been found
* we have finished with initialization
/**********************************************************************
* $Log$
+ * Revision 1.74.2.2 2005/05/16 17:51:17 strk
+ * BUGFIX in attribute names unicity enforcement
+ *
+ * Revision 1.74.2.1 2005/05/16 08:03:29 strk
+ * Back-ported -k patch
+ *
* Revision 1.74 2005/03/25 18:43:07 strk
* Fixed PQunescapeBytearea argument (might give problems on 64bit archs)
*
int dump_format = 0; //0=insert statements, 1 = dump
int quoteidentifiers = 0;
int forceint4 = 0;
+int createindex = 0;
char opt = ' ';
char *col_names = NULL;
char *pgtype;
int PIP( Point P, Point* V, int n );
void *safe_malloc(size_t size);
void CreateTable(void);
+void CreateIndex(void);
void usage(char *me, int exitcode);
void InsertPoint(void);
void InsertPointWKT(void);
if (toescape == 0) return str;
- size = ptr-str+toescape;
+ size = ptr-str+toescape+1;
result = calloc(1, size);
if (toescape == 0) return str;
- size = ptr-str+toescape;
+ size = ptr-str+toescape+1;
result = calloc(1, size);
*/
if(opt != 'a') CreateTable();
+ /*
+ * Create GiST index if requested
+ */
+ if(createindex) CreateIndex();
+
/*
* Generate INSERT or COPY lines
*/
printf("'%s',%d);\n", pgtype, pgdims);
}
+void
+CreateIndex(void)
+{
+ /*
+ * Create gist index
+ */
+ if ( schema )
+ {
+ printf("CREATE INDEX \"%s_%s_gist\" ON \"%s\".\"%s\" using gist (\"%s\" gist_geometry_ops);\n", table, geom, schema, table, geom);
+ }
+ else
+ {
+ printf("CREATE INDEX \"%s_%s_gist\" ON \"%s\" using gist (\"%s\" gist_geometry_ops);\n", table, geom, table, geom);
+ }
+}
+
void
LoadData(void)
{
fprintf(stderr, "\n");
fprintf(stderr, " -i Use int4 type for all integer dbf fields.\n");
fprintf(stderr, "\n");
+ fprintf(stderr, " -I Create a GiST index on the geometry column.\n");
+ fprintf(stderr, "\n");
fprintf(stderr, " -w Use wkt format (for postgis-0.x support - drops M - drifts coordinates).\n");
#ifdef USE_ICONV
fprintf(stderr, "\n");
extern char *optarg;
extern int optind;
- while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:w")) != EOF){
+ while ((c = getopt(ARGC, ARGV, "kcdapDs:g:iW:wI")) != EOF){
switch (c) {
case 'c':
if (opt == ' ')
case 'i':
forceint4 = 1;
break;
+ case 'I':
+ createindex = 1;
+ break;
case 'w':
hwgeom = 1;
break;
/**********************************************************************
* $Log$
+ * Revision 1.88.2.2 2005/07/01 14:22:40 strk
+ * backported -I switch
+ *
+ * Revision 1.88.2.1 2005/04/21 09:07:41 strk
+ * Applied patch from Ron Mayer fixing a segfault in string escaper funx
+ *
* Revision 1.88 2005/04/14 12:58:59 strk
* Applied patch by Gino Lucrezi fixing bug in string escaping code.
*
#---------------------------------------------------------------
-override CFLAGS += -g -O2 -fexceptions
-override CFLAGS += -fPIC
-#override CFLAGS += -I$(srcdir) -DFRONTEND -DSYSCONFDIR='"$(sysconfdir)"'
+CSTAR_FLAGS = -g -O2 -fPIC -fexceptions
+
override CFLAGS += -DUSE_VERSION=$(USE_VERSION)
override CFLAGS += -DPOSTGIS_LIB_VERSION='"$(POSTGIS_LIB_VERSION)"'
override CFLAGS += -DPOSTGIS_SCRIPTS_VERSION='"$(SCRIPTS_VERSION)"'
JTS_OBJ=lwgeom_nojts.o
ifeq ($(USE_GEOS),1)
- override CFLAGS += -I$(GEOS_DIR)/include -DUSE_GEOS
+ CXXFLAGS += -I$(GEOS_DIR)/include
+ CSTAR_FLAGS += -DUSE_GEOS
GEOS_RULES=detect_geos_version
GEOS_WRAPPER=lwgeom_geos_wrapper.o
JTS_OBJ=lwgeom_geos.o
endif
ifeq ($(USE_JTS),1)
- override CFLAGS += -I$(JTS_INCLUDES) -DUSE_JTS
+ CXXFLAGS += -I$(JTS_INCLUDES)
+ CSTAR_FLAGS += -DUSE_JTS
JTS_WRAPPER=lwgeom_jts_wrapper.o
JTS_OBJ=lwgeom_jts.o
endif
override DLLLIBS += $(BE_DLLLIBS)
-override CXXFLAGS := $(CFLAGS)
+override CFLAGS += $(CSTAR_FLAGS)
+override CXXFLAGS += $(CSTAR_FLAGS)
+
# memory debug for gcc 2.91, 2.95, 3.0 and 3.1
# for gcc >= 3.2.2 set GLIBCPP_FORCE_NEW at runtime instead
#override CXXFLAGS += -D__USE_MALLOC
//#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)
{
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);
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);
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);
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);
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);
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);
/***********************************************************
*
* $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
*
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);
}
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);
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);
}
(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);
}
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);
}
(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);
}
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);
}
* 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)
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);
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);
* 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 )
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:");
/**********************************************************************
* $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
*
}
-
//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)
#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"
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
#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)) ||
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);
}
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
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;
}
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...
f_table_catalog,
f_table_schema,
f_table_name,
- f_geometry_column ) );
+ f_geometry_column )
+) WITH OIDS;
-----------------------------------------------------------------------
-- RENAME_GEOMETRY_TABLE_CONSTRAINTS()
--- /dev/null
+#!/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
+
---
--- 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
---
--- /dev/null
+#/bin/sh
+
+eval "exec perl -w $0 $@"
+ if (0);
+
+use strict;
+
+($#ARGV == 0) || die "Usage: perl postgis_funxupgrade.pl <postgis.sql>\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(<INPUT>)
+{
+ if (m/^create or replace function postgis_scripts_installed()/i)
+ {
+ while(<INPUT>)
+ {
+ if ( m/SELECT .'(\d\.\d\.\d).'::text/i )
+ {
+ $NEWVERSION = $1;
+ last FUNC;
+ }
+ }
+ }
+}
+
+while(<DATA>)
+{
+ s/NEWVERSION/$NEWVERSION/g;
+ print;
+}
+
+close(INPUT); open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n";
+while(<INPUT>)
+{
+ my $checkit = 0;
+ if (m/^create or replace function/i)
+ {
+ $checkit = 1 if m/postgis_scripts_installed()/i;
+ print $_;
+ while(<INPUT>)
+ {
+ 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(<INPUT>)
+# {
+# $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();
# 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 <postgis.sql> <db> <dump>\nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n";
+use strict;
+
+(@ARGV >= 3) || die "Usage: postgis_restore.pl <postgis.sql> <db> <dump> [<createdb_options>]\nRestore a custom dump (pg_dump -Fc) of a postgis enabled database.\n";
-$DEBUG=1;
+my $DEBUG=1;
my %aggs = ();
my %fncasts = ();
'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
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/ *$//;
{
for (my $i=0; $i<@args; $i++)
{
- $arg = $args[$i];
+ my $arg = $args[$i];
$arg = 'geometry' if ($arg eq 'oldgeometry');
$args[$i] = $arg;
}
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.//;
$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";
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.//;
}
$args[$i] = $arg;
}
- $args = join(', ', @args);
+ my $args = join(', ', @args);
my $id = $name."(".$args.")";
if ( $aggs{$id} )
{
# 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`;
# 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 )
# 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;
#
# $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
#
$COLUMN2 = 'the_geom' if ( $COLUMN2 eq '' );
if ( $TABLE2 =~ /(.*)\.(.*)/ )
{
- $SCHEMA1 = $1;
- $TABLE1 = $2;
+ $SCHEMA2 = $1;
+ $TABLE2 = $2;
}
#connect
#
# $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
#