]> granicus.if.org Git - postgis/commitdiff
Fixes the following shp2pgsql issues:
authorPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 18 Mar 2011 15:40:31 +0000 (15:40 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 18 Mar 2011 15:40:31 +0000 (15:40 +0000)
#229: A new "-r" command line parameter to specify a "from" SRID for reprojecting (the existing -s is the "to").
#779: -S now works for points, and -w is documented.
#864: MULTIPOINT shapefiles with single-vertex points now correctly load with all MULTIPOINTs.
#865: no longer crashes when both -g and -G are used.

git-svn-id: http://svn.osgeo.org/postgis/trunk@6922 b70326c6-7e19-0410-871a-916f4a2858ee

125 files changed:
doc/man/shp2pgsql.1
doc/using_postgis_dataman.xml
loader/shp2pgsql-cli.c
loader/shp2pgsql-core.c
loader/shp2pgsql-core.h
loader/shp2pgsql-gui.c
regress/Makefile.in
regress/loader/Arc-w.select.expected [moved from regress/loader/Arc-wkb.expected with 100% similarity]
regress/loader/Arc.select.expected [moved from regress/loader/Arc-wkt.expected with 100% similarity]
regress/loader/Arc.select.sql [moved from regress/loader/ArcM-wkb.sql with 100% similarity]
regress/loader/Arc.shp.expected [new file with mode: 0644]
regress/loader/ArcM-w.select.expected [moved from regress/loader/ArcM-wkb.expected with 100% similarity]
regress/loader/ArcM-wkt.expected [deleted file]
regress/loader/ArcM-wkt.sql [deleted file]
regress/loader/ArcM.select.expected [new file with mode: 0644]
regress/loader/ArcM.select.sql [moved from regress/loader/Arc-wkb.sql with 99% similarity]
regress/loader/ArcM.shp.expected [new file with mode: 0644]
regress/loader/ArcZ-w.select.expected [new file with mode: 0644]
regress/loader/ArcZ-wkb.expected [deleted file]
regress/loader/ArcZ-wkt.expected [deleted file]
regress/loader/ArcZ.select.expected [new file with mode: 0644]
regress/loader/ArcZ.select.sql [moved from regress/loader/Arc-wkt.sql with 99% similarity]
regress/loader/ArcZ.shp.expected [new file with mode: 0644]
regress/loader/MultiPoint-w.select.expected [moved from regress/loader/MultiPoint-wkb.expected with 100% similarity]
regress/loader/MultiPoint.select.expected [moved from regress/loader/MultiPoint-wkt.expected with 100% similarity]
regress/loader/MultiPoint.select.sql [moved from regress/loader/MultiPoint-wkb.sql with 100% similarity]
regress/loader/MultiPoint.shp.expected [new file with mode: 0644]
regress/loader/MultiPointM-w.select.expected [moved from regress/loader/MultiPointM-wkb.expected with 100% similarity]
regress/loader/MultiPointM-wkt.expected [deleted file]
regress/loader/MultiPointM.select.expected [new file with mode: 0644]
regress/loader/MultiPointM.select.sql [moved from regress/loader/MultiPoint-wkt.sql with 100% similarity]
regress/loader/MultiPointM.shp.expected [new file with mode: 0644]
regress/loader/MultiPointZ-w.select.expected [moved from regress/loader/MultiPointZ-wkb.expected with 100% similarity]
regress/loader/MultiPointZ-wkt.expected [deleted file]
regress/loader/MultiPointZ.select.expected [new file with mode: 0644]
regress/loader/MultiPointZ.select.sql [moved from regress/loader/MultiPointM-wkb.sql with 100% similarity]
regress/loader/MultiPointZ.shp.expected [new file with mode: 0644]
regress/loader/MultiToSinglePoint-w.select.expected [new file with mode: 0644]
regress/loader/MultiToSinglePoint.dbf [new file with mode: 0644]
regress/loader/MultiToSinglePoint.opts [new file with mode: 0644]
regress/loader/MultiToSinglePoint.select.expected [new file with mode: 0644]
regress/loader/MultiToSinglePoint.select.sql [moved from regress/loader/MultiPointM-wkt.sql with 100% similarity]
regress/loader/MultiToSinglePoint.shp [new file with mode: 0644]
regress/loader/MultiToSinglePoint.shp.expected [new file with mode: 0644]
regress/loader/MultiToSinglePoint.shx [new file with mode: 0644]
regress/loader/NoTransPoint-w.select.expected [moved from regress/loader/NoTransPoint-wkb.expected with 100% similarity]
regress/loader/NoTransPoint.select.expected [moved from regress/loader/NoTransPoint-wkt.expected with 100% similarity]
regress/loader/NoTransPoint.select.sql [moved from regress/loader/MultiPointZ-wkb.sql with 100% similarity]
regress/loader/NoTransPoint.shp.expected [new file with mode: 0644]
regress/loader/NotReallyMultiPoint-w.select.expected [new file with mode: 0644]
regress/loader/NotReallyMultiPoint.dbf [new file with mode: 0644]
regress/loader/NotReallyMultiPoint.select.expected [new file with mode: 0644]
regress/loader/NotReallyMultiPoint.select.sql [moved from regress/loader/MultiPointZ-wkt.sql with 100% similarity]
regress/loader/NotReallyMultiPoint.shp [new file with mode: 0644]
regress/loader/NotReallyMultiPoint.shp.expected [new file with mode: 0644]
regress/loader/NotReallyMultiPoint.shx [new file with mode: 0644]
regress/loader/Point-w.select.expected [moved from regress/loader/Point-wkb.expected with 100% similarity]
regress/loader/Point.select.expected [moved from regress/loader/Point-wkt.expected with 100% similarity]
regress/loader/Point.select.sql [moved from regress/loader/NoTransPoint-wkb.sql with 100% similarity]
regress/loader/Point.shp.expected [new file with mode: 0644]
regress/loader/PointM-w.select.expected [moved from regress/loader/PointM-wkb.expected with 100% similarity]
regress/loader/PointM-wkt.expected [deleted file]
regress/loader/PointM.select.expected [new file with mode: 0644]
regress/loader/PointM.select.sql [moved from regress/loader/PointM-wkb.sql with 100% similarity]
regress/loader/PointM.shp.expected [new file with mode: 0644]
regress/loader/PointZ-w.select.expected [moved from regress/loader/PointZ-wkb.expected with 100% similarity]
regress/loader/PointZ-wkb.sql [deleted file]
regress/loader/PointZ-wkt.expected [deleted file]
regress/loader/PointZ-wkt.sql [deleted file]
regress/loader/PointZ.select.expected [new file with mode: 0644]
regress/loader/PointZ.select.sql [moved from regress/loader/PointM-wkt.sql with 100% similarity]
regress/loader/PointZ.shp.expected [new file with mode: 0644]
regress/loader/Polygon-w.select.expected [moved from regress/loader/Polygon-wkb.expected with 100% similarity]
regress/loader/Polygon.select.expected [moved from regress/loader/Polygon-wkt.expected with 100% similarity]
regress/loader/Polygon.select.sql [moved from regress/loader/NoTransPoint-wkt.sql with 100% similarity]
regress/loader/Polygon.shp.expected [new file with mode: 0644]
regress/loader/PolygonM-w.select.expected [moved from regress/loader/PolygonM-wkb.expected with 100% similarity]
regress/loader/PolygonM.select.expected [new file with mode: 0644]
regress/loader/PolygonM.select.sql [moved from regress/loader/Point-wkb.sql with 100% similarity]
regress/loader/PolygonM.shp.expected [new file with mode: 0644]
regress/loader/PolygonZ-w.select.expected [moved from regress/loader/PolygonZ-wkb.expected with 100% similarity]
regress/loader/PolygonZ-wkb.sql [deleted file]
regress/loader/PolygonZ-wkt.expected [deleted file]
regress/loader/PolygonZ-wkt.sql [deleted file]
regress/loader/PolygonZ.select.expected [new file with mode: 0644]
regress/loader/PolygonZ.select.sql [moved from regress/loader/Point-wkt.sql with 100% similarity]
regress/loader/PolygonZ.shp.expected [new file with mode: 0644]
regress/loader/README
regress/loader/ReprojectPts-pre.sql [new file with mode: 0644]
regress/loader/ReprojectPts-w.select.expected [new file with mode: 0644]
regress/loader/ReprojectPts.dbf [new file with mode: 0644]
regress/loader/ReprojectPts.opts [new file with mode: 0644]
regress/loader/ReprojectPts.select.expected [new file with mode: 0644]
regress/loader/ReprojectPts.select.sql [moved from regress/loader/Polygon-wkb.sql with 100% similarity]
regress/loader/ReprojectPts.shp [new file with mode: 0644]
regress/loader/ReprojectPts.shx [new file with mode: 0644]
regress/loader/ReprojectPtsGeog-pre.sql [new file with mode: 0644]
regress/loader/ReprojectPtsGeog-w.select.expected [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.dbf [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.opts [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.select.expected [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.select.sql [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.shp [new file with mode: 0644]
regress/loader/ReprojectPtsGeog.shx [new file with mode: 0644]
regress/loader/TSIPolygon-w.select.expected [moved from regress/loader/PolygonM-wkt.expected with 100% similarity]
regress/loader/TSIPolygon-wkb.sql [deleted file]
regress/loader/TSIPolygon-wkt.sql [deleted file]
regress/loader/TSIPolygon.select.expected [moved from regress/loader/TSIPolygon-wkb.expected with 100% similarity]
regress/loader/TSIPolygon.select.sql [moved from regress/loader/Polygon-wkt.sql with 100% similarity]
regress/loader/TSIPolygon.shp.expected [new file with mode: 0644]
regress/loader/TSTIPolygon-w.select.expected [moved from regress/loader/TSIPolygon-wkt.expected with 100% similarity]
regress/loader/TSTIPolygon-wkb.sql [deleted file]
regress/loader/TSTIPolygon-wkt.sql [deleted file]
regress/loader/TSTIPolygon.select.expected [moved from regress/loader/TSTIPolygon-wkb.expected with 100% similarity]
regress/loader/TSTIPolygon.select.sql [moved from regress/loader/PolygonM-wkb.sql with 100% similarity]
regress/loader/TSTIPolygon.shp.expected [new file with mode: 0644]
regress/loader/TSTPolygon-w.select.expected [moved from regress/loader/TSTIPolygon-wkt.expected with 100% similarity]
regress/loader/TSTPolygon-wkb.sql [deleted file]
regress/loader/TSTPolygon-wkt.expected [deleted file]
regress/loader/TSTPolygon-wkt.sql [deleted file]
regress/loader/TSTPolygon.select.expected [moved from regress/loader/TSTPolygon-wkb.expected with 100% similarity]
regress/loader/TSTPolygon.select.sql [moved from regress/loader/PolygonM-wkt.sql with 100% similarity]
regress/loader/TSTPolygon.shp.expected [new file with mode: 0644]
regress/out_geometry.sql
regress/run_test

index ca293f5ddfbc75a9e2d18ab518bcd349b9a21a9f..12dee56bcb3188b937353a10ece04ea11cdb6169 100644 (file)
@@ -53,6 +53,10 @@ Use the PostgreSQL "dump" format for the output data. This can be combined
 with -a, -c and -d. It is much faster to load than the default "insert" SQL
 format. Use this for very large data sets.
 .TP 
+\fB\-w\fR
+Output WKT format, instead of WKB.  Note that this can
+introduce coordinate drifts due to loss of precision.
+.TP 
 \fB\-e\fR
 Execute each statement on its own, without using a transaction.
 This allows loading of the majority of good data when there are some bad
@@ -62,6 +66,17 @@ geometries that generate errors.  Note that this cannot be used with the
 \fB\-s\fR <\fISRID\fR>
 Creates and populates the geometry tables with the specified SRID.
 .TP 
+\fB\-r\fR <\fISRID\fR>
+Specifies that the input shapefile uses the given SRID.  If -s is not
+specified, this SRID will be used to populate the geometry table. If
+-s is specified, the geometries will be reprojected to the SRID given
+in the -s parameter.  If -G is specified, but -s is not, the geometries
+will be reprojected to 4326.  This parameter cannot be used with -D.
+.TP 
+\fB\-G\fR
+Use the geography type instead of geometry.  Geography is used to store
+lat/lon data.  At the moment the only spatial reference supported is 4326.
+.TP 
 \fB\-g\fR <\fIgeometry_column\fR>
 Specify the name of the geometry column (mostly useful in append mode).
 .TP 
index 63b44d3b9b287e282464b13ce1fb151258000015..12ce0093c60fabb47d079a34895be1f94c98bebd 100644 (file)
@@ -1734,6 +1734,19 @@ COMMIT;</programlisting>
       </listitem>
     </varlistentry>
 
+    <varlistentry>
+      <term>-r &lt;SRID&gt;</term>
+      <listitem>
+        <para>
+          Specifies that the input shapefile uses the given SRID.  If -s is not
+          specified, this SRID will be used to populate the geometry table. If
+          -s is specified, the geometries will be reprojected to the SRID given
+          in the -s parameter.  If -G is specified, but -s is not, the geometries
+          will be reprojected to 4326.  This parameter cannot be used with -D.
+        </para>
+      </listitem>
+    </varlistentry>
+
     <varlistentry>
       <term>-k</term>
       <listitem>
@@ -1766,7 +1779,9 @@ COMMIT;</programlisting>
       <term>-S </term>
       <listitem>
         <para>
-          Generate simple geometries instead of MULTI geometries.
+          Generate simple geometries instead of MULTI geometries.  Will only succeed if
+          all the geometries are actually single (I.E. a MULTIPOLYGON with a single shell, or
+          or a MULTIPOINT with a single vertex).
         </para>
       </listitem>
     </varlistentry>
@@ -1775,8 +1790,20 @@ COMMIT;</programlisting>
       <term>-w</term>
       <listitem>
         <para>
-          Output WKT format, for use with older (0.x) versions of PostGIS. Note that this will
-          introduce coordinate drifts and will drop M values from shapefiles.
+          Output WKT format, instead of WKB.  Note that this can
+          introduce coordinate drifts due to loss of precision.
+        </para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>-e</term>
+      <listitem>
+        <para>
+          Execute each statement on its own, without using a transaction.
+          This allows loading of the majority of good data when there are some bad
+          geometries that generate errors.  Note that this cannot be used with the
+          -D flag as the "dump" format always uses a transaction.
         </para>
       </listitem>
     </varlistentry>
@@ -1819,6 +1846,25 @@ COMMIT;</programlisting>
                </para>
          </listitem>
        </varlistentry>
+    <varlistentry>
+      <term>-T &lt;tablespace&gt;</term>
+      <listitem>
+        <para>
+          Specify the tablespace for the new table.  Indexes will still use the
+          default tablespace unless the -X parameter is also used.  The PostgreSQL
+          documentation has a good description on when to use custom tablespaces.
+        </para>
+      </listitem>
+    </varlistentry>
+    <varlistentry>
+      <term>-X &lt;tablespace&gt;</term>
+      <listitem>
+        <para>
+          Specify the tablespace for the new table's indexes.  This applies to
+          the primary key index, and the GIST spatial index if -I is also used.
+        </para>
+      </listitem>
+    </varlistentry>
   </variablelist>
 
   <para>
index e98deada0bf7124dc0a8b0846762c88b1519c677..64db3ffa4eb33ca249d70bf196ce7c1147cc35a0 100644 (file)
@@ -22,8 +22,10 @@ usage()
        printf(_( "RELEASE: %s (r%s)\n" ), POSTGIS_VERSION, RCSID);
        printf(_( "USAGE: shp2pgsql [<options>] <shapefile> [<schema>.]<table>\n"
                  "OPTIONS:\n" ));
-       printf(_( "  -s <srid>  Set the SRID field. Defaults to -1.\n"
-                 " (-d|a|c|p) These are mutually exclusive options:\n"
+       printf(_( "  -s <srid>  Set the SRID field. Defaults to %d.\n"
+                 "  -r <srid>  Specify the SRID to reproject from (if -s or -G is also used).\n"
+                 "      Cannot be used with -D.\n"), SRID_UNKNOWN);
+       printf(_( " (-d|a|c|p) These are mutually exclusive options:\n"
                  "     -d  Drops the table, then recreates it and populates\n"
                  "         it with current shape file data.\n"
                  "     -a  Appends shape file into current table, must be\n"
@@ -36,11 +38,13 @@ usage()
        printf(_( "  -D  Use postgresql dump format (defaults to SQL insert statments).\n" ));
        printf(_( "  -e  Execute each statement individually, do not use a transaction.\n"
                  "      Not compatible with -D.\n" ));
-       printf(_( "  -G  Use geography type (requires lon/lat data).\n" ));
+       printf(_( "  -G  Use geography type (requires lon/lat data or -r to reproject).\n" ));
        printf(_( "  -k  Keep postgresql identifiers case.\n" ));
        printf(_( "  -i  Use int4 type for all integer dbf fields.\n" ));
        printf(_( "  -I  Create a spatial index on the geocolumn.\n" ));
        printf(_( "  -S  Generate simple geometries instead of MULTI geometries.\n" ));
+       printf(_( "  -w  Output WKT instead of WKB.  Note that this can result in\n"
+                 "      coordinate drift.\n" ));
        printf(_( "  -W <encoding> Specify the character encoding of Shape's\n"
                  "      attribute column. (default: \"UTF-8\")\n" ));
        printf(_( "  -N <policy> NULL geometries handling policy (insert*,skip,abort).\n" ));
@@ -82,7 +86,7 @@ main (int argc, char **argv)
        set_config_defaults(config);
 
        /* Keep the flag list alphabetic so it's easy to see what's left. */
-       while ((c = pgis_getopt(argc, argv, "acdeg:iknps:wDGIN:ST:W:X:")) != EOF)
+       while ((c = pgis_getopt(argc, argv, "acdeg:iknpr:s:wDGIN:ST:W:X:")) != EOF)
        {
                switch (c)
                {
@@ -100,6 +104,11 @@ main (int argc, char **argv)
                                fprintf(stderr, "Cannot use both -D and -e.\n");
                                exit(1);
                        }
+                       if (config->shp_sr_id != SRID_UNKNOWN)
+                       {
+                               fprintf(stderr, "Cannot use both -D and -r.\n");
+                               exit(1);
+                       }
                        break;
 
                case 'G':
@@ -122,9 +131,26 @@ main (int argc, char **argv)
                                exit(0);
                        }
                        break;
+               case 'r':
+                       if (config->dump_format)
+                       {
+                               fprintf(stderr, "Cannot use both -D and -r.\n");
+                               exit(1);
+                       }
+                       if (pgis_optarg)
+                       {
+                               sscanf(pgis_optarg, "%d", &(config->shp_sr_id));
+                       }
+                       else
+                       {
+                               /* With -r, user must specify SRID */
+                               usage();
+                               exit(0);
+                       }
+                       break;
 
                case 'g':
-                       config->geom = pgis_optarg;
+                       config->geo_col = pgis_optarg;
                        break;
 
                case 'k':
@@ -140,7 +166,7 @@ main (int argc, char **argv)
                        break;
 
                case 'w':
-                       config->hwgeom = 1;
+                       config->use_wkt = 1;
                        break;
 
                case 'n':
@@ -263,14 +289,6 @@ main (int argc, char **argv)
                        strtolower(config->schema);
        }
 
-       /* Make the geocolumn name consistent with the load type (geometry or geography) */
-       if ( config->geography )
-       {
-               if (config->geom) free(config->geom);
-               config->geom = strdup(GEOGRAPHY_DEFAULT);
-       }
-
-
        /* Create the shapefile state object */
        state = ShpLoaderCreate(config);
 
index 0d627d09126d48c6d4574d74c3136e7c17000ab1..9f016dfd4fce6fad1c04e7d876f1a09e20e46892 100644 (file)
@@ -49,7 +49,7 @@ int utf8(const char *fromcode, char *inputbuf, char **outputbuf);
 char *escape_copy_string(char *str);
 char *escape_insert_string(char *str);
 
-int GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry);
+int GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry, int force_multi);
 int GenerateLineStringGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry);
 int PIP(Point P, Point *V, int n);
 int FindPolygons(SHPObject *obj, Ring ***Out);
@@ -243,33 +243,24 @@ escape_insert_string(char *str)
 
 /**
  * @brief Generate an allocated geometry string for shapefile object obj using the state parameters
+ * if "force_multi" is true, single points will instead be created as multipoints with a single vertice.
  */
 int
-GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
+GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry, int force_multi)
 {
        LWGEOM **lwmultipoints;
        LWGEOM *lwgeom = NULL;
 
        POINT4D point4d;
 
-       int dims = 0, hasz = 0, hasm = 0;
+       int dims = 0;
        int u;
 
        char *mem;
        size_t mem_length;
 
-
-       /* Determine the correct dimensions: note that in hwgeom-compatible mode we cannot use
-          the M coordinate */
-       if (state->wkbtype & WKBZOFFSET)
-               hasz = 1;
-
-       if (!state->config->hwgeom)
-               if (state->wkbtype & WKBMOFFSET)
-                       hasm = 1;
-
-       FLAGS_SET_Z(dims, hasz?1:0);
-       FLAGS_SET_M(dims, hasm?1:0);
+       FLAGS_SET_Z(dims, state->has_z);
+       FLAGS_SET_M(dims, state->has_m);
 
        /* Allocate memory for our array of LWPOINTs and our dynptarrays */
        lwmultipoints = malloc(sizeof(LWPOINT *) * obj->nVertices);
@@ -278,29 +269,29 @@ GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
        for (u = 0; u < obj->nVertices; u++)
        {
                /* Create a ptarray containing a single point */
-               POINTARRAY *pa = ptarray_construct_empty(hasz, hasm, 1);
+               POINTARRAY *pa = ptarray_construct_empty(state->has_z, state->has_m, 1);
                
                /* Generate the point */
                point4d.x = obj->padfX[u];
                point4d.y = obj->padfY[u];
 
-               if (state->wkbtype & WKBZOFFSET)
+               if (state->has_z)
                        point4d.z = obj->padfZ[u];
-               if (state->wkbtype & WKBMOFFSET)
+               if (state->has_m)
                        point4d.m = obj->padfM[u];
 
                /* Add in the point! */
                ptarray_append_point(pa, &point4d, REPEATED_POINTS_OK);
 
                /* Generate the LWPOINT */
-               lwmultipoints[u] = lwpoint_as_lwgeom(lwpoint_construct(state->config->sr_id, NULL, pa));
+               lwmultipoints[u] = lwpoint_as_lwgeom(lwpoint_construct(state->from_srid, NULL, pa));
        }
 
        /* If we have more than 1 vertex then we are working on a MULTIPOINT and so generate a MULTIPOINT
        rather than a POINT */
-       if (obj->nVertices > 1)
+       if ((obj->nVertices > 1) || force_multi)
        {
-               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTIPOINTTYPE, state->config->sr_id, NULL, obj->nVertices, lwmultipoints));
+               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTIPOINTTYPE, state->from_srid, NULL, obj->nVertices, lwmultipoints));
        }
        else
        {
@@ -308,14 +299,12 @@ GeneratePointGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
                lwfree(lwmultipoints);
        }
 
-       if (state->config->hwgeom)
+       if (state->config->use_wkt)
        {
-               /* Old style "heavy" geometries (PostGIS < 1.0) */
                mem = lwgeom_to_wkt(lwgeom, WKT_EXTENDED, 12, &mem_length);
        }
        else
        {
-               /* New "lightweight" geometries (PostGIS >= 1.0) */
                mem = lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, &mem_length);
        }
 
@@ -345,23 +334,14 @@ GenerateLineStringGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometr
        LWGEOM **lwmultilinestrings;
        LWGEOM *lwgeom = NULL;
        POINT4D point4d;
-       int dims = 0, hasz = 0, hasm = 0;
+       int dims = 0;
        int u, v, start_vertex, end_vertex;
        char *mem;
        size_t mem_length;
 
 
-       /* Determine the correct dimensions: note that in hwgeom-compatible mode we cannot use
-          the M coordinate */
-       if (state->wkbtype & WKBZOFFSET)
-               hasz = 1;
-
-       if (!state->config->hwgeom)
-               if (state->wkbtype & WKBMOFFSET)
-                       hasm = 1;
-
-       FLAGS_SET_Z(dims, hasz?1:0);
-       FLAGS_SET_M(dims, hasm?1:0);
+       FLAGS_SET_Z(dims, state->has_z);
+       FLAGS_SET_M(dims, state->has_m);
 
        if (state->config->simple_geometries == 1 && obj->nParts > 1)
        {
@@ -377,7 +357,7 @@ GenerateLineStringGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometr
        for (u = 0; u < obj->nParts; u++)
        {
                /* Create a ptarray containing the line points */
-               POINTARRAY *pa = ptarray_construct_empty(hasz, hasm, obj->nParts);
+               POINTARRAY *pa = ptarray_construct_empty(state->has_z, state->has_m, obj->nParts);
 
                /* Set the start/end vertices depending upon whether this is
                a MULTILINESTRING or not */
@@ -394,22 +374,22 @@ GenerateLineStringGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometr
                        point4d.x = obj->padfX[v];
                        point4d.y = obj->padfY[v];
 
-                       if (state->wkbtype & WKBZOFFSET)
+                       if (state->has_z)
                                point4d.z = obj->padfZ[v];
-                       if (state->wkbtype & WKBMOFFSET)
+                       if (state->has_m)
                                point4d.m = obj->padfM[v];
 
                        ptarray_append_point(pa, &point4d, REPEATED_POINTS_NOT_OK);
                }
 
                /* Generate the LWLINE */
-               lwmultilinestrings[u] = lwline_as_lwgeom(lwline_construct(state->config->sr_id, NULL, pa));
+               lwmultilinestrings[u] = lwline_as_lwgeom(lwline_construct(state->from_srid, NULL, pa));
        }
 
        /* If using MULTILINESTRINGs then generate the serialized collection, otherwise just a single LINESTRING */
        if (state->config->simple_geometries == 0)
        {
-               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTILINETYPE, state->config->sr_id, NULL, obj->nParts, lwmultilinestrings));
+               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTILINETYPE, state->from_srid, NULL, obj->nParts, lwmultilinestrings));
        }
        else
        {
@@ -417,7 +397,7 @@ GenerateLineStringGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometr
                lwfree(lwmultilinestrings);
        }
 
-       if (!state->config->hwgeom)
+       if (!state->config->use_wkt)
                mem = lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, &mem_length);
        else
                mem = lwgeom_to_wkt(lwgeom, WKT_EXTENDED, 12, &mem_length);
@@ -647,22 +627,13 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
 
        POINT4D point4d;
 
-       int dims = 0, hasz = 0, hasm = 0;
+       int dims = 0;
 
        char *mem;
        size_t mem_length;
 
-       /* Determine the correct dimensions: note that in hwgeom-compatible mode we cannot use
-          the M coordinate */
-       if (state->wkbtype & WKBZOFFSET)
-               hasz = 1;
-
-       if (!state->config->hwgeom)
-               if (state->wkbtype & WKBMOFFSET)
-                       hasm = 1;
-
-       FLAGS_SET_Z(dims, hasz?1:0);
-       FLAGS_SET_M(dims, hasm?1:0);
+       FLAGS_SET_Z(dims, state->has_z);
+       FLAGS_SET_M(dims, state->has_m);
 
        polygon_total = FindPolygons(obj, &Outer);
 
@@ -679,7 +650,7 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
        /* Cycle through each individual polygon */
        for (pi = 0; pi < polygon_total; pi++)
        {
-               LWPOLY *lwpoly = lwpoly_construct_empty(state->config->sr_id, hasz, hasm);
+               LWPOLY *lwpoly = lwpoly_construct_empty(state->from_srid, state->has_z, state->has_m);
                
                Ring *polyring;
                int ring_index = 0;
@@ -699,7 +670,7 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
                while (polyring)
                {
                        /* Create a POINTARRAY containing the points making up the ring */
-                       POINTARRAY *pa = ptarray_construct_empty(hasz, hasm, polyring->n);
+                       POINTARRAY *pa = ptarray_construct_empty(state->has_z, state->has_m, polyring->n);
 
                        for (vi = 0; vi < polyring->n; vi++)
                        {
@@ -707,9 +678,9 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
                                point4d.x = polyring->list[vi].x;
                                point4d.y = polyring->list[vi].y;
 
-                               if (state->wkbtype & WKBZOFFSET)
+                               if (state->has_z)
                                        point4d.z = polyring->list[vi].z;
-                               if (state->wkbtype & WKBMOFFSET)
+                               if (state->has_m)
                                        point4d.m = polyring->list[vi].m;
 
                                ptarray_append_point(pa, &point4d, REPEATED_POINTS_OK);
@@ -729,7 +700,7 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
        /* If using MULTIPOLYGONS then generate the serialized collection, otherwise just a single POLYGON */
        if (state->config->simple_geometries == 0)
        {
-               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTIPOLYGONTYPE, state->config->sr_id, NULL, polygon_total, lwpolygons));
+               lwgeom = lwcollection_as_lwgeom(lwcollection_construct(MULTIPOLYGONTYPE, state->from_srid, NULL, polygon_total, lwpolygons));
        }
        else
        {
@@ -737,7 +708,7 @@ GeneratePolygonGeometry(SHPLOADERSTATE *state, SHPObject *obj, char **geometry)
                lwfree(lwpolygons);
        }
 
-       if (!state->config->hwgeom)
+       if (!state->config->use_wkt)
                mem = lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, &mem_length);
        else
                mem = lwgeom_to_wkt(lwgeom, WKT_EXTENDED, 12, &mem_length);
@@ -784,7 +755,7 @@ set_config_defaults(SHPLOADERCONFIG *config)
        config->opt = 'c';
        config->table = NULL;
        config->schema = NULL;
-       config->geom = strdup(GEOMETRY_DEFAULT);
+       config->geo_col = NULL;
        config->shp_file = NULL;
        config->dump_format = 0;
        config->simple_geometries = 0;
@@ -795,8 +766,9 @@ set_config_defaults(SHPLOADERCONFIG *config)
        config->readshape = 1;
        config->encoding = strdup(ENCODING_DEFAULT);
        config->null_policy = POLICY_NULL_INSERT;
-       config->sr_id = -1;
-       config->hwgeom = 0;
+       config->sr_id = SRID_UNKNOWN;
+       config->shp_sr_id = SRID_UNKNOWN;
+       config->use_wkt = 0;
        config->tablespace = NULL;
        config->idxtablespace = NULL;
        config->usetransaction = 1;
@@ -815,12 +787,39 @@ ShpLoaderCreate(SHPLOADERCONFIG *config)
        /* Set any state defaults */
        state->hSHPHandle = NULL;
        state->hDBFHandle = NULL;
-       state->wkbtype = 0;
+       state->has_z = 0;
+       state->has_m = 0;
        state->types = NULL;
        state->widths = NULL;
        state->precisions = NULL;
        state->col_names = NULL;
 
+       state->from_srid = config->shp_sr_id;
+       state->to_srid = config->sr_id;
+       /* If only one has a valid SRID, use it for both. */
+       if (state->to_srid == SRID_UNKNOWN)
+       {
+               if (config->geography)
+               {
+                       state->to_srid = 4326;
+               }
+               else
+               {
+                       state->to_srid = state->from_srid;
+               }
+       }
+       if (state->from_srid == SRID_UNKNOWN)
+       {
+               state->from_srid = state->to_srid;
+       }
+
+       /* If the geo col name is not set, use one of the defaults. */
+       state->geo_col = config->geo_col;
+       if (!state->geo_col)
+       {
+               state->geo_col = strdup(config->geography ? GEOGRAPHY_DEFAULT : GEOMETRY_DEFAULT);
+       }
+
        return state;
 }
 
@@ -892,155 +891,114 @@ ShpLoaderOpenShape(SHPLOADERSTATE *state)
                }
 
                /* Check the shapefile type */
+               int geomtype = 0;
                switch (state->shpfiletype)
                {
                case SHPT_POINT:
                        /* Point */
                        state->pgtype = "POINT";
-                       state->wkbtype = POINTTYPE;
+                       geomtype = POINTTYPE;
                        state->pgdims = 2;
                        break;
 
                case SHPT_ARC:
                        /* PolyLine */
                        state->pgtype = "MULTILINESTRING";
-                       state->wkbtype = MULTILINETYPE ;
+                       geomtype = MULTILINETYPE ;
                        state->pgdims = 2;
                        break;
 
                case SHPT_POLYGON:
                        /* Polygon */
                        state->pgtype = "MULTIPOLYGON";
-                       state->wkbtype = MULTIPOLYGONTYPE;
+                       geomtype = MULTIPOLYGONTYPE;
                        state->pgdims = 2;
                        break;
 
                case SHPT_MULTIPOINT:
                        /* MultiPoint */
                        state->pgtype = "MULTIPOINT";
-                       state->wkbtype = MULTIPOINTTYPE;
+                       geomtype = MULTIPOINTTYPE;
                        state->pgdims = 2;
                        break;
 
                case SHPT_POINTM:
                        /* PointM */
-                       state->wkbtype = POINTTYPE | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                       {
-                               state->pgtype = "POINTM";
-                               state->pgdims = 3;
-                               state->istypeM = 1;
-                       }
-                       else
-                       {
-                               state->pgtype = "POINT";
-                               state->pgdims = 2;
-                       }
+                       geomtype = POINTTYPE;
+                       state->has_m = 1;
+                       state->pgtype = "POINTM";
+                       state->pgdims = 3;
+                       state->istypeM = 1;
                        break;
 
                case SHPT_ARCM:
                        /* PolyLineM */
-                       state->wkbtype = MULTILINETYPE | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                       {
-                               state->pgtype = "MULTILINESTRINGM";
-                               state->pgdims = 3;
-                               state->istypeM = 1;
-                       }
-                       else
-                       {
-                               state->pgtype = "MULTILINESTRING";
-                               state->pgdims = 2;
-                       }
+                       geomtype = MULTILINETYPE;
+                       state->has_m = 1;
+                       state->pgtype = "MULTILINESTRINGM";
+                       state->pgdims = 3;
+                       state->istypeM = 1;
                        break;
 
                case SHPT_POLYGONM:
                        /* PolygonM */
-                       state->wkbtype = MULTIPOLYGONTYPE | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                       {
-                               state->pgtype = "MULTIPOLYGONM";
-                               state->pgdims = 3;
-                               state->istypeM = 1;
-                       }
-                       else
-                       {
-                               state->pgtype = "MULTIPOLYGON";
-                               state->pgdims = 2;
-                       }
+                       geomtype = MULTIPOLYGONTYPE;
+                       state->has_m = 1;
+                       state->pgtype = "MULTIPOLYGONM";
+                       state->pgdims = 3;
+                       state->istypeM = 1;
                        break;
 
                case SHPT_MULTIPOINTM:
                        /* MultiPointM */
-                       state->wkbtype = MULTIPOINTTYPE | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                       {
-                               state->pgtype = "MULTIPOINTM";
-                               state->pgdims = 3;
-                               state->istypeM = 1;
-                       }
-                       else
-                       {
-                               state->pgtype = "MULTIPOINT";
-                               state->pgdims = 2;
-                       }
+                       geomtype = MULTIPOINTTYPE;
+                       state->has_m = 1;
+                       state->pgtype = "MULTIPOINTM";
+                       state->pgdims = 3;
+                       state->istypeM = 1;
                        break;
 
                case SHPT_POINTZ:
                        /* PointZ */
-                       state->wkbtype = POINTTYPE | WKBMOFFSET | WKBZOFFSET;
+                       geomtype = POINTTYPE;
+                       state->has_m = 1;
+                       state->has_z = 1;
                        state->pgtype = "POINT";
-
-                       if (!state->config->hwgeom)
-                               state->pgdims = 4;
-                       else
-                               state->pgdims = 3;
-
+                       state->pgdims = 4;
                        break;
 
                case SHPT_ARCZ:
                        /* PolyLineZ */
                        state->pgtype = "MULTILINESTRING";
-                       state->wkbtype = MULTILINETYPE | WKBZOFFSET | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                               state->pgdims = 4;
-                       else
-                               state->pgdims = 3;
-
+                       geomtype = MULTILINETYPE;
+                       state->has_z = 1;
+                       state->has_m = 1;
+                       state->pgdims = 4;
                        break;
 
                case SHPT_POLYGONZ:
                        /* MultiPolygonZ */
                        state->pgtype = "MULTIPOLYGON";
-                       state->wkbtype = MULTIPOLYGONTYPE | WKBZOFFSET | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                               state->pgdims = 4;
-                       else
-                               state->pgdims = 3;
-
+                       geomtype = MULTIPOLYGONTYPE;
+                       state->has_z = 1;
+                       state->has_m = 1;
+                       state->pgdims = 4;
                        break;
 
                case SHPT_MULTIPOINTZ:
                        /* MultiPointZ */
                        state->pgtype = "MULTIPOINT";
-                       state->wkbtype = MULTIPOINTTYPE | WKBZOFFSET | WKBMOFFSET;
-
-                       if (!state->config->hwgeom)
-                               state->pgdims = 4;
-                       else
-                               state->pgdims = 3;
-
+                       geomtype = MULTIPOINTTYPE;
+                       state->has_z = 1;
+                       state->has_m = 1;
+                       state->pgdims = 4;
                        break;
 
                default:
                        state->pgtype = "GEOMETRY";
-                       state->wkbtype = COLLECTIONTYPE | WKBZOFFSET | WKBMOFFSET;
+                       geomtype = COLLECTIONTYPE;
+                       state->has_z = 1;
+                       state->has_m = 1;
                        state->pgdims = 4;
 
                        snprintf(state->message, SHPLOADERMSGLEN, _("Unknown geometry type: %d\n"), state->shpfiletype);
@@ -1052,11 +1010,11 @@ ShpLoaderOpenShape(SHPLOADERSTATE *state)
                /* If in simple geometry mode, alter names for CREATE TABLE by skipping MULTI */
                if (state->config->simple_geometries)
                {
-                       if ((state->wkbtype & 0x7) == MULTIPOLYGONTYPE)
-                               state->pgtype += 5;
-
-                       if ((state->wkbtype & 0x7) == MULTILINETYPE)
+                       if ((geomtype == MULTIPOLYGONTYPE) || (geomtype == MULTILINETYPE) || (geomtype == MULTIPOINTTYPE))
+                       {
+                               /* Chop off the "MULTI" from the string. */
                                state->pgtype += 5;
+                       }
                }
 
        }
@@ -1172,7 +1130,7 @@ ShpLoaderOpenShape(SHPLOADERSTATE *state)
 
        /* Append the geometry column if required */
        if (state->config->readshape == 1)
-               strcat(state->col_names, state->config->geom);
+               strcat(state->col_names, state->geo_col);
 
        strcat(state->col_names, ")");
 
@@ -1222,7 +1180,7 @@ ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
                        if (state->config->readshape == 1 && (! state->config->geography) )
                        {
                                stringbuffer_aprintf(sb, "SELECT DropGeometryColumn('%s','%s','%s');\n",
-                                                    state->config->schema, state->config->table, state->config->geom);
+                                                    state->config->schema, state->config->table, state->geo_col);
                        }
 
                        stringbuffer_aprintf(sb, "DROP TABLE \"%s\".\"%s\";\n", state->config->schema,
@@ -1233,7 +1191,7 @@ ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
                        if (state->config->readshape == 1  && (! state->config->geography) )
                        {
                                stringbuffer_aprintf(sb, "SELECT DropGeometryColumn('','%s','%s');\n",
-                                                    state->config->table, state->config->geom);
+                                                    state->config->table, state->geo_col);
                        }
 
                        stringbuffer_aprintf(sb, "DROP TABLE \"%s\";\n", state->config->table);
@@ -1331,13 +1289,13 @@ ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
                                dimschar = "ZM";
                        else
                                dimschar = "";
-                       if (state->config->sr_id != SRID_UNKNOWN && state->config->sr_id != 4326)
+                       if (state->to_srid != SRID_UNKNOWN && state->to_srid != 4326)
                        {
-                               snprintf(state->message, SHPLOADERMSGLEN, _("Invalid SRID for geography type: %x"), state->config->sr_id);
+                               snprintf(state->message, SHPLOADERMSGLEN, _("Invalid SRID for geography type: %x"), state->to_srid);
                                stringbuffer_destroy(sb);
                                return SHPLOADERERR;
                        }
-                       stringbuffer_aprintf(sb, ",\n\"%s\" geography(%s%s,%d)", state->config->geom, state->pgtype, dimschar, 4326);
+                       stringbuffer_aprintf(sb, ",\n\"%s\" geography(%s%s,%d)", state->geo_col, state->pgtype, dimschar, 4326);
                }
 
                stringbuffer_aprintf(sb, ")");
@@ -1385,15 +1343,17 @@ ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
                /* Create the geometry column with an addgeometry call */
                if (state->config->readshape == 1 && (!state->config->geography))
                {
+                       /* If they didn't specify a target SRID, see if they specified a source SRID. */
+                       int srid = state->to_srid;
                        if (state->config->schema)
                        {
                                stringbuffer_aprintf(sb, "SELECT AddGeometryColumn('%s','%s','%s','%d',",
-                                                    state->config->schema, state->config->table, state->config->geom, state->config->sr_id);
+                                                    state->config->schema, state->config->table, state->geo_col, srid);
                        }
                        else
                        {
                                stringbuffer_aprintf(sb, "SELECT AddGeometryColumn('','%s','%s','%d',",
-                                                    state->config->table, state->config->geom, state->config->sr_id);
+                                                    state->config->table, state->geo_col, srid);
                        }
 
                        stringbuffer_aprintf(sb, "'%s',%d);\n", state->pgtype, state->pgdims);
@@ -1649,97 +1609,68 @@ ShpLoaderGenerateSQLRowStatement(SHPLOADERSTATE *state, int item, char **strreco
                        case SHPT_POLYGONM:
                        case SHPT_POLYGONZ:
                                res = GeneratePolygonGeometry(state, obj, &geometry);
-                               if (res != SHPLOADEROK)
-                               {
-                                       /* Error message has already been set */
-                                       SHPDestroyObject(obj);
-                                       stringbuffer_destroy(sbwarn);
-                                       stringbuffer_destroy(sb);
-
-                                       return SHPLOADERERR;
-                               }
                                break;
 
                        case SHPT_POINT:
                        case SHPT_POINTM:
                        case SHPT_POINTZ:
+                               res = GeneratePointGeometry(state, obj, &geometry, 0);
+                               break;
+
                        case SHPT_MULTIPOINT:
                        case SHPT_MULTIPOINTM:
                        case SHPT_MULTIPOINTZ:
-                               res = GeneratePointGeometry(state, obj, &geometry);
-                               if (res != SHPLOADEROK)
-                               {
-                                       /* Error message has already been set */
-                                       SHPDestroyObject(obj);
-                                       stringbuffer_destroy(sbwarn);
-                                       stringbuffer_destroy(sb);
-
-                                       return SHPLOADERERR;
-                               }
+                               /* Force it to multi unless using -S */
+                               res = GeneratePointGeometry(state, obj, &geometry,
+                                       state->config->simple_geometries ? 0 : 1);
                                break;
 
                        case SHPT_ARC:
                        case SHPT_ARCM:
                        case SHPT_ARCZ:
                                res = GenerateLineStringGeometry(state, obj, &geometry);
-                               if (res != SHPLOADEROK)
-                               {
-                                       /* Error message has already been set */
-                                       SHPDestroyObject(obj);
-                                       stringbuffer_destroy(sbwarn);
-                                       stringbuffer_destroy(sb);
-
-                                       return SHPLOADERERR;
-                               }
                                break;
 
                        default:
                                snprintf(state->message, SHPLOADERMSGLEN, _("Shape type is not supported, type id = %d"), obj->nSHPType);
-
                                SHPDestroyObject(obj);
                                stringbuffer_destroy(sbwarn);
                                stringbuffer_destroy(sb);
 
                                return SHPLOADERERR;
                        }
+                       /* The default returns out of the function, so res will always have been set. */
+                       if (res != SHPLOADEROK)
+                       {
+                               /* Error message has already been set */
+                               SHPDestroyObject(obj);
+                               stringbuffer_destroy(sbwarn);
+                               stringbuffer_destroy(sb);
 
+                               return SHPLOADERERR;
+                       }
 
                        /* Now generate the geometry string according to the current configuration */
-                       if (state->config->hwgeom)
+                       if (!state->config->dump_format)
                        {
-                               /* Old-style hwgeom (WKT) */
-                               if (!state->config->dump_format)
-                                       stringbuffer_aprintf(sb, "GeomFromText('");
-                               else
+                               if (state->to_srid != state->from_srid)
                                {
-                                       /* Output SRID if relevant */
-                                       if (state->config->sr_id != 0)
-                                               stringbuffer_aprintf(sb, "SRID=%d;", state->config->sr_id);
+                                       stringbuffer_aprintf(sb, "ST_Transform(");
                                }
+                               stringbuffer_aprintf(sb, "'");
+                       }
 
-                               stringbuffer_aprintf(sb, "%s", geometry);
-
-                               if (!state->config->dump_format)
-                               {
-                                       stringbuffer_aprintf(sb, "'");
+                       stringbuffer_aprintf(sb, "%s", geometry);
 
-                                       /* Output SRID if relevant */
-                                       if (state->config->sr_id != 0)
-                                               stringbuffer_aprintf(sb, ", %d)", state->config->sr_id);
-                                       else
-                                               stringbuffer_aprintf(sb, ")");
-                               }
-                       }
-                       else
+                       if (!state->config->dump_format)
                        {
-                               /* New style lwgeom (HEXEWKB) */
-                               if (!state->config->dump_format)
-                                       stringbuffer_aprintf(sb, "'");
+                               stringbuffer_aprintf(sb, "'");
 
-                               stringbuffer_aprintf(sb, "%s", geometry);
-
-                               if (!state->config->dump_format)
-                                       stringbuffer_aprintf(sb, "'");
+                               /* Close the ST_Transform if reprojecting. */
+                               if (state->to_srid != state->from_srid)
+                               {
+                                       stringbuffer_aprintf(sb, ", %d)", state->to_srid);
+                               }
                        }
 
                        free(geometry);
@@ -1800,13 +1731,13 @@ ShpLoaderGetSQLFooter(SHPLOADERSTATE *state, char **strfooter)
        /* Create gist index if specified and not in "prepare" mode */
        if (state->config->createindex)
        {
-               stringbuffer_aprintf(sb, "CREATE INDEX \"%s_%s_gist\" ON ", state->config->table, state->config->geom);
+               stringbuffer_aprintf(sb, "CREATE INDEX \"%s_%s_gist\" ON ", state->config->table, state->geo_col);
                /* Schema is optional, include if present. */
                if (state->config->schema)
                {
                        stringbuffer_aprintf(sb, "\"%s\".",state->config->schema);
                }
-               stringbuffer_aprintf(sb, "\"%s\" USING GIST (\"%s\" %s)", state->config->table, state->config->geom, ops);
+               stringbuffer_aprintf(sb, "\"%s\" USING GIST (\"%s\" %s)", state->config->table, state->geo_col, ops);
                /* Tablespace is also optional. */
                if (state->config->idxtablespace != NULL)
                {
index 060a1d9ef4505be18d0be7d725142414546af6f8..d44325d75d615494e2528d2a4edad430ddc773e0 100644 (file)
@@ -93,8 +93,8 @@ typedef struct shp_loader_config
        /* schema to load into */
        char *schema;
 
-       /* geometry column name to use */
-       char *geom
+       /* geometry/geography column name specified by the user, may be null. */
+       char *geo_col
 
        /* the shape file (without the .shp extension) */
        char *shp_file;
@@ -135,8 +135,11 @@ typedef struct shp_loader_config
        /* SRID specified */
        int sr_id;
 
-       /* 0 = new style (PostGIS 1.x) geometries, 1 = old style (PostGIS 0.9.x) geometries */
-       int hwgeom;
+       /* SRID of the shape file */
+       int shp_sr_id;
+
+       /* 0 = WKB (more precise), 1 = WKT (may have coordinate drift). */
+       int use_wkt;
 
        /* whether to do a single transaction or run each statement on its own */
        int usetransaction;
@@ -186,8 +189,10 @@ typedef struct shp_loader_state
        /* String containing the PostGIS geometry type, e.g. POINT, POLYGON etc. */
        char *pgtype;
 
-       /* PostGIS geometry type (numeric version) */
-       uint32 wkbtype;
+       /* Flag for whether the geometry has Z coordinates or not. */
+       int has_z;
+       /* Flag for whether the geometry has M coordinates or not. */
+       int has_m;
 
        /* Number of dimensions to output */
        int pgdims;
@@ -198,6 +203,16 @@ typedef struct shp_loader_state
        /* Last (error) message */
        char message[SHPLOADERMSGLEN];
 
+       /* SRID of the shape file.  If not reprojecting, will be the same as to_srid. */
+       int from_srid;
+
+       /* SRID of the table.  If not reprojecting, will be the same as from_srid. */
+       int to_srid;
+
+       /* geometry/geography column name to use.  Will be set to the default if the config did
+          not specify a column name. */
+       char *geo_col; 
+
 } SHPLOADERSTATE;
 
 
index 67e2f59445fe3e09007c989d5b0b2edbc9ff176c..ef41cf88c400ddcc42b4725bf9e34ff8b988d41f 100644 (file)
@@ -718,8 +718,8 @@ pgui_set_config_from_options_ui()
                                                   current_node->tree_iterator,
                                                   GEOMETRY_COLUMN,
                                                   GEOGRAPHY_DEFAULT, -1);
-                               free(config->geom);
-                               config->geom = strdup(GEOGRAPHY_DEFAULT);
+                               free(config->geo_col);
+                               config->geo_col = strdup(GEOGRAPHY_DEFAULT);
                        }
                        current_node = get_next_node(current_node);
                }
@@ -739,8 +739,8 @@ pgui_set_config_from_options_ui()
                                                   current_node->tree_iterator,
                                                   GEOMETRY_COLUMN,
                                                   GEOMETRY_DEFAULT, -1);
-                               free(config->geom);
-                               config->geom = strdup(GEOMETRY_DEFAULT);
+                               free(config->geo_col);
+                               config->geo_col = strdup(GEOMETRY_DEFAULT);
                        }
                        current_node = get_next_node(current_node);
                }
@@ -814,9 +814,9 @@ pgui_set_config_from_ui(FILENODE *file_node)
                config->schema = strdup(file_node->schema);
 
        if (strlen(file_node->geom_column) == 0)
-               config->geom = strdup(GEOMETRY_DEFAULT);
+               config->geo_col = strdup(GEOMETRY_DEFAULT);
        else
-               config->geom = strdup(file_node->geom_column);
+               config->geo_col = strdup(file_node->geom_column);
 
        /* Set the destination filename: note the shp2pgsql core engine simply wants the file
           without the .shp extension */
@@ -1229,7 +1229,7 @@ pgui_validate_config()
                return 0;
        }
 
-       if ( ! config->geom || strlen(config->geom) == 0 )
+       if ( ! config->geo_col || strlen(config->geo_col) == 0 )
        {
                pgui_seterr(_("Fill in the destination column."));
                return 0;
@@ -1746,7 +1746,7 @@ pgui_action_import(GtkWidget *widget, gpointer data)
                }
 
                pgui_logf("\n==============================");
-               pgui_logf("Importing with configuration: %s, %s, %s, %s, mode=%c, dump=%d, simple=%d, geography=%d, index=%d, shape=%d, srid=%d", config->table, config->schema, config->geom, config->shp_file, config->opt, config->dump_format, config->simple_geometries, config->geography, config->createindex, config->readshape, config->sr_id);
+               pgui_logf("Importing with configuration: %s, %s, %s, %s, mode=%c, dump=%d, simple=%d, geography=%d, index=%d, shape=%d, srid=%d", config->table, config->schema, config->geo_col, config->shp_file, config->opt, config->dump_format, config->simple_geometries, config->geography, config->createindex, config->readshape, config->sr_id);
 
                /* Log what we know so far */
                connection_sanitized = strdup(connection_string);
index a11e2249b215bbc9fc5286d046720c5578f212a2..7762955cd4e73319b56042d8137c83686b8622f9 100644 (file)
@@ -41,6 +41,10 @@ TESTS = \
        loader/TSIPolygon \
        loader/TSTIPolygon \
        loader/NoTransPoint \
+       loader/NotReallyMultiPoint \
+       loader/MultiToSinglePoint \
+       loader/ReprojectPts \
+       loader/ReprojectPtsGeog \
        regress \
        regress_index \
        regress_index_nulls \
diff --git a/regress/loader/Arc.shp.expected b/regress/loader/Arc.shp.expected
new file mode 100644 (file)
index 0000000..db615cf
Binary files /dev/null and b/regress/loader/Arc.shp.expected differ
diff --git a/regress/loader/ArcM-wkt.expected b/regress/loader/ArcM-wkt.expected
deleted file mode 100644 (file)
index b894f93..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-01050000000300000001020000000200000000000000000000000000000000000000000000000000F03F000000000000F03F0102000000020000000000000000000840000000000000084000000000000010400000000000001040010200000003000000000000000000244000000000000024400000000000001440000000000000144000000000000008400000000000000840
-000000000500000003000000000200000002000000000000000000000000000000003FF00000000000003FF00000000000000000000002000000024008000000000000400800000000000040100000000000004010000000000000000000000200000003402400000000000040240000000000004014000000000000401400000000000040080000000000004008000000000000
-MULTILINESTRING((0 0,1 1),(3 3,4 4),(10 10,5 5,3 3))
diff --git a/regress/loader/ArcM-wkt.sql b/regress/loader/ArcM-wkt.sql
deleted file mode 100644 (file)
index 4ac611c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-select ST_Ashexewkb(the_geom, 'NDR') from loadedshp;
-select ST_Ashexewkb(the_geom, 'XDR') from loadedshp;
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/ArcM.select.expected b/regress/loader/ArcM.select.expected
new file mode 100644 (file)
index 0000000..284c668
--- /dev/null
@@ -0,0 +1,3 @@
+01050000400300000001020000400200000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F0000000000000040010200004002000000000000000000084000000000000008400000000000000840000000000000104000000000000010400000000000001040010200004003000000000000000000244000000000000024400000000000001440000000000000144000000000000014400000000000001840000000000000084000000000000008400000000000001C40
+004000000500000003004000000200000002000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000400000000000000000400000020000000240080000000000004008000000000000400800000000000040100000000000004010000000000000401000000000000000400000020000000340240000000000004024000000000000401400000000000040140000000000004014000000000000401800000000000040080000000000004008000000000000401C000000000000
+MULTILINESTRINGM((0 0 1,1 1 2),(3 3 3,4 4 4),(10 10 5,5 5 6,3 3 7))
similarity index 99%
rename from regress/loader/Arc-wkb.sql
rename to regress/loader/ArcM.select.sql
index a7700903de69ba44c0106143012e209c78ffddca..c11025de205e851e738711d35fbe02fde811d724 100644 (file)
@@ -1,4 +1,3 @@
-
 select ST_Ashexewkb(the_geom, 'NDR') from loadedshp;
 select ST_Ashexewkb(the_geom, 'XDR') from loadedshp;
 select ST_Asewkt(the_geom) from loadedshp;
diff --git a/regress/loader/ArcM.shp.expected b/regress/loader/ArcM.shp.expected
new file mode 100644 (file)
index 0000000..673dc42
Binary files /dev/null and b/regress/loader/ArcM.shp.expected differ
diff --git a/regress/loader/ArcZ-w.select.expected b/regress/loader/ArcZ-w.select.expected
new file mode 100644 (file)
index 0000000..0f5dde7
--- /dev/null
@@ -0,0 +1,3 @@
+01050000C00300000001020000C00200000000000000000000000000000000000000000000000000F03F0000000000002240000000000000F03F000000000000F03F0000000000000040000000000000204001020000C0020000000000000000000840000000000000084000000000000008400000000000001C40000000000000104000000000000010400000000000001040000000000000184001020000C00300000000000000000024400000000000002440000000000000144000000000000014400000000000001440000000000000144000000000000018400000000000001040000000000000084000000000000008400000000000001C400000000000001040
+00C00000050000000300C000000200000002000000000000000000000000000000003FF000000000000040220000000000003FF00000000000003FF00000000000004000000000000000402000000000000000C000000200000002400800000000000040080000000000004008000000000000401C000000000000401000000000000040100000000000004010000000000000401800000000000000C0000002000000034024000000000000402400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401000000000000040080000000000004008000000000000401C0000000000004010000000000000
+MULTILINESTRING((0 0 1 9,1 1 2 8),(3 3 3 7,4 4 4 6),(10 10 5 5,5 5 6 4,3 3 7 4))
diff --git a/regress/loader/ArcZ-wkb.expected b/regress/loader/ArcZ-wkb.expected
deleted file mode 100644 (file)
index e4381fc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-1|01050000C00300000001020000C00200000000000000000000000000000000000000000000000000F03F0000000000002240000000000000F03F000000000000F03F0000000000000040000000000000204001020000C0020000000000000000000840000000000000084000000000000008400000000000001C40000000000000104000000000000010400000000000001040000000000000184001020000C00300000000000000000024400000000000002440000000000000144000000000000014400000000000001440000000000000144000000000000018400000000000001040000000000000084000000000000008400000000000001C400000000000001040
diff --git a/regress/loader/ArcZ-wkt.expected b/regress/loader/ArcZ-wkt.expected
deleted file mode 100644 (file)
index 22619e3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-1|01050000800300000001020000800200000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F0000000000000040010200008002000000000000000000084000000000000008400000000000000840000000000000104000000000000010400000000000001040010200008003000000000000000000244000000000000024400000000000001440000000000000144000000000000014400000000000001840000000000000084000000000000008400000000000001C40
diff --git a/regress/loader/ArcZ.select.expected b/regress/loader/ArcZ.select.expected
new file mode 100644 (file)
index 0000000..0f5dde7
--- /dev/null
@@ -0,0 +1,3 @@
+01050000C00300000001020000C00200000000000000000000000000000000000000000000000000F03F0000000000002240000000000000F03F000000000000F03F0000000000000040000000000000204001020000C0020000000000000000000840000000000000084000000000000008400000000000001C40000000000000104000000000000010400000000000001040000000000000184001020000C00300000000000000000024400000000000002440000000000000144000000000000014400000000000001440000000000000144000000000000018400000000000001040000000000000084000000000000008400000000000001C400000000000001040
+00C00000050000000300C000000200000002000000000000000000000000000000003FF000000000000040220000000000003FF00000000000003FF00000000000004000000000000000402000000000000000C000000200000002400800000000000040080000000000004008000000000000401C000000000000401000000000000040100000000000004010000000000000401800000000000000C0000002000000034024000000000000402400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401000000000000040080000000000004008000000000000401C0000000000004010000000000000
+MULTILINESTRING((0 0 1 9,1 1 2 8),(3 3 3 7,4 4 4 6),(10 10 5 5,5 5 6 4,3 3 7 4))
similarity index 99%
rename from regress/loader/Arc-wkt.sql
rename to regress/loader/ArcZ.select.sql
index a7700903de69ba44c0106143012e209c78ffddca..c11025de205e851e738711d35fbe02fde811d724 100644 (file)
@@ -1,4 +1,3 @@
-
 select ST_Ashexewkb(the_geom, 'NDR') from loadedshp;
 select ST_Ashexewkb(the_geom, 'XDR') from loadedshp;
 select ST_Asewkt(the_geom) from loadedshp;
diff --git a/regress/loader/ArcZ.shp.expected b/regress/loader/ArcZ.shp.expected
new file mode 100644 (file)
index 0000000..ed061a2
Binary files /dev/null and b/regress/loader/ArcZ.shp.expected differ
diff --git a/regress/loader/MultiPoint.shp.expected b/regress/loader/MultiPoint.shp.expected
new file mode 100644 (file)
index 0000000..b8b5867
Binary files /dev/null and b/regress/loader/MultiPoint.shp.expected differ
diff --git a/regress/loader/MultiPointM-wkt.expected b/regress/loader/MultiPointM-wkt.expected
deleted file mode 100644 (file)
index 791f6f1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-MULTIPOINT(0 1,9 -1,9 -1)
diff --git a/regress/loader/MultiPointM.select.expected b/regress/loader/MultiPointM.select.expected
new file mode 100644 (file)
index 0000000..f0a0a85
--- /dev/null
@@ -0,0 +1 @@
+MULTIPOINTM(0 1 3,9 -1 -3,9 -1 -123)
diff --git a/regress/loader/MultiPointM.shp.expected b/regress/loader/MultiPointM.shp.expected
new file mode 100644 (file)
index 0000000..4d7d5e3
Binary files /dev/null and b/regress/loader/MultiPointM.shp.expected differ
diff --git a/regress/loader/MultiPointZ-wkt.expected b/regress/loader/MultiPointZ-wkt.expected
deleted file mode 100644 (file)
index 596ad57..0000000
+++ /dev/null
@@ -1 +0,0 @@
-MULTIPOINT(0 1 2,9 -1 -2,9 -1 -20)
diff --git a/regress/loader/MultiPointZ.select.expected b/regress/loader/MultiPointZ.select.expected
new file mode 100644 (file)
index 0000000..cd255cf
--- /dev/null
@@ -0,0 +1 @@
+MULTIPOINT(0 1 2 3,9 -1 -2 -3,9 -1 -20 -123)
diff --git a/regress/loader/MultiPointZ.shp.expected b/regress/loader/MultiPointZ.shp.expected
new file mode 100644 (file)
index 0000000..6ba2d7f
Binary files /dev/null and b/regress/loader/MultiPointZ.shp.expected differ
diff --git a/regress/loader/MultiToSinglePoint-w.select.expected b/regress/loader/MultiToSinglePoint-w.select.expected
new file mode 100644 (file)
index 0000000..38fcb40
--- /dev/null
@@ -0,0 +1,66 @@
+POINT(580936.142823 819465.261819)
+POINT(506358.893822 607539.2573)
+POINT(630565.963577 527840.45893)
+POINT(315456.492218 345306.814089)
+POINT(471022.700766 736736.493044)
+POINT(500018.609208 615679.275076)
+POINT(219498.722492 315980.37513)
+POINT(319224.669259 318928.062446)
+POINT(568650.774422 460462.130344)
+POINT(556409.113539 729253.309903)
+POINT(513863.46763 702618.742175)
+POINT(578737.939007 752848.936015)
+POINT(574438.608452 769113.196327)
+POINT(542424.351008 668316.880131)
+POINT(400265.835331 734407.033596)
+POINT(451759.863004 412686.100724)
+POINT(569910.583609 459856.20941)
+POINT(463382.922609 699974.019885)
+POINT(604477.021809 740527.999129)
+POINT(507899.651882 708318.275563)
+POINT(417174.241779 505305.090948)
+POINT(577806.699527 694316.933395)
+POINT(576210.383288 714992.288047)
+POINT(577656.942501 695830.735896)
+POINT(581803.779115 693852.464253)
+POINT(483239.070139 239264.868231)
+POINT(584627.388419 693322.924134)
+POINT(531622.192358 716647.040901)
+POINT(581975.365599 694284.048852)
+POINT(446160.135881 550892.865026)
+POINT(529311.590366 610942.506187)
+POINT(581808.726988 695841.703111)
+POINT(504782.468511 615893.186212)
+POINT(622500.156248 752230.030257)
+POINT(349366.222335 363016.921232)
+POINT(594903.330738 545923.436928)
+POINT(441308.570186 229022.749014)
+POINT(605633.269659 771823.45975)
+POINT(318054.396825 406677.968765)
+POINT(606814.490943 683559.837391)
+POINT(427202.245584 526355.921119)
+POINT(585605.654583 428734.299959)
+POINT(348498.220291 696622.254661)
+POINT(447753.888233 552268.218021)
+POINT(562081.950511 696159.347585)
+POINT(449917.461534 516567.922516)
+POINT(509151.607038 594632.163261)
+POINT(565466.435276 673573.123642)
+POINT(492421.362356 719117.799265)
+POINT(613346.499962 691449.747539)
+POINT(341505.393226 347633.860111)
+POINT(335130.109224 221738.458568)
+POINT(520476.8592 607380.893421)
+POINT(610931.065288 690104.943361)
+POINT(577692.981622 695342.840693)
+POINT(623744.425212 697297.799336)
+POINT(439667.994099 646984.255696)
+POINT(507141.1403 606418.246119)
+POINT(575383.92723 737533.321867)
+POINT(413215.495254 523736.836314)
+POINT(561887.180888 504214.422383)
+POINT(583428.220764 759656.92773)
+POINT(421018.925049 813910.215413)
+POINT(621373.929808 690044.792874)
+POINT(470983.159332 620692.73333)
+POINT(508947.758357 706720.507141)
diff --git a/regress/loader/MultiToSinglePoint.dbf b/regress/loader/MultiToSinglePoint.dbf
new file mode 100644 (file)
index 0000000..cfaee4b
Binary files /dev/null and b/regress/loader/MultiToSinglePoint.dbf differ
diff --git a/regress/loader/MultiToSinglePoint.opts b/regress/loader/MultiToSinglePoint.opts
new file mode 100644 (file)
index 0000000..6eec8d4
--- /dev/null
@@ -0,0 +1,4 @@
+# These points are in a multipoint shapefile even though they're all single points.
+# That used to break, so you sould be able to use the -S parameter to force them to
+# load into a POINT table rather than a MULTIPOINT.
+-S
diff --git a/regress/loader/MultiToSinglePoint.select.expected b/regress/loader/MultiToSinglePoint.select.expected
new file mode 100644 (file)
index 0000000..b80e20e
--- /dev/null
@@ -0,0 +1,66 @@
+POINT(580936.142822989 819465.261818573)
+POINT(506358.893822162 607539.257299624)
+POINT(630565.963576575 527840.458930382)
+POINT(315456.492217951 345306.814088522)
+POINT(471022.700765905 736736.493043649)
+POINT(500018.609208153 615679.275075901)
+POINT(219498.722491731 315980.375130241)
+POINT(319224.669258993 318928.062445705)
+POINT(568650.774421983 460462.130343988)
+POINT(556409.113539159 729253.30990305)
+POINT(513863.467629622 702618.742174883)
+POINT(578737.93900689 752848.936014613)
+POINT(574438.608452132 769113.196326717)
+POINT(542424.351008234 668316.880130952)
+POINT(400265.835331173 734407.03359561)
+POINT(451759.863004144 412686.100723883)
+POINT(569910.583609289 459856.209410486)
+POINT(463382.922608931 699974.019885147)
+POINT(604477.021809125 740527.999129056)
+POINT(507899.651882106 708318.275562585)
+POINT(417174.241778919 505305.090947582)
+POINT(577806.69952663 694316.933395063)
+POINT(576210.383288164 714992.288047029)
+POINT(577656.942500652 695830.735895674)
+POINT(581803.77911474 693852.464252684)
+POINT(483239.070139275 239264.868230516)
+POINT(584627.388419181 693322.924133717)
+POINT(531622.192358354 716647.04090078)
+POINT(581975.365599073 694284.048851616)
+POINT(446160.135881017 550892.865025523)
+POINT(529311.59036645 610942.506187195)
+POINT(581808.72698778 695841.703111349)
+POINT(504782.468510898 615893.18621198)
+POINT(622500.156247537 752230.030256728)
+POINT(349366.222335089 363016.921231509)
+POINT(594903.330738372 545923.436927693)
+POINT(441308.570185706 229022.749014213)
+POINT(605633.269658534 771823.459750208)
+POINT(318054.396825439 406677.968765208)
+POINT(606814.490943 683559.837390652)
+POINT(427202.24558416 526355.921118875)
+POINT(585605.654583162 428734.299958661)
+POINT(348498.220290712 696622.254661199)
+POINT(447753.888233448 552268.218021069)
+POINT(562081.950510856 696159.347584696)
+POINT(449917.461533751 516567.922516446)
+POINT(509151.60703826 594632.163260898)
+POINT(565466.43527563 673573.123642044)
+POINT(492421.362355858 719117.799265052)
+POINT(613346.499961959 691449.747538779)
+POINT(341505.39322594 347633.860111487)
+POINT(335130.109224021 221738.458568427)
+POINT(520476.859199935 607380.893420555)
+POINT(610931.065287928 690104.943360865)
+POINT(577692.981621935 695342.840693476)
+POINT(623744.425211874 697297.79933633)
+POINT(439667.99409899 646984.255696235)
+POINT(507141.140300172 606418.246119218)
+POINT(575383.927230225 737533.321867288)
+POINT(413215.495253968 523736.836314417)
+POINT(561887.180888466 504214.422382654)
+POINT(583428.220763956 759656.927730192)
+POINT(421018.925048973 813910.215413168)
+POINT(621373.929808485 690044.79287378)
+POINT(470983.159331542 620692.733330001)
+POINT(508947.758356538 706720.507141173)
diff --git a/regress/loader/MultiToSinglePoint.shp b/regress/loader/MultiToSinglePoint.shp
new file mode 100644 (file)
index 0000000..805fbb0
Binary files /dev/null and b/regress/loader/MultiToSinglePoint.shp differ
diff --git a/regress/loader/MultiToSinglePoint.shp.expected b/regress/loader/MultiToSinglePoint.shp.expected
new file mode 100644 (file)
index 0000000..6c33d96
Binary files /dev/null and b/regress/loader/MultiToSinglePoint.shp.expected differ
diff --git a/regress/loader/MultiToSinglePoint.shx b/regress/loader/MultiToSinglePoint.shx
new file mode 100644 (file)
index 0000000..59f0cb9
Binary files /dev/null and b/regress/loader/MultiToSinglePoint.shx differ
diff --git a/regress/loader/NoTransPoint.shp.expected b/regress/loader/NoTransPoint.shp.expected
new file mode 100644 (file)
index 0000000..51d38e7
Binary files /dev/null and b/regress/loader/NoTransPoint.shp.expected differ
diff --git a/regress/loader/NotReallyMultiPoint-w.select.expected b/regress/loader/NotReallyMultiPoint-w.select.expected
new file mode 100644 (file)
index 0000000..e145e31
--- /dev/null
@@ -0,0 +1,66 @@
+MULTIPOINT(580936.142823 819465.261819)
+MULTIPOINT(506358.893822 607539.2573)
+MULTIPOINT(630565.963577 527840.45893)
+MULTIPOINT(315456.492218 345306.814089)
+MULTIPOINT(471022.700766 736736.493044)
+MULTIPOINT(500018.609208 615679.275076)
+MULTIPOINT(219498.722492 315980.37513)
+MULTIPOINT(319224.669259 318928.062446)
+MULTIPOINT(568650.774422 460462.130344)
+MULTIPOINT(556409.113539 729253.309903)
+MULTIPOINT(513863.46763 702618.742175)
+MULTIPOINT(578737.939007 752848.936015)
+MULTIPOINT(574438.608452 769113.196327)
+MULTIPOINT(542424.351008 668316.880131)
+MULTIPOINT(400265.835331 734407.033596)
+MULTIPOINT(451759.863004 412686.100724)
+MULTIPOINT(569910.583609 459856.20941)
+MULTIPOINT(463382.922609 699974.019885)
+MULTIPOINT(604477.021809 740527.999129)
+MULTIPOINT(507899.651882 708318.275563)
+MULTIPOINT(417174.241779 505305.090948)
+MULTIPOINT(577806.699527 694316.933395)
+MULTIPOINT(576210.383288 714992.288047)
+MULTIPOINT(577656.942501 695830.735896)
+MULTIPOINT(581803.779115 693852.464253)
+MULTIPOINT(483239.070139 239264.868231)
+MULTIPOINT(584627.388419 693322.924134)
+MULTIPOINT(531622.192358 716647.040901)
+MULTIPOINT(581975.365599 694284.048852)
+MULTIPOINT(446160.135881 550892.865026)
+MULTIPOINT(529311.590366 610942.506187)
+MULTIPOINT(581808.726988 695841.703111)
+MULTIPOINT(504782.468511 615893.186212)
+MULTIPOINT(622500.156248 752230.030257)
+MULTIPOINT(349366.222335 363016.921232)
+MULTIPOINT(594903.330738 545923.436928)
+MULTIPOINT(441308.570186 229022.749014)
+MULTIPOINT(605633.269659 771823.45975)
+MULTIPOINT(318054.396825 406677.968765)
+MULTIPOINT(606814.490943 683559.837391)
+MULTIPOINT(427202.245584 526355.921119)
+MULTIPOINT(585605.654583 428734.299959)
+MULTIPOINT(348498.220291 696622.254661)
+MULTIPOINT(447753.888233 552268.218021)
+MULTIPOINT(562081.950511 696159.347585)
+MULTIPOINT(449917.461534 516567.922516)
+MULTIPOINT(509151.607038 594632.163261)
+MULTIPOINT(565466.435276 673573.123642)
+MULTIPOINT(492421.362356 719117.799265)
+MULTIPOINT(613346.499962 691449.747539)
+MULTIPOINT(341505.393226 347633.860111)
+MULTIPOINT(335130.109224 221738.458568)
+MULTIPOINT(520476.8592 607380.893421)
+MULTIPOINT(610931.065288 690104.943361)
+MULTIPOINT(577692.981622 695342.840693)
+MULTIPOINT(623744.425212 697297.799336)
+MULTIPOINT(439667.994099 646984.255696)
+MULTIPOINT(507141.1403 606418.246119)
+MULTIPOINT(575383.92723 737533.321867)
+MULTIPOINT(413215.495254 523736.836314)
+MULTIPOINT(561887.180888 504214.422383)
+MULTIPOINT(583428.220764 759656.92773)
+MULTIPOINT(421018.925049 813910.215413)
+MULTIPOINT(621373.929808 690044.792874)
+MULTIPOINT(470983.159332 620692.73333)
+MULTIPOINT(508947.758357 706720.507141)
diff --git a/regress/loader/NotReallyMultiPoint.dbf b/regress/loader/NotReallyMultiPoint.dbf
new file mode 100644 (file)
index 0000000..cfaee4b
Binary files /dev/null and b/regress/loader/NotReallyMultiPoint.dbf differ
diff --git a/regress/loader/NotReallyMultiPoint.select.expected b/regress/loader/NotReallyMultiPoint.select.expected
new file mode 100644 (file)
index 0000000..ea55702
--- /dev/null
@@ -0,0 +1,66 @@
+MULTIPOINT(580936.142822989 819465.261818573)
+MULTIPOINT(506358.893822162 607539.257299624)
+MULTIPOINT(630565.963576575 527840.458930382)
+MULTIPOINT(315456.492217951 345306.814088522)
+MULTIPOINT(471022.700765905 736736.493043649)
+MULTIPOINT(500018.609208153 615679.275075901)
+MULTIPOINT(219498.722491731 315980.375130241)
+MULTIPOINT(319224.669258993 318928.062445705)
+MULTIPOINT(568650.774421983 460462.130343988)
+MULTIPOINT(556409.113539159 729253.30990305)
+MULTIPOINT(513863.467629622 702618.742174883)
+MULTIPOINT(578737.93900689 752848.936014613)
+MULTIPOINT(574438.608452132 769113.196326717)
+MULTIPOINT(542424.351008234 668316.880130952)
+MULTIPOINT(400265.835331173 734407.03359561)
+MULTIPOINT(451759.863004144 412686.100723883)
+MULTIPOINT(569910.583609289 459856.209410486)
+MULTIPOINT(463382.922608931 699974.019885147)
+MULTIPOINT(604477.021809125 740527.999129056)
+MULTIPOINT(507899.651882106 708318.275562585)
+MULTIPOINT(417174.241778919 505305.090947582)
+MULTIPOINT(577806.69952663 694316.933395063)
+MULTIPOINT(576210.383288164 714992.288047029)
+MULTIPOINT(577656.942500652 695830.735895674)
+MULTIPOINT(581803.77911474 693852.464252684)
+MULTIPOINT(483239.070139275 239264.868230516)
+MULTIPOINT(584627.388419181 693322.924133717)
+MULTIPOINT(531622.192358354 716647.04090078)
+MULTIPOINT(581975.365599073 694284.048851616)
+MULTIPOINT(446160.135881017 550892.865025523)
+MULTIPOINT(529311.59036645 610942.506187195)
+MULTIPOINT(581808.72698778 695841.703111349)
+MULTIPOINT(504782.468510898 615893.18621198)
+MULTIPOINT(622500.156247537 752230.030256728)
+MULTIPOINT(349366.222335089 363016.921231509)
+MULTIPOINT(594903.330738372 545923.436927693)
+MULTIPOINT(441308.570185706 229022.749014213)
+MULTIPOINT(605633.269658534 771823.459750208)
+MULTIPOINT(318054.396825439 406677.968765208)
+MULTIPOINT(606814.490943 683559.837390652)
+MULTIPOINT(427202.24558416 526355.921118875)
+MULTIPOINT(585605.654583162 428734.299958661)
+MULTIPOINT(348498.220290712 696622.254661199)
+MULTIPOINT(447753.888233448 552268.218021069)
+MULTIPOINT(562081.950510856 696159.347584696)
+MULTIPOINT(449917.461533751 516567.922516446)
+MULTIPOINT(509151.60703826 594632.163260898)
+MULTIPOINT(565466.43527563 673573.123642044)
+MULTIPOINT(492421.362355858 719117.799265052)
+MULTIPOINT(613346.499961959 691449.747538779)
+MULTIPOINT(341505.39322594 347633.860111487)
+MULTIPOINT(335130.109224021 221738.458568427)
+MULTIPOINT(520476.859199935 607380.893420555)
+MULTIPOINT(610931.065287928 690104.943360865)
+MULTIPOINT(577692.981621935 695342.840693476)
+MULTIPOINT(623744.425211874 697297.79933633)
+MULTIPOINT(439667.99409899 646984.255696235)
+MULTIPOINT(507141.140300172 606418.246119218)
+MULTIPOINT(575383.927230225 737533.321867288)
+MULTIPOINT(413215.495253968 523736.836314417)
+MULTIPOINT(561887.180888466 504214.422382654)
+MULTIPOINT(583428.220763956 759656.927730192)
+MULTIPOINT(421018.925048973 813910.215413168)
+MULTIPOINT(621373.929808485 690044.79287378)
+MULTIPOINT(470983.159331542 620692.733330001)
+MULTIPOINT(508947.758356538 706720.507141173)
diff --git a/regress/loader/NotReallyMultiPoint.shp b/regress/loader/NotReallyMultiPoint.shp
new file mode 100644 (file)
index 0000000..805fbb0
Binary files /dev/null and b/regress/loader/NotReallyMultiPoint.shp differ
diff --git a/regress/loader/NotReallyMultiPoint.shp.expected b/regress/loader/NotReallyMultiPoint.shp.expected
new file mode 100644 (file)
index 0000000..805fbb0
Binary files /dev/null and b/regress/loader/NotReallyMultiPoint.shp.expected differ
diff --git a/regress/loader/NotReallyMultiPoint.shx b/regress/loader/NotReallyMultiPoint.shx
new file mode 100644 (file)
index 0000000..59f0cb9
Binary files /dev/null and b/regress/loader/NotReallyMultiPoint.shx differ
diff --git a/regress/loader/Point.shp.expected b/regress/loader/Point.shp.expected
new file mode 100644 (file)
index 0000000..51d38e7
Binary files /dev/null and b/regress/loader/Point.shp.expected differ
diff --git a/regress/loader/PointM-wkt.expected b/regress/loader/PointM-wkt.expected
deleted file mode 100644 (file)
index 680e99b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-POINT(0 1)
-POINT(9 -1)
-POINT(9 -1)
diff --git a/regress/loader/PointM.select.expected b/regress/loader/PointM.select.expected
new file mode 100644 (file)
index 0000000..4004ce7
--- /dev/null
@@ -0,0 +1,3 @@
+POINTM(0 1 3)
+POINTM(9 -1 -3)
+POINTM(9 -1 -123)
diff --git a/regress/loader/PointM.shp.expected b/regress/loader/PointM.shp.expected
new file mode 100644 (file)
index 0000000..03da6b4
Binary files /dev/null and b/regress/loader/PointM.shp.expected differ
diff --git a/regress/loader/PointZ-wkb.sql b/regress/loader/PointZ-wkb.sql
deleted file mode 100644 (file)
index 031c119..0000000
+++ /dev/null
@@ -1 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
diff --git a/regress/loader/PointZ-wkt.expected b/regress/loader/PointZ-wkt.expected
deleted file mode 100644 (file)
index 6cadbea..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-POINT(0 1 2)
-POINT(9 -1 -2)
-POINT(9 -1 -20)
diff --git a/regress/loader/PointZ-wkt.sql b/regress/loader/PointZ-wkt.sql
deleted file mode 100644 (file)
index 031c119..0000000
+++ /dev/null
@@ -1 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
diff --git a/regress/loader/PointZ.select.expected b/regress/loader/PointZ.select.expected
new file mode 100644 (file)
index 0000000..ecb3516
--- /dev/null
@@ -0,0 +1,3 @@
+POINT(0 1 2 3)
+POINT(9 -1 -2 -3)
+POINT(9 -1 -20 -123)
diff --git a/regress/loader/PointZ.shp.expected b/regress/loader/PointZ.shp.expected
new file mode 100644 (file)
index 0000000..9b9ab79
Binary files /dev/null and b/regress/loader/PointZ.shp.expected differ
diff --git a/regress/loader/Polygon.shp.expected b/regress/loader/Polygon.shp.expected
new file mode 100644 (file)
index 0000000..997b43f
Binary files /dev/null and b/regress/loader/Polygon.shp.expected differ
diff --git a/regress/loader/PolygonM.select.expected b/regress/loader/PolygonM.select.expected
new file mode 100644 (file)
index 0000000..194ac8c
--- /dev/null
@@ -0,0 +1 @@
+MULTIPOLYGONM(((0 0 1,0 10 7,10 10 5,10 0 3,0 0 1),(5 5 9,8 5 15,8 8 13,5 8 11,5 5 9)),((-1 -1 -1,-1 -10 -7,-10 -10 -5,-10 -1 -3,-1 -1 -1),(-5 -5 -9,-8 -5 -15,-8 -8 -13,-5 -8 -11,-5 -5 -9)))
diff --git a/regress/loader/PolygonM.shp.expected b/regress/loader/PolygonM.shp.expected
new file mode 100644 (file)
index 0000000..4513ab7
Binary files /dev/null and b/regress/loader/PolygonM.shp.expected differ
diff --git a/regress/loader/PolygonZ-wkb.sql b/regress/loader/PolygonZ-wkb.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/PolygonZ-wkt.expected b/regress/loader/PolygonZ-wkt.expected
deleted file mode 100644 (file)
index 40d5bf3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-MULTIPOLYGON(((0 0 0,0 10 6,10 10 4,10 0 2,0 0 0),(5 5 8,8 5 14,8 8 12,5 8 10,5 5 8)),((-1 -1 -1,-1 -10 -6,-10 -10 -4,-10 -1 -2,-1 -1 -1),(-5 -5 -8,-8 -5 -14,-8 -8 -12,-5 -8 -10,-5 -5 -8)))
diff --git a/regress/loader/PolygonZ-wkt.sql b/regress/loader/PolygonZ-wkt.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/PolygonZ.select.expected b/regress/loader/PolygonZ.select.expected
new file mode 100644 (file)
index 0000000..7370e63
--- /dev/null
@@ -0,0 +1 @@
+MULTIPOLYGON(((0 0 0 1,0 10 6 7,10 10 4 5,10 0 2 3,0 0 0 1),(5 5 8 9,8 5 14 15,8 8 12 13,5 8 10 11,5 5 8 9)),((-1 -1 -1 -1,-1 -10 -6 -7,-10 -10 -4 -5,-10 -1 -2 -3,-1 -1 -1 -1),(-5 -5 -8 -9,-8 -5 -14 -15,-8 -8 -12 -13,-5 -8 -10 -11,-5 -5 -8 -9)))
diff --git a/regress/loader/PolygonZ.shp.expected b/regress/loader/PolygonZ.shp.expected
new file mode 100644 (file)
index 0000000..be7e41f
Binary files /dev/null and b/regress/loader/PolygonZ.shp.expected differ
index e9d2060413113464233af0793f3dcd0a9a5a55db..4b9ae6de06b71d4d727a8774ee4a05f2d4a2d763 100644 (file)
@@ -1,19 +1,40 @@
-Sat Jun 17 11:40:38 CEST 2006 --strk;
+A loader test requires, at a minimum, a shapefile:
 
-The ../run_test script will load a provided shapefile using both DUMP and INSERT
-mode and both WKT and WKB modes into a table name 'loadedshp'.
-After each WKB load, the <name>-wkb.sql test, if available, will be run
-and output compared to <name>-wkb.expected
-After each WKT load, the <name>-wkt.sql test, if available, will be run
-and output compared to <name>-wkt.expected
-We need two separate tests for WKB and WKT as the WKT mode will not support M values.
+<name>.shp
+<name>.shx
+<name>.dbf
 
-Also, the tester script will dump the WKB loaded table and compare the resulting
-shapefile with the original one (only .shp, .dbf is not compared as field sizes are not
-retained, we might use a dbf viewer for that, but that's not currently implemented)
+The loader will be run against the shapefile with no command-line flags,
+then the output will be run via psql to insert the table into PostGIS.
 
-Optional:
-  You may provide a <name>.opts file to set custom command line options for shp2pgsql.
-  The first line that does not begin with a # is used.
+If there is no <name>.opts file, the loader is then run with the -D flag,
+and the output again run via psql.
 
-  Also see ../README for a description of optional setup/teardown script files.
+See ../README for a description of optional setup/teardown script files.
+
+The following are optional files for each loader test:
+
+<name>.opts - If this exists, the first line that does not begin with a #
+       is read and passed as command line arguments to the loader.  This
+       allows testing any arbitrary command line arguments (-s, -G, etc).
+       NOTE: When this file exists, this test is NOT run a second time
+             with -D, because -D can conflict with some arguments.
+
+<name>.sql.expected - If this exists, the output of the loader is compared
+       with this file before running it via psql.
+
+<name>.select.sql          and
+<name>.select.expected - If these are present, after the loader output is
+       loaded into the database, the query in <name>.select.sql is run and
+       the psql output is compared with <name>.select.expected.
+
+<name>.select.sql          and
+<name>-w.select.expected - If these are present, the loader is also run with
+       the -w flag to produce WKT output rather than WKB output.  The query
+       in <name>.select.sql is run again and compared against
+       <name>-w.select.expected.
+
+<name>.shp.expected - If this is present, the dumper is run (after running
+       the WKB version, not the WKT version, as WKT can lose precision)
+       and the .shp file produced by the dumper is compared with
+       <name>.shp.expected.
diff --git a/regress/loader/ReprojectPts-pre.sql b/regress/loader/ReprojectPts-pre.sql
new file mode 100644 (file)
index 0000000..fe70406
--- /dev/null
@@ -0,0 +1,12 @@
+-- setup the spatial_ref_sys table with the two projections
+DELETE FROM spatial_ref_sys;
+---
+--- EPSG 4326 : WGS 84
+---
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ');
+---
+--- EPSG 2260 : NAD83 / New York East (ftUS)
+---
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (2260,'EPSG',2260,'PROJCS["NAD83 / New York East (ftUS)",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],UNIT["US survey foot",0.3048006096012192,AUTHORITY["EPSG","9003"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38.83333333333334],PARAMETER["central_meridian",-74.5],PARAMETER["scale_factor",0.9999],PARAMETER["false_easting",492125],PARAMETER["false_northing",0],AUTHORITY["EPSG","2260"],AXIS["X",EAST],AXIS["Y",NORTH]]','+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs ');
+
+
diff --git a/regress/loader/ReprojectPts-w.select.expected b/regress/loader/ReprojectPts-w.select.expected
new file mode 100644 (file)
index 0000000..23abda9
--- /dev/null
@@ -0,0 +1,66 @@
+SRID=4326;POINT(-74.1778249234186 41.0826336069621)
+SRID=4326;POINT(-74.4488128587284 40.5013374405831)
+SRID=4326;POINT(-74.0037635784151 40.2814968841599)
+SRID=4326;POINT(-75.1286374176544 39.779738904917)
+SRID=4326;POINT(-74.5762901403342 40.8559759516941)
+SRID=4326;POINT(-74.4716040112965 40.5236906585587)
+SRID=4326;POINT(-75.4689168308202 39.6968833405426)
+SRID=4326;POINT(-75.1145861845468 39.7073923052707)
+SRID=4326;POINT(-74.2264370070618 40.097265631898)
+SRID=4326;POINT(-74.267669256308 40.835226153518)
+SRID=4326;POINT(-74.4215203668629 40.7623218114584)
+SRID=4326;POINT(-74.1866659762657 40.8998034100653)
+SRID=4326;POINT(-74.2020187391779 40.9444882709976)
+SRID=4326;POINT(-74.318666634379 40.668046504386)
+SRID=4326;POINT(-74.8320596317968 40.8491289846163)
+SRID=4326;POINT(-74.6440210088998 39.9663370779506)
+SRID=4326;POINT(-74.2219402834666 40.0955914789689)
+SRID=4326;POINT(-74.6037525547762 40.7550420759644)
+SRID=4326;POINT(-74.0937601839482 40.8656933573937)
+SRID=4326;POINT(-74.4430374038438 40.7779796708969)
+SRID=4326;POINT(-74.7684170268845 40.2203845505147)
+SRID=4326;POINT(-74.1907818170678 40.739145735004)
+SRID=4326;POINT(-74.1962844392102 40.7959141570767)
+SRID=4326;POINT(-74.1913030602141 40.7433025340713)
+SRID=4326;POINT(-74.1763630799163 40.737831233597)
+SRID=4326;POINT(-74.5314873084103 39.4902945583041)
+SRID=4326;POINT(-74.1661805363706 40.7363486398654)
+SRID=4326;POINT(-74.3573260684924 40.8007679302865)
+SRID=4326;POINT(-74.1757381076133 40.7390141841291)
+SRID=4326;POINT(-74.6649158055449 40.3457273489041)
+SRID=4326;POINT(-74.3662532330192 40.5106137365586)
+SRID=4326;POINT(-74.1763187562297 40.7432915904029)
+SRID=4326;POINT(-74.4544664009791 40.5242723881508)
+SRID=4326;POINT(-74.0283665597175 40.8975658415575)
+SRID=4326;POINT(-75.0083397511198 39.8289502587993)
+SRID=4326;POINT(-74.1313222061323 40.3316152829947)
+SRID=4326;POINT(-74.6799952206859 39.4620385866365)
+SRID=4326;POINT(-74.0890480643623 40.9515804026446)
+SRID=4326;POINT(-75.1209106831221 39.9482691733624)
+SRID=4326;POINT(-74.0862802471739 40.7092900894149)
+SRID=4326;POINT(-74.7327024195045 40.2782515920205)
+SRID=4326;POINT(-74.1662530255196 40.01000430686)
+SRID=4326;POINT(-75.0183798167935 40.7447239779165)
+SRID=4326;POINT(-74.6592065330533 40.3495109704879)
+SRID=4326;POINT(-74.2475114317579 40.744341221767)
+SRID=4326;POINT(-74.6512248373302 40.2515163382362)
+SRID=4326;POINT(-74.4388020498744 40.4659008042768)
+SRID=4326;POINT(-74.2355416979199 40.6823146575314)
+SRID=4326;POINT(-74.4989293530256 40.8076383297076)
+SRID=4326;POINT(-74.0625761975523 40.7308606221026)
+SRID=4326;POINT(-75.0360016411834 39.7865925067772)
+SRID=4326;POINT(-75.0559164322449 39.4408494224665)
+SRID=4326;POINT(-74.3980433283985 40.5008690729179)
+SRID=4326;POINT(-74.0713156694968 40.7272019085637)
+SRID=4326;POINT(-74.1911791861301 40.7419629255487)
+SRID=4326;POINT(-74.0249426200973 40.7467647928245)
+SRID=4326;POINT(-74.688946675902 40.6094748964846)
+SRID=4326;POINT(-74.4460022558058 40.49825883848)
+SRID=4326;POINT(-74.198989906698 40.8577957099556)
+SRID=4326;POINT(-74.7828046028596 40.2709499874624)
+SRID=4326;POINT(-74.2501753633512 40.2174320022045)
+SRID=4326;POINT(-74.169605505782 40.9184432569356)
+SRID=4326;POINT(-74.7578885232984 41.0675476294558)
+SRID=4326;POINT(-74.0336372902943 40.7268907140294)
+SRID=4326;POINT(-74.5760699023108 40.537431636642)
+SRID=4326;POINT(-74.4392566663626 40.7735918687511)
diff --git a/regress/loader/ReprojectPts.dbf b/regress/loader/ReprojectPts.dbf
new file mode 100644 (file)
index 0000000..cfaee4b
Binary files /dev/null and b/regress/loader/ReprojectPts.dbf differ
diff --git a/regress/loader/ReprojectPts.opts b/regress/loader/ReprojectPts.opts
new file mode 100644 (file)
index 0000000..e267f85
--- /dev/null
@@ -0,0 +1,3 @@
+# This happens to be a multipoint shapefile that has only single points, so use -S.
+# It is in NJ State Plane NAD83, so reproject to 4326.
+-S -r 2260 -s 4326
diff --git a/regress/loader/ReprojectPts.select.expected b/regress/loader/ReprojectPts.select.expected
new file mode 100644 (file)
index 0000000..9b662bc
--- /dev/null
@@ -0,0 +1,66 @@
+SRID=4326;POINT(-74.1778249234186 41.0826336069609)
+SRID=4326;POINT(-74.4488128587278 40.5013374405821)
+SRID=4326;POINT(-74.0037635784167 40.281496884161)
+SRID=4326;POINT(-75.1286374176545 39.7797389049157)
+SRID=4326;POINT(-74.5762901403345 40.8559759516931)
+SRID=4326;POINT(-74.471604011296 40.5236906585584)
+SRID=4326;POINT(-75.4689168308211 39.6968833405432)
+SRID=4326;POINT(-75.1145861845469 39.7073923052699)
+SRID=4326;POINT(-74.2264370070619 40.097265631898)
+SRID=4326;POINT(-74.2676692563074 40.8352261535181)
+SRID=4326;POINT(-74.4215203668643 40.7623218114581)
+SRID=4326;POINT(-74.1866659762661 40.8998034100642)
+SRID=4326;POINT(-74.2020187391775 40.9444882709968)
+SRID=4326;POINT(-74.3186666343781 40.6680465043858)
+SRID=4326;POINT(-74.8320596317961 40.8491289846152)
+SRID=4326;POINT(-74.6440210088993 39.9663370779502)
+SRID=4326;POINT(-74.2219402834656 40.0955914789703)
+SRID=4326;POINT(-74.6037525547765 40.7550420759648)
+SRID=4326;POINT(-74.0937601839477 40.8656933573938)
+SRID=4326;POINT(-74.4430374038435 40.7779796708957)
+SRID=4326;POINT(-74.7684170268848 40.2203845505135)
+SRID=4326;POINT(-74.1907818170692 40.7391457350042)
+SRID=4326;POINT(-74.1962844392096 40.7959141570767)
+SRID=4326;POINT(-74.1913030602153 40.7433025340704)
+SRID=4326;POINT(-74.1763630799173 40.7378312335961)
+SRID=4326;POINT(-74.5314873084093 39.4902945583028)
+SRID=4326;POINT(-74.1661805363699 40.7363486398646)
+SRID=4326;POINT(-74.3573260684911 40.8007679302858)
+SRID=4326;POINT(-74.175738107613 40.739014184128)
+SRID=4326;POINT(-74.6649158055448 40.3457273489028)
+SRID=4326;POINT(-74.3662532330176 40.5106137365591)
+SRID=4326;POINT(-74.1763187562305 40.7432915904039)
+SRID=4326;POINT(-74.4544664009795 40.5242723881507)
+SRID=4326;POINT(-74.0283665597192 40.8975658415568)
+SRID=4326;POINT(-75.0083397511195 39.828950258798)
+SRID=4326;POINT(-74.131322206131 40.3316152829939)
+SRID=4326;POINT(-74.6799952206869 39.4620385866371)
+SRID=4326;POINT(-74.089048064364 40.9515804026451)
+SRID=4326;POINT(-75.1209106831206 39.948269173363)
+SRID=4326;POINT(-74.086280247174 40.7092900894139)
+SRID=4326;POINT(-74.7327024195039 40.2782515920201)
+SRID=4326;POINT(-74.166253025519 40.0100043068591)
+SRID=4326;POINT(-75.0183798167945 40.7447239779171)
+SRID=4326;POINT(-74.6592065330517 40.3495109704881)
+SRID=4326;POINT(-74.2475114317585 40.7443412217661)
+SRID=4326;POINT(-74.6512248373311 40.2515163382374)
+SRID=4326;POINT(-74.4388020498734 40.4659008042765)
+SRID=4326;POINT(-74.2355416979212 40.6823146575315)
+SRID=4326;POINT(-74.4989293530261 40.8076383297078)
+SRID=4326;POINT(-74.0625761975525 40.730860622102)
+SRID=4326;POINT(-75.0360016411836 39.7865925067785)
+SRID=4326;POINT(-75.0559164322449 39.4408494224676)
+SRID=4326;POINT(-74.3980433283988 40.5008690729166)
+SRID=4326;POINT(-74.0713156694971 40.7272019085633)
+SRID=4326;POINT(-74.1911791861303 40.74196292555)
+SRID=4326;POINT(-74.0249426200977 40.7467647928254)
+SRID=4326;POINT(-74.6889466759021 40.6094748964853)
+SRID=4326;POINT(-74.4460022558052 40.4982588384806)
+SRID=4326;POINT(-74.1989899066972 40.8577957099564)
+SRID=4326;POINT(-74.7828046028598 40.2709499874636)
+SRID=4326;POINT(-74.2501753633496 40.2174320022036)
+SRID=4326;POINT(-74.1696055057822 40.9184432569361)
+SRID=4326;POINT(-74.7578885232985 41.0675476294562)
+SRID=4326;POINT(-74.0336372902925 40.7268907140288)
+SRID=4326;POINT(-74.5760699023125 40.537431636642)
+SRID=4326;POINT(-74.4392566663643 40.7735918687515)
diff --git a/regress/loader/ReprojectPts.shp b/regress/loader/ReprojectPts.shp
new file mode 100644 (file)
index 0000000..805fbb0
Binary files /dev/null and b/regress/loader/ReprojectPts.shp differ
diff --git a/regress/loader/ReprojectPts.shx b/regress/loader/ReprojectPts.shx
new file mode 100644 (file)
index 0000000..59f0cb9
Binary files /dev/null and b/regress/loader/ReprojectPts.shx differ
diff --git a/regress/loader/ReprojectPtsGeog-pre.sql b/regress/loader/ReprojectPtsGeog-pre.sql
new file mode 100644 (file)
index 0000000..fe70406
--- /dev/null
@@ -0,0 +1,12 @@
+-- setup the spatial_ref_sys table with the two projections
+DELETE FROM spatial_ref_sys;
+---
+--- EPSG 4326 : WGS 84
+---
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ');
+---
+--- EPSG 2260 : NAD83 / New York East (ftUS)
+---
+INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (2260,'EPSG',2260,'PROJCS["NAD83 / New York East (ftUS)",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],UNIT["US survey foot",0.3048006096012192,AUTHORITY["EPSG","9003"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",38.83333333333334],PARAMETER["central_meridian",-74.5],PARAMETER["scale_factor",0.9999],PARAMETER["false_easting",492125],PARAMETER["false_northing",0],AUTHORITY["EPSG","2260"],AXIS["X",EAST],AXIS["Y",NORTH]]','+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs ');
+
+
diff --git a/regress/loader/ReprojectPtsGeog-w.select.expected b/regress/loader/ReprojectPtsGeog-w.select.expected
new file mode 100644 (file)
index 0000000..23abda9
--- /dev/null
@@ -0,0 +1,66 @@
+SRID=4326;POINT(-74.1778249234186 41.0826336069621)
+SRID=4326;POINT(-74.4488128587284 40.5013374405831)
+SRID=4326;POINT(-74.0037635784151 40.2814968841599)
+SRID=4326;POINT(-75.1286374176544 39.779738904917)
+SRID=4326;POINT(-74.5762901403342 40.8559759516941)
+SRID=4326;POINT(-74.4716040112965 40.5236906585587)
+SRID=4326;POINT(-75.4689168308202 39.6968833405426)
+SRID=4326;POINT(-75.1145861845468 39.7073923052707)
+SRID=4326;POINT(-74.2264370070618 40.097265631898)
+SRID=4326;POINT(-74.267669256308 40.835226153518)
+SRID=4326;POINT(-74.4215203668629 40.7623218114584)
+SRID=4326;POINT(-74.1866659762657 40.8998034100653)
+SRID=4326;POINT(-74.2020187391779 40.9444882709976)
+SRID=4326;POINT(-74.318666634379 40.668046504386)
+SRID=4326;POINT(-74.8320596317968 40.8491289846163)
+SRID=4326;POINT(-74.6440210088998 39.9663370779506)
+SRID=4326;POINT(-74.2219402834666 40.0955914789689)
+SRID=4326;POINT(-74.6037525547762 40.7550420759644)
+SRID=4326;POINT(-74.0937601839482 40.8656933573937)
+SRID=4326;POINT(-74.4430374038438 40.7779796708969)
+SRID=4326;POINT(-74.7684170268845 40.2203845505147)
+SRID=4326;POINT(-74.1907818170678 40.739145735004)
+SRID=4326;POINT(-74.1962844392102 40.7959141570767)
+SRID=4326;POINT(-74.1913030602141 40.7433025340713)
+SRID=4326;POINT(-74.1763630799163 40.737831233597)
+SRID=4326;POINT(-74.5314873084103 39.4902945583041)
+SRID=4326;POINT(-74.1661805363706 40.7363486398654)
+SRID=4326;POINT(-74.3573260684924 40.8007679302865)
+SRID=4326;POINT(-74.1757381076133 40.7390141841291)
+SRID=4326;POINT(-74.6649158055449 40.3457273489041)
+SRID=4326;POINT(-74.3662532330192 40.5106137365586)
+SRID=4326;POINT(-74.1763187562297 40.7432915904029)
+SRID=4326;POINT(-74.4544664009791 40.5242723881508)
+SRID=4326;POINT(-74.0283665597175 40.8975658415575)
+SRID=4326;POINT(-75.0083397511198 39.8289502587993)
+SRID=4326;POINT(-74.1313222061323 40.3316152829947)
+SRID=4326;POINT(-74.6799952206859 39.4620385866365)
+SRID=4326;POINT(-74.0890480643623 40.9515804026446)
+SRID=4326;POINT(-75.1209106831221 39.9482691733624)
+SRID=4326;POINT(-74.0862802471739 40.7092900894149)
+SRID=4326;POINT(-74.7327024195045 40.2782515920205)
+SRID=4326;POINT(-74.1662530255196 40.01000430686)
+SRID=4326;POINT(-75.0183798167935 40.7447239779165)
+SRID=4326;POINT(-74.6592065330533 40.3495109704879)
+SRID=4326;POINT(-74.2475114317579 40.744341221767)
+SRID=4326;POINT(-74.6512248373302 40.2515163382362)
+SRID=4326;POINT(-74.4388020498744 40.4659008042768)
+SRID=4326;POINT(-74.2355416979199 40.6823146575314)
+SRID=4326;POINT(-74.4989293530256 40.8076383297076)
+SRID=4326;POINT(-74.0625761975523 40.7308606221026)
+SRID=4326;POINT(-75.0360016411834 39.7865925067772)
+SRID=4326;POINT(-75.0559164322449 39.4408494224665)
+SRID=4326;POINT(-74.3980433283985 40.5008690729179)
+SRID=4326;POINT(-74.0713156694968 40.7272019085637)
+SRID=4326;POINT(-74.1911791861301 40.7419629255487)
+SRID=4326;POINT(-74.0249426200973 40.7467647928245)
+SRID=4326;POINT(-74.688946675902 40.6094748964846)
+SRID=4326;POINT(-74.4460022558058 40.49825883848)
+SRID=4326;POINT(-74.198989906698 40.8577957099556)
+SRID=4326;POINT(-74.7828046028596 40.2709499874624)
+SRID=4326;POINT(-74.2501753633512 40.2174320022045)
+SRID=4326;POINT(-74.169605505782 40.9184432569356)
+SRID=4326;POINT(-74.7578885232984 41.0675476294558)
+SRID=4326;POINT(-74.0336372902943 40.7268907140294)
+SRID=4326;POINT(-74.5760699023108 40.537431636642)
+SRID=4326;POINT(-74.4392566663626 40.7735918687511)
diff --git a/regress/loader/ReprojectPtsGeog.dbf b/regress/loader/ReprojectPtsGeog.dbf
new file mode 100644 (file)
index 0000000..cfaee4b
Binary files /dev/null and b/regress/loader/ReprojectPtsGeog.dbf differ
diff --git a/regress/loader/ReprojectPtsGeog.opts b/regress/loader/ReprojectPtsGeog.opts
new file mode 100644 (file)
index 0000000..bfb00d8
--- /dev/null
@@ -0,0 +1,3 @@
+# This happens to be a multipoint shapefile that has only single points, so use -S.
+# It is in NJ State Plane NAD83, using the -G flag will reproject to 4326.
+-S -r 2260 -G
diff --git a/regress/loader/ReprojectPtsGeog.select.expected b/regress/loader/ReprojectPtsGeog.select.expected
new file mode 100644 (file)
index 0000000..9b662bc
--- /dev/null
@@ -0,0 +1,66 @@
+SRID=4326;POINT(-74.1778249234186 41.0826336069609)
+SRID=4326;POINT(-74.4488128587278 40.5013374405821)
+SRID=4326;POINT(-74.0037635784167 40.281496884161)
+SRID=4326;POINT(-75.1286374176545 39.7797389049157)
+SRID=4326;POINT(-74.5762901403345 40.8559759516931)
+SRID=4326;POINT(-74.471604011296 40.5236906585584)
+SRID=4326;POINT(-75.4689168308211 39.6968833405432)
+SRID=4326;POINT(-75.1145861845469 39.7073923052699)
+SRID=4326;POINT(-74.2264370070619 40.097265631898)
+SRID=4326;POINT(-74.2676692563074 40.8352261535181)
+SRID=4326;POINT(-74.4215203668643 40.7623218114581)
+SRID=4326;POINT(-74.1866659762661 40.8998034100642)
+SRID=4326;POINT(-74.2020187391775 40.9444882709968)
+SRID=4326;POINT(-74.3186666343781 40.6680465043858)
+SRID=4326;POINT(-74.8320596317961 40.8491289846152)
+SRID=4326;POINT(-74.6440210088993 39.9663370779502)
+SRID=4326;POINT(-74.2219402834656 40.0955914789703)
+SRID=4326;POINT(-74.6037525547765 40.7550420759648)
+SRID=4326;POINT(-74.0937601839477 40.8656933573938)
+SRID=4326;POINT(-74.4430374038435 40.7779796708957)
+SRID=4326;POINT(-74.7684170268848 40.2203845505135)
+SRID=4326;POINT(-74.1907818170692 40.7391457350042)
+SRID=4326;POINT(-74.1962844392096 40.7959141570767)
+SRID=4326;POINT(-74.1913030602153 40.7433025340704)
+SRID=4326;POINT(-74.1763630799173 40.7378312335961)
+SRID=4326;POINT(-74.5314873084093 39.4902945583028)
+SRID=4326;POINT(-74.1661805363699 40.7363486398646)
+SRID=4326;POINT(-74.3573260684911 40.8007679302858)
+SRID=4326;POINT(-74.175738107613 40.739014184128)
+SRID=4326;POINT(-74.6649158055448 40.3457273489028)
+SRID=4326;POINT(-74.3662532330176 40.5106137365591)
+SRID=4326;POINT(-74.1763187562305 40.7432915904039)
+SRID=4326;POINT(-74.4544664009795 40.5242723881507)
+SRID=4326;POINT(-74.0283665597192 40.8975658415568)
+SRID=4326;POINT(-75.0083397511195 39.828950258798)
+SRID=4326;POINT(-74.131322206131 40.3316152829939)
+SRID=4326;POINT(-74.6799952206869 39.4620385866371)
+SRID=4326;POINT(-74.089048064364 40.9515804026451)
+SRID=4326;POINT(-75.1209106831206 39.948269173363)
+SRID=4326;POINT(-74.086280247174 40.7092900894139)
+SRID=4326;POINT(-74.7327024195039 40.2782515920201)
+SRID=4326;POINT(-74.166253025519 40.0100043068591)
+SRID=4326;POINT(-75.0183798167945 40.7447239779171)
+SRID=4326;POINT(-74.6592065330517 40.3495109704881)
+SRID=4326;POINT(-74.2475114317585 40.7443412217661)
+SRID=4326;POINT(-74.6512248373311 40.2515163382374)
+SRID=4326;POINT(-74.4388020498734 40.4659008042765)
+SRID=4326;POINT(-74.2355416979212 40.6823146575315)
+SRID=4326;POINT(-74.4989293530261 40.8076383297078)
+SRID=4326;POINT(-74.0625761975525 40.730860622102)
+SRID=4326;POINT(-75.0360016411836 39.7865925067785)
+SRID=4326;POINT(-75.0559164322449 39.4408494224676)
+SRID=4326;POINT(-74.3980433283988 40.5008690729166)
+SRID=4326;POINT(-74.0713156694971 40.7272019085633)
+SRID=4326;POINT(-74.1911791861303 40.74196292555)
+SRID=4326;POINT(-74.0249426200977 40.7467647928254)
+SRID=4326;POINT(-74.6889466759021 40.6094748964853)
+SRID=4326;POINT(-74.4460022558052 40.4982588384806)
+SRID=4326;POINT(-74.1989899066972 40.8577957099564)
+SRID=4326;POINT(-74.7828046028598 40.2709499874636)
+SRID=4326;POINT(-74.2501753633496 40.2174320022036)
+SRID=4326;POINT(-74.1696055057822 40.9184432569361)
+SRID=4326;POINT(-74.7578885232985 41.0675476294562)
+SRID=4326;POINT(-74.0336372902925 40.7268907140288)
+SRID=4326;POINT(-74.5760699023125 40.537431636642)
+SRID=4326;POINT(-74.4392566663643 40.7735918687515)
diff --git a/regress/loader/ReprojectPtsGeog.select.sql b/regress/loader/ReprojectPtsGeog.select.sql
new file mode 100644 (file)
index 0000000..06ce960
--- /dev/null
@@ -0,0 +1,2 @@
+select ST_Asewkt(the_geom::geometry) from loadedshp;
+
diff --git a/regress/loader/ReprojectPtsGeog.shp b/regress/loader/ReprojectPtsGeog.shp
new file mode 100644 (file)
index 0000000..805fbb0
Binary files /dev/null and b/regress/loader/ReprojectPtsGeog.shp differ
diff --git a/regress/loader/ReprojectPtsGeog.shx b/regress/loader/ReprojectPtsGeog.shx
new file mode 100644 (file)
index 0000000..59f0cb9
Binary files /dev/null and b/regress/loader/ReprojectPtsGeog.shx differ
diff --git a/regress/loader/TSIPolygon-wkb.sql b/regress/loader/TSIPolygon-wkb.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSIPolygon-wkt.sql b/regress/loader/TSIPolygon-wkt.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSIPolygon.shp.expected b/regress/loader/TSIPolygon.shp.expected
new file mode 100644 (file)
index 0000000..997b43f
Binary files /dev/null and b/regress/loader/TSIPolygon.shp.expected differ
diff --git a/regress/loader/TSTIPolygon-wkb.sql b/regress/loader/TSTIPolygon-wkb.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSTIPolygon-wkt.sql b/regress/loader/TSTIPolygon-wkt.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSTIPolygon.shp.expected b/regress/loader/TSTIPolygon.shp.expected
new file mode 100644 (file)
index 0000000..997b43f
Binary files /dev/null and b/regress/loader/TSTIPolygon.shp.expected differ
diff --git a/regress/loader/TSTPolygon-wkb.sql b/regress/loader/TSTPolygon-wkb.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSTPolygon-wkt.expected b/regress/loader/TSTPolygon-wkt.expected
deleted file mode 100644 (file)
index 1f4a60b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(5 5,8 5,8 8,5 8,5 5)),((-1 -1,-1 -10,-10 -10,-10 -1,-1 -1),(-5 -5,-8 -5,-8 -8,-5 -8,-5 -5)))
diff --git a/regress/loader/TSTPolygon-wkt.sql b/regress/loader/TSTPolygon-wkt.sql
deleted file mode 100644 (file)
index e680818..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-select ST_Asewkt(the_geom) from loadedshp;
-
diff --git a/regress/loader/TSTPolygon.shp.expected b/regress/loader/TSTPolygon.shp.expected
new file mode 100644 (file)
index 0000000..997b43f
Binary files /dev/null and b/regress/loader/TSTPolygon.shp.expected differ
index 059c7e1736c812179c878c75340a731b5af8f7b4..ffca0f9869dd785a8b3e3bc49bd77c68fded9b57 100644 (file)
@@ -1,6 +1,7 @@
 --
 -- spatial_ref_sys data
 --
+DELETE FROM "spatial_ref_sys";
 INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","proj4text") VALUES (4326,'EPSG',4326,'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ');
 
 --- EPSG 1021892 : Bogota 1975 / Colombia Bogota zone (deprecated)
index 3efe5d3ef8e7f1ab59156931ce513e770056dd02..8399794470df0d5c1a50f9e4dab1e02db154565e 100755 (executable)
@@ -194,217 +194,181 @@ run_simple_test ()
 }
 
 #
-#  run_loader_test 
+# This runs the loader once and checks the output of it.
+# It will NOT run if neither the expected SQL nor the expected
+# select results file exists, unless you pass true for the final
+# parameter.
 #
-#  Load a shapefile with different methods, create a 'select *' SQL
-#  test and run simple test with provided expected output. 
-#
-#  SHP input is ${TEST}.shp, expected output is {$TEST}.expected
+# $1 - Description of this run of the loader, used for error messages.
+# $2 - Table name to load into.
+# $3 - The name of the file containing what the
+#      SQL generated by shp2pgsql should look like.
+# $4 - The name of the file containing the expected results of
+#      SELECT geom FROM _tblname should look like.
+# $5 - Command line options for shp2pgsql.
+# $6 - If you pass true, this will run the loader even if neither
+#      of the expected results files exists (though of course
+#      the results won't be compared with anything).
 #
-run_loader_test ()
+run_loader_and_check_output()
 {
-       _tblname=loadedshp
-
+       _description=$1
+       _tblname=$2
+       _expected_sql_file=$3
+       _expected_select_results_file=$4
+       _loader_options=$5
+       _run_always=$6
        # ON_ERROR_STOP is used by psql to return non-0 on an error
        _psql_opts="--no-psqlrc --variable ON_ERROR_STOP=true"
 
-       #echo "SELECT * from ${_tblname}" > ${TEST}.sql
-
-       # See if there is a custom command-line options file
-       if [ -r ${TEST}.opts ]; then
-               _custom_opts=`grep -v -m1 ^\s*# ${TEST}.opts`
-       fi
-
-
-       #
-       # Run in HEXWKB insert mode
-       #
-
-       show_progress
-
-       ${SHP2PGSQL} $_custom_opts -g the_geom ${TEST}.shp $_tblname \
-               > ${TMPDIR}/loader \
-               2> ${TMPDIR}/loader.err
-
-       if [ $? -gt 0 ]; then
-               fail "running shp2pgsql" "${TMPDIR}/loader.err"
-               return 1
-
-       fi
-
-       show_progress
-
-       # MingW hack: use tr to strip off any trailing CR/LFs introduce by MingW which confuse expr
-       if [ `${PSQL} -t -A -c "SELECT count(*) FROM pg_tables WHERE tablename = '${_tblname}'" "${DB}" | tr -d '\r\n'` -gt 0 ]; then
-               ${PSQL} -c "DROP TABLE ${_tblname}" "${DB}" >> ${TMPDIR}/regress_log 2>&1
-       fi
-
-       ${PSQL} ${_psql_opts} -f ${TMPDIR}/loader "${DB}" > ${TMPDIR}/loader.err 2>&1
-       if [ $? -gt 0 ]; then
-               fail "sourcing shp2pgsql output" "${TMPDIR}/loader.err"
-               return 1
-       fi
-
-       if [ -f "${TEST}-wkb.sql" ]; then
-               if run_simple_test ${TEST}-wkb.sql ${TEST}-wkb.expected "wkb insert"; then
-                       :
-               else
-                       return 1
-               fi
-       fi
-
-
-       #
-       # Test in HEXWKB dump mode for all "normal" (no custom parameters) test cases.
-       # Some custom parameters can be incompatible with -D.
-       #
-       if [ -z "$_custom_opts" ]; then
+       if [ -n "$_run_always" -o -r "$_expected_sql_file" -o -r "$_expected_select_results_file" ]; then
                show_progress
-
-               ${SHP2PGSQL} -g the_geom -D ${TEST}.shp $_tblname \
+               # Produce the output SQL file.
+               ${SHP2PGSQL} $_loader_options -g the_geom ${TEST}.shp $_tblname \
                        > ${TMPDIR}/loader \
                        2> ${TMPDIR}/loader.err
 
                if [ $? -gt 0 ]; then
-                       fail "running shp2pgsql -D" "${TMPDIR}/loader.err"
+                       fail " $_description: running shp2pgsql" "${TMPDIR}/loader.err"
                        return 1
+               fi
 
+               # Compare the output SQL file with the expected if there is one.
+               if [ -r $_expected_sql_file ]; then
+                       show_progress
+                       if diff "${TMPDIR}/loader" "$_expected_sql_file" > /dev/null; then
+                               :
+                       else
+                               fail " $_description: actual SQL does not match expected.", \
+                                       "${TMPDIR}/loader"
+                       fi
                fi
 
-               show_progress
+               # Blow away the test table if it already exists.
+               # MingW hack: use tr to strip off any trailing CR/LFs introduce by MingW which confuse expr
+               if [ `${PSQL} -t -A -c "SELECT count(*) FROM pg_tables WHERE tablename = '${_tblname}'" "${DB}" \
+                               | tr -d '\r\n'` -gt 0 ]; then
+                       show_progress
+                       ${PSQL} -c "DROP TABLE ${_tblname}" "${DB}" >> ${TMPDIR}/regress_log 2>&1
+               fi
 
-               ${PSQL} -c "DROP table ${_tblname}" "${DB}" >> ${TMPDIR}/regress_log 2>&1
+               # Run the loader SQL script.
+               show_progress
                ${PSQL} ${_psql_opts} -f ${TMPDIR}/loader "${DB}" > ${TMPDIR}/loader.err 2>&1
                if [ $? -gt 0 ]; then
-                       fail "sourcing shp2pgsql -D output" "${TMPDIR}/loader.err"
+                       fail " $_description: running shp2pgsql output" "${TMPDIR}/loader.err"
                        return 1
                fi
 
-               if [ -f "${TEST}-wkb.sql" ]; then
-                       if run_simple_test ${TEST}-wkb.sql ${TEST}-wkb.expected "wkb dump"; then
+               # Run the select script (if there is one)
+               if [ -r "${TEST}.select.sql" ]; then
+                       if run_simple_test "${TEST}.select.sql" "$_expected_select_results_file" "$_description"; then
                                :
                        else
+                               # That will have already called fail, so just return an error.
                                return 1
                        fi
                fi
        fi
+       return 0
+}
 
-       ###########################################################
-       #
-       # Dump and compare.
-       # Do this using WKB mode, as WKT is unable to reproduce
-       # M values
-       #
+#
+# This runs the dumper once and checks the output of it.
+# It will NOT run if the expected shp file does not exist, unless
+# you pass true for the final parameter.
+#
+# $1 - Description of this run of the dumper, used for error messages.
+# $2 - Table name to dump from.
+# $3 - If you pass true, this will run the loader even if neither
+#      of the expected results files exists (though of course
+#      the results won't be compared with anything).
+#
+run_dumper_and_check_output()
+{
+       _description=$1
+       _tblname=$2
+       _run_always=$3
+       _expected_shp_file="${TEST}.shp.expected"
 
-       show_progress
+       if [ -n "$_run_always" -o -r "$_expected_shp_file" ]; then
+               show_progress
+               ${PGSQL2SHP} -f ${TMPDIR}/dumper ${DB} "${_tblname}" > "${TMPDIR}/dumper.err" 2>&1
+               if [ $? -gt 0 ]; then
+                       fail "$_description: dumping loaded table" "${TMPDIR}/dumper.err"
+                       return 1
+               fi
 
-       ${PGSQL2SHP} -f ${TMPDIR}/dumper ${DB} "${_tblname}" > "${TMPDIR}/dumper.err" 2>&1
-       if [ $? -gt 0 ]; then
-               fail "dumping loaded table" "${TMPDIR}/dumper.err"
-               return 1
+               # Compare with expected output if there is any.
+               if [ -r $_expected_shp_file ]; then
+                       show_progress
+                       if diff "${TMPDIR}"/dumper.shp "$_expected_shp_file" > /dev/null; then
+                               :
+                       else
+                               ls -lL "${TMPDIR}"/dumper.shp "$_expected_shp_file" > "${TMPDIR}"/dumper.diff
+                               fail "$_description: dumping loaded table" "${TMPDIR}/dumper.diff"
+                               return 1
+                       fi
+               fi
        fi
+       return 0
+}
 
-       show_progress
+#
+#  run_loader_test 
+#
+#  Load a shapefile with different methods, create a 'select *' SQL
+#  test and run simple test with provided expected output. 
+#
+#  SHP input is ${TEST}.shp, expected output is {$TEST}.expected
+#
+run_loader_test ()
+{
+       # See if there is a custom command-line options file
+       _custom_opts=""
+       if [ -r ${TEST}.opts ]; then
+               _custom_opts=`grep -v -m1 ^\s*# ${TEST}.opts`
+       fi
 
-       if diff "${TMPDIR}"/dumper.shp "${TEST}".shp > /dev/null; then
+       # If we have some expected files to compare with, run in wkt mode.
+       if run_loader_and_check_output "wkt test" "loadedshp" "${TEST}-w.sql.expected" "${TEST}-w.select.expected" \
+               "-w $_custom_opts"; then
                :
        else
-               ls -lL "${TMPDIR}"/dumper.shp "${TEST}".shp > "${TMPDIR}"/dumper.diff
-               fail "dumping loaded table" "${TMPDIR}/dumper.diff"
                return 1
        fi
-
-# I'm not sure it's safe to compare indexes
-#      if diff "${TMPDIR}"/dumper.shx "${TEST}".shx; then
-#              :
-#      else
-#              ls -lL "${TMPDIR}"/dumper.shx "${TEST}".shx > "${TMPDIR}"/dumper.diff
-#              fail "dumping loaded table" "${TMPDIR}/dumper.diff"
-#              return 1
-#      fi
-
-# Change in attribute sizes would make this fail
-#      if diff "${TMPDIR}"/dumper.dbf "${TEST}".dbf; then
-#              :
-#      else
-#              ls -lL "${TMPDIR}"/dumper.dbf "${TEST}".dbf > "${TMPDIR}"/dumper.diff
-#              fail "dumping loaded table" "${TMPDIR}/dumper.diff"
-#              return 1
-#      fi
-
-
-       #
-       # End of dump and compare.
-       #
-       ################################################
-
-       show_progress
-
-       ${SHP2PGSQL} $_custom_opts -g the_geom -w ${TEST}.shp $_tblname \
-               > ${TMPDIR}/loader \
-               2> ${TMPDIR}/loader.err
-
-       if [ $? -gt 0 ]; then
-               fail "running shp2pgsql -w" "${TMPDIR}/loader.err"
-               return 1
-       fi
-
-       show_progress
-
-       ${PSQL} -c "DROP table ${_tblname}" "${DB}" >> ${TMPDIR}/regress_log 2>&1
-       ${PSQL} ${_psql_opts} -f ${TMPDIR}/loader "${DB}" > ${TMPDIR}/loader.err 2>&1
-       if [ $? -gt 0 ]; then
-               fail "sourcing shp2pgsql -w output" "${TMPDIR}/loader.err"
+       # Always run in wkb ("normal") mode, even if there are no expected files to compare with.
+       if run_loader_and_check_output "wkb test" "loadedshp" "${TEST}.sql.expected" "${TEST}.select.expected" \
+               "$_custom_opts" "true"; then
+               :
+       else
                return 1
        fi
-
-       if [ -f "${TEST}-wkt.sql" ]; then
-               if run_simple_test ${TEST}-wkt.sql ${TEST}-wkt.expected "wkt insert"; then
-                       :
-               else
-                       return 1
-               fi
-       fi
-
-       #
-       # Test in WKT dump mode for all "normal" (no custom parameters) test cases.
        # Some custom parameters can be incompatible with -D.
-       #
        if [ -z "$_custom_opts" ]; then
-
-               show_progress
-
-               ${SHP2PGSQL} -g the_geom -D -w ${TEST}.shp $_tblname \
-                       > ${TMPDIR}/loader \
-                       2> ${TMPDIR}/loader.err
-
-               if [ $? -gt 0 ]; then
-                       fail "running shp2pgsql -D -w" "${TMPDIR}/loader.err"
+               # If we have some expected files to compare with, run in wkt dump mode.
+               if run_loader_and_check_output "wkt dump test" "loadedshp" "${TEST}-wD.sql.expected" \
+                       "${TEST}-w.select.expected" "-w -D"; then
+                       :
+               else
                        return 1
-
                fi
-
-               show_progress
-
-               ${PSQL} -c "DROP table ${_tblname}" "${DB}" >> ${TMPDIR}/regress_log 2>&1
-               ${PSQL} ${_psql_opts} -f ${TMPDIR}/loader "${DB}" > ${TMPDIR}/loader.err 2>&1
-               if [ $? -gt 0 ]; then
-                       fail "sourcing shp2pgsql -D -w output" "${TMPDIR}/loader.err"
+               # If we have some expected files to compare with, run in wkb dump mode.
+               if run_loader_and_check_output "wkb dump test" "loadedshp" "${TEST}-D.sql.expected" \
+                       "${TEST}.select.expected" "-D"; then
+                       :
+               else
                        return 1
                fi
-
-               if [ -f "${TEST}-wkt.sql" ]; then
-                       if run_simple_test ${TEST}-wkt.sql ${TEST}-wkt.expected "wkt dump"; then
-                               :
-                       else
-                               return 1
-                       fi
-               fi
+       fi
+       # If we have some expected files to compare with, run the dumper and compare shape files.
+       if run_dumper_and_check_output "dumper test" "loadedshp"; then
+               :
+       else
+               return 1
        fi
 
-       #rm ${TEST}.sql
-
-       return 0;
+       return 0
 }
 
 ###################################################
@@ -582,7 +546,7 @@ while [ -n "$1" ]; do
                fi
         fi
 
-       # Check .shp *before* .sql as loader test would
+       # Check .shp *before* .sql as loader test could
        # create the .sql
        if [ -r "${TEST}.shp" ]; then
                if run_loader_test; then