[GRASS5] Re: GPJ_osr_to_grass

Paul Kelly paul-grass at stjohnspoint.co.uk
Fri Jan 27 11:45:40 EST 2006


Hello Radim

On Fri, 27 Jan 2006, Radim Blazek wrote:

[...]
> but in the body it is used as OGRSpatialReferenceH not OGRSpatialReferenceH*,
> for example OSRMorphFromESRI( hSRS ) which is defined as
> OGRErr OSRMorphFromESRI( OGRSpatialReferenceH hSRS )
>
> The parameter should be changed to OGRSpatialReferenceH hSRS
> or should it be used in the body as *hSRS? It seems that in GRASS
> is the function called with OGRSpatialReferenceH*.
> How can it work on Linux? On Windows it either crashes if
> the parameter is passed as (void **) OGRSpatialReferenceH or
> does not work if passed as OGRSpatialReferenceH*.

Yes I think there is a bug there. I remember not totally understanding it 
when I was writing it and being confused by the abstraction in the OGR 
function definitions. I think the OSRMorphFromESRI() function might be a 
problem, as it changes the contents of the OGRSpatialReferenceH structure. All
the other function calls just read from it, but it writes to it. Could you 
try the attached patch which creates a copy of the OGRSpatialReferenceH 
structure only for use in the GPJ_osr_to_grass() function, and see if it 
fixes the problem or changes anything? I am still not 100% sure what is 
wrong.

Paul
-------------- next part --------------
Index: convert.c
===================================================================
RCS file: /grassrepository/grass6/lib/proj/convert.c,v
retrieving revision 1.18
diff -u -r1.18 convert.c
--- convert.c	4 Dec 2005 14:37:08 -0000	1.18
+++ convert.c	27 Jan 2006 16:40:15 -0000
@@ -225,17 +225,22 @@
     return hSRS2;
 }
 
-int GPJ_osr_to_grass(struct Cell_head *cellhd, struct Key_Value **projinfo, 
-                     struct Key_Value **projunits, OGRSpatialReferenceH *hSRS,
+int GPJ_osr_to_grass(struct Cell_head *cellhd, struct Key_Value **projinfo,
+                     struct Key_Value **projunits, OGRSpatialReferenceH *inhSRS,
 		     int interactive)
 {
     struct Key_Value *temp_projinfo;
     char *pszProj4 = NULL, *pszRemaining;
     char *pszProj = NULL;
+    OGRSpatialReferenceH *hSRS;
     
-    if( hSRS == NULL )
+    if( inhSRS == NULL )
         goto default_to_xy;
- 
+    else
+        /* Clone a local copy of the co-ordinate system to use in
+	 * this function */
+        hSRS = OSRClone( inhSRS );
+
     /* Set finder function for locating OGR csv co-ordinate system tables */
     SetCSVFilenameHook( GPJ_set_csv_loc );
      
@@ -521,6 +526,8 @@
         G_set_key_value( "meters", szFormatBuf, *projunits );
 
     }
+
+    OSRDestroySpatialReference( hSRS );
 
     return 2;
 


More information about the grass-dev mailing list