|
1 import os, sys |
|
2 from ctypes import c_char_p, CDLL |
|
3 from ctypes.util import find_library |
|
4 from django.contrib.gis.gdal.error import OGRException |
|
5 |
|
6 # Custom library path set? |
|
7 try: |
|
8 from django.conf import settings |
|
9 lib_path = settings.GDAL_LIBRARY_PATH |
|
10 except (AttributeError, EnvironmentError, ImportError): |
|
11 lib_path = None |
|
12 |
|
13 if lib_path: |
|
14 lib_names = None |
|
15 elif os.name == 'nt': |
|
16 # Windows NT shared library |
|
17 lib_names = ['gdal15'] |
|
18 elif os.name == 'posix': |
|
19 # *NIX library names. |
|
20 lib_names = ['gdal', 'gdal1.5.0'] |
|
21 else: |
|
22 raise OGRException('Unsupported OS "%s"' % os.name) |
|
23 |
|
24 # Using the ctypes `find_library` utility to find the |
|
25 # path to the GDAL library from the list of library names. |
|
26 if lib_names: |
|
27 for lib_name in lib_names: |
|
28 lib_path = find_library(lib_name) |
|
29 if not lib_path is None: break |
|
30 |
|
31 if lib_path is None: |
|
32 raise OGRException('Could not find the GDAL library (tried "%s"). ' |
|
33 'Try setting GDAL_LIBRARY_PATH in your settings.' % |
|
34 '", "'.join(lib_names)) |
|
35 |
|
36 # This loads the GDAL/OGR C library |
|
37 lgdal = CDLL(lib_path) |
|
38 |
|
39 # On Windows, the GDAL binaries have some OSR routines exported with |
|
40 # STDCALL, while others are not. Thus, the library will also need to |
|
41 # be loaded up as WinDLL for said OSR functions that require the |
|
42 # different calling convention. |
|
43 if os.name == 'nt': |
|
44 from ctypes import WinDLL |
|
45 lwingdal = WinDLL(lib_path) |
|
46 |
|
47 def std_call(func): |
|
48 """ |
|
49 Returns the correct STDCALL function for certain OSR routines on Win32 |
|
50 platforms. |
|
51 """ |
|
52 if os.name == 'nt': |
|
53 return lwingdal[func] |
|
54 else: |
|
55 return lgdal[func] |
|
56 |
|
57 #### Version-information functions. #### |
|
58 |
|
59 # Returns GDAL library version information with the given key. |
|
60 _version_info = std_call('GDALVersionInfo') |
|
61 _version_info.argtypes = [c_char_p] |
|
62 _version_info.restype = c_char_p |
|
63 |
|
64 def gdal_version(): |
|
65 "Returns only the GDAL version number information." |
|
66 return _version_info('RELEASE_NAME') |
|
67 |
|
68 def gdal_full_version(): |
|
69 "Returns the full GDAL version information." |
|
70 return _version_info('') |
|
71 |
|
72 def gdal_release_date(date=False): |
|
73 """ |
|
74 Returns the release date in a string format, e.g, "2007/06/27". |
|
75 If the date keyword argument is set to True, a Python datetime object |
|
76 will be returned instead. |
|
77 """ |
|
78 from datetime import date as date_type |
|
79 rel = _version_info('RELEASE_DATE') |
|
80 yy, mm, dd = map(int, (rel[0:4], rel[4:6], rel[6:8])) |
|
81 d = date_type(yy, mm, dd) |
|
82 if date: return d |
|
83 else: return d.strftime('%Y/%m/%d') |