Skip to content

Instantly share code, notes, and snippets.

@zhm
Created November 30, 2011 06:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zhm/1408242 to your computer and use it in GitHub Desktop.
Save zhm/1408242 to your computer and use it in GitHub Desktop.
GDAL Ruby 1.9 fix gdal_ruby.i
/*
* $Id$
*
* ruby specific code for gdal bindings.
*/
/*
* $Log$
* Revision 1.2 2005/09/26 08:18:55 cfis
* Copied over code from the Python version of gdal_ruby.i. Will have to port the code to Ruby.
*
* Revision 1.1 2005/09/02 16:19:23 kruland
* Major reorganization to accomodate multiple language bindings.
* Each language binding can define renames and supplemental code without
* having to have a lot of conditionals in the main interface definition files.
*
*/
%init %{
/* gdal_ruby.i %init code */
if ( GDALGetDriverCount() == 0 ) {
GDALAllRegister();
}
%}
%include "cpl_exceptions.i";
%header %{
static CPLXMLNode *RubyArrayToXMLTree(VALUE rubyArray)
{
int nChildCount = 0, iChild, nType;
CPLXMLNode *psThisNode;
CPLXMLNode *psChild;
char *pszText = NULL;
nChildCount = RARRAY_LEN(rubyArray) - 2;
if( nChildCount < 0 )
{
rb_raise(rb_eRuntimeError, "Error in input XMLTree, child count is less than zero.");
}
VALUE item1 = rb_ary_entry(rubyArray, 0);
nType = NUM2INT(item1);
VALUE item2 = rb_ary_entry(rubyArray, 1);
pszText = StringValuePtr(item2);
psThisNode = CPLCreateXMLNode( NULL, (CPLXMLNodeType) nType, pszText );
for( iChild = 0; iChild < nChildCount; iChild++ )
{
psChild = RubyArrayToXMLTree( rb_ary_entry(rubyArray,iChild+2) );
CPLAddXMLChild( psThisNode, psChild );
}
return psThisNode;
}
static VALUE XMLTreeToRubyArray( CPLXMLNode *psTree )
{
int nChildCount = 0, iChild;
CPLXMLNode *psChild;
for( psChild = psTree->psChild;
psChild != NULL;
psChild = psChild->psNext )
nChildCount++;
VALUE rubyArray = rb_ary_new2(nChildCount+2);
rb_ary_store(rubyArray, 0, INT2NUM((int) psTree->eType));
rb_ary_store(rubyArray, 1, rb_str_new2(psTree->pszValue));
for( psChild = psTree->psChild, iChild = 2;
psChild != NULL;
psChild = psChild->psNext, iChild++ )
{
rb_ary_store(rubyArray, iChild, XMLTreeToRubyArray(psChild));
}
return rubyArray;
}
%}
/*%extend GDAL_GCP {
%pythoncode {
def __str__(self):
str = '%s (%.2fP,%.2fL) -> (%.7fE,%.7fN,%.2f) %s '\
% (self.Id, self.GCPPixel, self.GCPLine,
self.GCPX, self.GCPY, self.GCPZ, self.Info )
return str
def serialize(self,with_Z=0):
base = [CXT_Element,'GCP']
base.append([CXT_Attribute,'Id',[CXT_Text,self.Id]])
pixval = '%0.15E' % self.GCPPixel
lineval = '%0.15E' % self.GCPLine
xval = '%0.15E' % self.GCPX
yval = '%0.15E' % self.GCPY
zval = '%0.15E' % self.GCPZ
base.append([CXT_Attribute,'Pixel',[CXT_Text,pixval]])
base.append([CXT_Attribute,'Line',[CXT_Text,lineval]])
base.append([CXT_Attribute,'X',[CXT_Text,xval]])
base.append([CXT_Attribute,'Y',[CXT_Text,yval]])
if with_Z:
base.append([CXT_Attribute,'Z',[CXT_Text,zval]])
return base
}
}
%extend GDALRasterBandShadow {
%pythoncode {
def ReadAsArray(self, xoff=0, yoff=0, win_xsize=None, win_ysize=None,
buf_xsize=None, buf_ysize=None, buf_obj=None):
import gdalnumeric
return gdalnumeric.BandReadAsArray( self, xoff, yoff,
win_xsize, win_ysize,
buf_xsize, buf_ysize, buf_obj )
def WriteArray(self, array, xoff=0, yoff=0):
import gdalnumeric
return gdalnumeric.BandWriteArray( self, array, xoff, yoff )
}
}
%extend GDALMajorObjectShadow {
%pythoncode {
def GetMetadata( self, domain = '' ):
if domain[:4] == 'xml:':
return self.GetMetadata_List( domain )
return self.GetMetadata_Dict( domain )
}
}
*/
%import typemaps_ruby.i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment