#24724: GeoDjango with Django 1.8 - 'GDALAllRegister' Attribute Error
------------------------------+--------------------------------------------
     Reporter:  dimitri-      |      Owner:  nobody
  justeau                     |
         Type:  Bug           |     Status:  new
    Component:  GIS           |    Version:  1.8
     Severity:  Release       |   Keywords:  geodjango gdal windows rasters
  blocker                     |
 Triage Stage:  Unreviewed    |  Has patch:  1
Easy pickings:  0             |      UI/UX:  0
------------------------------+--------------------------------------------
 I used to work with geodjango using Django 1.7 on Windows 7, and
 everything was working well. After having upgraded to django 1.8, loading
 the gis app causes an error.

 Here is the full Traceback:


 {{{
 Traceback (most recent call last):
   File "C:\Users\justeau\PycharmProjects\Digitizing-
 Monitor\digitizing_monitor\manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "C:\Python34\lib\site-packages\django\core\management\__init__.py",
 line 338, in execute_from_command_line
     utility.execute()
   File "C:\Python34\lib\site-packages\django\core\management\__init__.py",
 line 312, in execute
     django.setup()
   File "C:\Python34\lib\site-packages\django\__init__.py", line 18, in
 setup
     apps.populate(settings.INSTALLED_APPS)
   File "C:\Python34\lib\site-packages\django\apps\registry.py", line 108,
 in populate
     app_config.import_models(all_models)
   File "C:\Python34\lib\site-packages\django\apps\config.py", line 198, in
 import_models
     self.models_module = import_module(models_module_name)
   File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
     return _bootstrap._gcd_import(name[level:], package, level)
   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
   File "<frozen importlib._bootstrap>", line 2226, in
 _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
   File "<frozen importlib._bootstrap>", line 1129, in _exec
   File "<frozen importlib._bootstrap>", line 1471, in exec_module
   File "<frozen importlib._bootstrap>", line 321, in
 _call_with_frames_removed
   File "C:\Python34\lib\site-packages\django\contrib\auth\models.py", line
 41, in <module>
     class Permission(models.Model):
   File "C:\Python34\lib\site-packages\django\db\models\base.py", line 139,
 in __new__
     new_class.add_to_class('_meta', Options(meta, **kwargs))
   File "C:\Python34\lib\site-packages\django\db\models\base.py", line 324,
 in add_to_class
     value.contribute_to_class(cls, name)
   File "C:\Python34\lib\site-packages\django\db\models\options.py", line
 250, in contribute_to_class
     self.db_table = truncate_name(self.db_table,
 connection.ops.max_name_length())
   File "C:\Python34\lib\site-packages\django\db\__init__.py", line 36, in
 __getattr__
     return getattr(connections[DEFAULT_DB_ALIAS], item)
   File "C:\Python34\lib\site-packages\django\db\utils.py", line 240, in
 __getitem__
     backend = load_backend(db['ENGINE'])
   File "C:\Python34\lib\site-packages\django\db\utils.py", line 111, in
 load_backend
     return import_module('%s.base' % backend_name)
   File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
     return _bootstrap._gcd_import(name[level:], package, level)
   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
   File "<frozen importlib._bootstrap>", line 2226, in
 _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
   File "<frozen importlib._bootstrap>", line 1129, in _exec
   File "<frozen importlib._bootstrap>", line 1471, in exec_module
   File "<frozen importlib._bootstrap>", line 321, in
 _call_with_frames_removed
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\db\backends\postgis\base.py", line 8, in
 <module>
     from .features import DatabaseFeatures
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\db\backends\postgis\features.py", line 1, in
 <module>
     from django.contrib.gis.db.backends.base.features import
 BaseSpatialFeatures
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\db\backends\base\features.py", line 3, in
 <module>
     from django.contrib.gis.db.models import aggregates
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\db\models\__init__.py", line 7, in <module>
     from django.contrib.gis.geos import HAS_GEOS
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\geos\__init__.py", line 16, in <module>
     from .geometry import GEOSGeometry, wkt_regex, hex_regex
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\geos\geometry.py", line 10, in <module>
     from django.contrib.gis.gdal.error import SRSException
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\gdal\__init__.py", line 47, in <module>
     from django.contrib.gis.gdal.driver import Driver  # NOQA
   File "C:\Python34\lib\site-packages\django\contrib\gis\gdal\driver.py",
 line 5, in <module>
     from django.contrib.gis.gdal.prototypes import ds as vcapi, raster as
 rcapi
   File "C:\Python34\lib\site-
 packages\django\contrib\gis\gdal\prototypes\raster.py", line 25, in
 <module>
     register_all = void_output(lgdal.GDALAllRegister, [])
   File "C:\Python34\lib\ctypes\__init__.py", line 364, in __getattr__
     func = self.__getitem__(name)
   File "C:\Python34\lib\ctypes\__init__.py", line 369, in __getitem__
     func = self._FuncPtr((name_or_ordinal, self))
 AttributeError: function 'GDALAllRegister' not found
 }}}


 After some searches, it appears that other people had this problem when
 using GeoDjango + Django 1.8 + Windows (example:
 https://gis.stackexchange.com/questions/143110/geodjango-setup-python-
 gdalallregister-attribute-error/144407#144407). But I could not find any
 fix for this.

 I investigated a bit, and found out that at
 django.contrib.gis.gdal.libgal, we can see this:


 {{{
     ..|
     47|  # This loads the GDAL/OGR C library
     48|  lgdal = CDLL(lib_path)
     49|
     50|  # On Windows, the GDAL binaries have some OSR routines exported
 with
     51|  # STDCALL, while others are not.  Thus, the library will also
 need to
     52|  # be loaded up as WinDLL for said OSR functions that require the
     53|  # different calling convention.
     54|  if os.name == 'nt':
     55|      from ctypes import WinDLL
     56|    lwingdal = WinDLL(lib_path)
     ..|
 }}}


 So when the os is Windows, the GDAL library is also loaded as a DLL, so we
 have two GDAL libraries, lgdal and lwingdal.

 But if we look at the django.contrib.gis.gdal.prototypes.raster (where the
 "'GDALAllRegister' not found" error is raised from), we can see that the
 one used is lgdal:


 {{{
     ..|
     29|  # Raster Driver Routines
     30|  register_all = void_output(lgdal.GDALAllRegister, [])
     31|  get_driver = voidptr_output(lgdal.GDALGetDriver, [c_int])
     32|  get_driver_by_name = voidptr_output(lgdal.GDALGetDriverByName,
 [c_char_p], errcheck=False)
     33|  get_driver_count = int_output(lgdal.GDALGetDriverCount, [])
     34|  get_driver_description =
 const_string_output(lgdal.GDALGetDescription, [c_void_p])
     ..|
 }}}


 It seems like on Windows, lwingdal should be used, so I added this after
 the imports:


 {{{
     ..|
     15|  # Fix for windows users
     16|  if os.name == 'nt':
     17|      from django.contrib.gis.gdal.libgdal import lwingdal
     18|      lgdal = lwingdal
     ..|
 }}}


 And it solved the problem for me! Maybe there is something more, it seems
 a bit too easy, but I still had no issue with it, and I now can use the
 GIS with Django 1.8 on Windows, which was impossible before this.

 Hope I helped...

 Regards,

 Dimitri.

--
Ticket URL: <https://code.djangoproject.com/ticket/24724>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/058.d9d3617d9030460113be7c6f14675573%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to