# prerequisites imports from ctypes import c_void_p from django.contrib.gis.gdal.error import OGRException from django.contrib.gis.gdal.prototypes.ds import \ get_driver, get_driver_by_name, get_driver_count, get_driver_name, register_all # For more information, see the OGR C API source code: # http://www.gdal.org/ogr/ogr__api_8h.html # # The OGR_Dr_* routines are relevant here. class Driver(object): "Wraps an OGR Data Source Driver." # Case-insensitive aliases for OGR Drivers. _alias = {'esri' : 'ESRI Shapefile', 'shp' : 'ESRI Shapefile', 'shape' : 'ESRI Shapefile', 'tiger' : 'TIGER', 'tiger/line' : 'TIGER', } def __init__(self, dr_input): "Initializes an OGR driver on either a string or integer input." if isinstance(dr_input, basestring): # If a string name of the driver was passed in self._ptr = None # Initially NULL self._register() # Checking the alias dictionary (case-insensitive) to see if an alias # exists for the given driver. if dr_input.lower() in self._alias: name = self._alias[dr_input.lower()] else: name = dr_input # Attempting to get the OGR driver by the string name. dr = get_driver_by_name(name) elif isinstance(dr_input, int): self._register() dr = get_driver(dr_input) elif isinstance(dr_input, c_void_p): dr = dr_input else: raise OGRException('Unrecognized input type for OGR Driver: %s' % str(type(dr_input))) # Making sure we get a valid pointer to the OGR Driver if not dr: raise OGRException('Could not initialize OGR Driver on input: %s' % str(dr_input)) self._ptr = dr def __str__(self): "Returns the string name of the OGR Driver." return get_driver_name(self._ptr) def _register(self): "Attempts to register all the data source drivers." # Only register all if the driver count is 0 (or else all drivers # will be registered over and over again) if not self.driver_count: register_all() # Driver properties @property def driver_count(self): "Returns the number of OGR data source drivers registered." return get_driver_count()