"OPTIONS:\n"
));
printf(_(
- " -s <srid> Set the raster's SRID. Defaults to %d. If SRID not\n"
- " provided or is %d, raster's metadata will be checked to\n"
- " determine an appropriate SRID.\n"
+ " -s [<from>:]<srid> Set the SRID field. Defaults to %d.\n"
+ " Optionally reprojects from given SRID (cannot be used with -Y).\n"
+ " Raster's metadata will be checked to determine an appropriate SRID.\n"
+ " If a srid of %d is provided (either as from or as target).\n"
), SRID_UNKNOWN, SRID_UNKNOWN);
printf(_(
" -b <band> Index (1-based) of band to extract from raster. For more\n"
config->overview = NULL;
config->overview_table = NULL;
config->quoteident = 0;
- config->srid = SRID_UNKNOWN;
+ config->srid = config->out_srid = SRID_UNKNOWN;
config->nband = NULL;
config->nband_count = 0;
memset(config->tile_size, 0, sizeof(int) * 2);
insert_records(
const char *schema, const char *table, const char *column,
const char *filename, const char *file_column_name,
- int copy_statements,
+ int copy_statements, int out_srid,
STRINGBUFFER *tileset, STRINGBUFFER *buffer
) {
char *fn = NULL;
}
/* INSERT statements */
else {
- len = strlen("INSERT INTO () VALUES (''::raster);") + 1;
+ len = strlen("INSERT INTO () VALUES (ST_Transform(''::raster,xxxxxxxxx));") + 1;
if (schema != NULL)
len += strlen(schema);
len += strlen(table);
fn = strreplace(filename, "'", "''", NULL);
for (x = 0; x < tileset->length; x++) {
+ char *ptr;
int sqllen = len;
sqllen += strlen(tileset->line[x]);
rterror(_("insert_records: Could not allocate memory for INSERT statement"));
return 0;
}
- sprintf(sql, "INSERT INTO %s%s (%s%s%s) VALUES ('%s'::raster%s%s%s);",
- (schema != NULL ? schema : ""),
- table,
- column,
- (filename != NULL ? "," : ""),
- (filename != NULL ? file_column_name : ""),
- tileset->line[x],
- (filename != NULL ? ",'" : ""),
- (filename != NULL ? fn : ""),
- (filename != NULL ? "'" : "")
- );
+ ptr = sql;
+ ptr += sprintf(sql, "INSERT INTO %s%s (%s%s%s) VALUES (",
+ (schema != NULL ? schema : ""),
+ table,
+ column,
+ (filename != NULL ? "," : ""),
+ (filename != NULL ? file_column_name : "")
+ );
+ if (out_srid != SRID_UNKNOWN) {
+ ptr += sprintf(ptr, "ST_Transform(");
+ }
+ ptr += sprintf(ptr, "'%s'::raster",
+ tileset->line[x]
+ );
+ if (out_srid != SRID_UNKNOWN) {
+ ptr += sprintf(ptr, ", %d)", out_srid);
+ }
+ if (filename != NULL) {
+ ptr += sprintf(ptr, ",'%s'", fn);
+ }
+ ptr += sprintf(ptr, ");");
append_sql_to_buffer(buffer, sql);
sql = NULL;
if (!insert_records(
config->schema, ovtable, config->raster_column,
(config->file_column ? config->rt_filename[idx] : NULL), config->file_column_name,
- config->copy_statements,
+ config->copy_statements, config->out_srid,
tileset, buffer
)) {
rterror(_("build_overview: Could not convert raster tiles into INSERT or COPY statements"));
}
}
+ if ( info->srid == SRID_UNKNOWN && config->out_srid != SRID_UNKNOWN ) {
+ rterror(_("convert_raster: could not determine source srid, cannot transform to target srid %d"), config->out_srid);
+ GDALClose(hdsSrc);
+ return 0;
+ }
+
/* record geotransform matrix */
if (GDALGetGeoTransform(hdsSrc, info->gt) != CE_None) {
rtinfo(_("Using default geotransform matrix (0, 1, 0, 0, 0, -1) for raster: %s"), config->rt_file[idx]);
if (!insert_records(
config->schema, config->table, config->raster_column,
(config->file_column ? config->rt_filename[idx] : NULL), config->file_column_name,
- config->copy_statements,
+ config->copy_statements, config->out_srid,
tileset, buffer
)) {
rterror(_("convert_raster: Could not convert raster tiles into INSERT or COPY statements"));
if (!insert_records(
config->schema, config->table, config->raster_column,
(config->file_column ? config->rt_filename[idx] : NULL), config->file_column_name,
- config->copy_statements,
+ config->copy_statements, config->out_srid,
tileset, buffer
)) {
rterror(_("convert_raster: Could not convert raster tiles into INSERT or COPY statements"));
if (tileset.length && !insert_records(
config->schema, config->table, config->raster_column,
(config->file_column ? config->rt_filename[i] : NULL), config->file_column_name,
- config->copy_statements,
+ config->copy_statements, config->out_srid,
&tileset, buffer
)) {
rterror(_("process_rasters: Could not convert raster tiles into INSERT or COPY statements"));
if (tileset.length && !insert_records(
config->schema, config->overview_table[j], config->raster_column,
(config->file_column ? config->rt_filename[i] : NULL), config->file_column_name,
- config->copy_statements,
+ config->copy_statements, config->out_srid,
&tileset, buffer
)) {
rterror(_("process_rasters: Could not convert overview tiles into INSERT or COPY statements"));
****************************************************************************/
for (i = 1; i < argc; i++) {
+ char *optarg, *ptr;
/* srid */
if (CSEQUAL(argv[i], "-s") && i < argc - 1) {
- config->srid = atoi(argv[++i]);
+ optarg = argv[++i];
+ ptr = strchr(optarg, ':');
+ if (ptr) {
+ *ptr++ = '\0';
+ sscanf(optarg, "%d", &config->srid);
+ sscanf(ptr, "%d", &config->out_srid);
+ } else {
+ config->srid = config->out_srid = atoi(optarg);
+ }
}
/* band index */
else if (CSEQUAL(argv[i], "-b") && i < argc - 1) {
}
}
+ if (config->srid != config->out_srid) {
+ if (config->copy_statements) {
+ rterror(_("Invalid argument combination - cannot use -Y with -s FROM_SRID:TO_SRID"));
+ exit(1);
+ }
+ if (config->out_srid == SRID_UNKNOWN) {
+ rterror(_("Unknown target SRID is invalid when source SRID is given"));
+ exit(1);
+ }
+ }
+
/* register GDAL drivers */
GDALAllRegister();
--- /dev/null
+-- NOTE: the need for truncation here reveals a leak bug in previous tests
+TRUNCATE spatial_ref_sys;
+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 ')
+,
+('3857','EPSG','3857','PROJCS["WGS 84 / Pseudo-Mercator",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.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"],AXIS["X",EAST],AXIS["Y",NORTH]]','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs')
+;