[GRASS5] v.in.ogr behaviour

marcos boullón magán marcosboullon at gmail.com
Fri Mar 24 13:56:37 EST 2006


Hello Stephan,

Our outputs differ again!

> Yes, strange. After your patch was applied I got this output:
> v.in.ogr dsn="PG:dbname=postgis user=gdf" layer=cntry98 out=test14
> comparing "meters"
> to "unit"
> to "units"
> to "meters"
> OSRExportToProj4() returned "+proj=utm +zone=13 +ellps=clrk66
> +datum=NAD27 +units=m +no_defs "
>
> According to the ogrinfo-output the projection should at least be
> EPSG 4326 which is latlon
>

Very strange, because program flow shouldn't arrive to OSRExportToProj4()!!

I downloaded the db you provided, EPSG 4326 latlon, successfully
imported to postgis database, run v.in.ogr and the command
consistently warned about a different projection:


In postgresql+postgis server (see the 4326 SRID?):

geoprueba=# select * from geometry_columns where f_table_name='cntry98';
 f_table_catalog | f_table_schema | f_table_name | f_geometry_column |
coord_dimension | srid |     type     | attrelid | varattnum | stats
-----------------+----------------+--------------+-------------------+-----------------+------+--------------+----------+-----------+-------
                 | public         | cntry98      | the_geom          |
              2 | 4326 | MULTIPOLYGON |          |           |


In local machine, grass 6.1:

GRASS 6.1.cvs (spearfish60):~/cvsgrass/grass6 > v.in.ogr
dsn="PG:host=escaton dbname=geoprueba user=postgres" layer=cntry98
output=test1 type=point
comparing "meters"
to "unit"
to "units"
to "meters"
ERROR: Projection of dataset does not appear to match current location.

       LOCATION PROJ_INFO is:
       name: UTM
       datum: nad27
       nadgrids: conus
       proj: utm
       ellps: clark66
       a: 6378206.4000000004
       es: 0.0067686580
       f: 294.9786982000
       zone: 13

       cellhd.proj = 0 (unreferenced/unknown)

       You can use the -o flag to v.in.ogr to override this check.
       Consider to generate a new location with 'location' parameter from
       input data set.

Outputs from g.region and ogrinfo is the same as yours. Investigating
command flow in the source code, I can see in file
grass6/vector/v.in.ogr/main.c, lines 244+ ..

/* Open OGR DSN */
Ogr_ds = OGROpen( dsn_opt->answer, FALSE, NULL );
...
for ( i = 0; i < navailable_layers; i++ ) {
  Ogr_layer =  OGR_DS_GetLayer( Ogr_ds, i );
  Ogr_featuredefn = OGR_L_GetLayerDefn( Ogr_layer );
  available_layer_names[i] = G_store ( (char *)OGR_FD_GetName(
Ogr_featuredefn ) );
}
...
Ogr_projection = OGR_L_GetSpatialRef(Ogr_layer);
...
if ( GPJ_osr_to_grass( &cellhd, &proj_info,
  &proj_units, Ogr_projection, 1) < 0 )
...

where Ogr_projection becomes a NULL pointer before calling
GPJ_osr_to_grass(). It seems to be the correct behaviour. Then, in
file grass6/lib/proj/convert.c, lines 227+ ...

int GPJ_osr_to_grass(struct Cell_head *cellhd, struct Key_Value **projinfo,
                     struct Key_Value **projunits, OGRSpatialReferenceH hSRS,
                     int interactive)
{
    struct Key_Value *temp_projinfo;
    char *pszProj4 = NULL, *pszRemaining;
    char *pszProj = NULL;

    if( hSRS == NULL )
        goto default_to_xy;
	...
	default_to_xy:
    if( cellhd != NULL )
    {
        cellhd->proj = PROJECTION_XY;
        cellhd->zone = 0;
    }
	...
    return 1;
}

So, when receiving a NULL hSRS (the Ogr_projection value), the
function GPJ_osr_to_grass() automatically assume LatLon and exit, and
the string message about OSRExportToProj4() shouldn't appear at all as
the hSRS==NULL is the very first thing checked.

What's happening here? No idea, but it seems to be an issue in your
GRASS install, not in code in CVS. Sorry.


> The segfault somes from here:
>
> comparing "meters"
> to "unit"
> to "units"
> to "meters"
> OSRExportToProj4() returned "+ellps=bessel +units=m +no_defs "
> comparing "(null)"
> to "ll"
> Segmentation fault
>
> So comparing (null) to something results in a segfault...

Yes, standard behaviour when using a NULL value in strcmp() function
(file key_value1.c, line 107). The question is, why do we get a null
for "key" value? The "key" parameter is always assigned to a static
string, except in the following files:
general/g.setproj/get_stp.c, lib/g3d/g3dkeys.c and lib/gis/get_projname.c.

It can't be in the first one: calling G_find_key_value(answer, ...) is
preceded by a strcmp(answer, ...) without producing segfault. The same
happens for the third one: strcmp(answer, ...) doesn't segfault, then
answer is not null. And no use of g3d code, so second file is also
descarted.

Again, I'm afraid the error is attached to your install. I can't
reproduce your results from my fresh GRASS 6.1 cvs install (from
yesterday) using your own data.

Sorry, but I quit. Regards,

M.

--
-- marcos boullón magán




More information about the grass-dev mailing list