|
45 | 45 | import java.awt.image.*; |
46 | 46 | import java.io.*; |
47 | 47 | import java.lang.reflect.Field; |
| 48 | +import java.lang.reflect.InvocationTargetException; |
48 | 49 | import java.lang.reflect.Method; |
49 | 50 | import java.nio.*; |
50 | 51 | import java.util.*; |
@@ -88,6 +89,25 @@ public class GDALUtils |
88 | 89 |
|
89 | 90 | public enum LatLonOrder { latLonCRSauthority, longitudeLatitude }; |
90 | 91 | private static LatLonOrder latLonOrder = LatLonOrder.latLonCRSauthority; |
| 92 | + private static int GDALversion = 0; // integer to avoid floating point compare |
| 93 | + /** |
| 94 | + * return major*10 + minor, e.g., 34 is version 3.4 |
| 95 | + */ |
| 96 | + public static int getGDALversion() { |
| 97 | + return GDALversion; |
| 98 | + } |
| 99 | + private static void initGDALversion() |
| 100 | + { |
| 101 | + int major, minor; |
| 102 | + String versionNum = gdal.VersionInfo("VERSION_NUM"); |
| 103 | + major = Integer.parseInt(versionNum.substring(0,1)); |
| 104 | + if (versionNum.length() == 4) { |
| 105 | + minor = Integer.parseInt(versionNum.substring(1,2)); |
| 106 | + } else { |
| 107 | + minor = Integer.parseInt(versionNum.substring(2,3)); |
| 108 | + } |
| 109 | + GDALversion = major*10 + minor; |
| 110 | + } |
91 | 111 |
|
92 | 112 | static |
93 | 113 | { |
@@ -152,36 +172,35 @@ public enum LatLonOrder { latLonCRSauthority, longitudeLatitude }; |
152 | 172 | String msg = Logging.getMessage("generic.LibraryLoadedOK", gdal.VersionInfo("--version")); |
153 | 173 | Logging.logger().info(msg); |
154 | 174 |
|
| 175 | + initGDALversion(); |
| 176 | + |
155 | 177 | // For GDAL 3.x, the PROJ6 library is used, which requires the location of the 'proj.db' file. |
156 | 178 | // References: |
157 | 179 | // https://github.com/OSGeo/gdal/issues/1191 |
158 | 180 | // https://github.com/OSGeo/gdal/pull/1658/ |
159 | 181 | // |
160 | | - String projdbPath = System.getenv("PROJ_LIB"); |
161 | | - if (projdbPath != null) { |
162 | | - Logging.logger().info("env PROJ_LIB = " + projdbPath); |
163 | | - } else { |
164 | | - String versionNum = gdal.VersionInfo("VERSION_NUM"); |
165 | | - if (Integer.parseInt(versionNum.substring(0,1)) >= 3) { |
166 | | - Method setProj = null; |
167 | | - try { |
168 | | - setProj = org.gdal.osr.osr.class.getMethod("SetPROJSearchPath", String.class); |
169 | | - } catch (NoSuchMethodException e) {} |
170 | | - |
171 | | - if (setProj != null) { |
172 | | - // Search for proj.db |
173 | | - for (String dir : searchDirs) { |
174 | | - projdbPath = findGdalProjDB(dir); |
175 | | - if (projdbPath != null) { |
176 | | - setProj.invoke(null, projdbPath); |
177 | | - Logging.logger().info("proj.db in " + projdbPath + " (discovered)"); |
178 | | - break; |
179 | | - } |
180 | | - } |
181 | | - } |
182 | | - } |
183 | | - if (projdbPath == null) |
184 | | - Logging.logger().severe("*** ERROR - GDAL requires PROJ_LIB env var to locate 'proj.db'"); |
| 182 | + |
| 183 | + if (GDALversion >= 30) { |
| 184 | + String projdbPath = System.getenv("PROJ_LIB"); |
| 185 | + if (projdbPath != null) { |
| 186 | + Logging.logger().info("env PROJ_LIB = " + projdbPath); |
| 187 | + } else { |
| 188 | + // For GDAL 3.x, can set location programmatically |
| 189 | + try { |
| 190 | + Method setProj = org.gdal.osr.osr.class.getMethod("SetPROJSearchPath", String.class); |
| 191 | + // Search for proj.db |
| 192 | + for (String dir : searchDirs) { |
| 193 | + projdbPath = findGdalProjDB(dir); |
| 194 | + if (projdbPath != null) { |
| 195 | + setProj.invoke(null, projdbPath); |
| 196 | + Logging.logger().info("proj.db in " + projdbPath + " (discovered)"); |
| 197 | + break; |
| 198 | + } |
| 199 | + } |
| 200 | + } catch (NoSuchMethodException e) {} |
| 201 | + } |
| 202 | + if (projdbPath == null) |
| 203 | + Logging.logger().severe("*** ERROR - GDAL requires PROJ_LIB env var to locate 'proj.db'"); |
185 | 204 | } |
186 | 205 |
|
187 | 206 | listAllRegisteredDrivers(); |
@@ -216,9 +235,12 @@ public static void setGDAL3axis(SpatialReference srs) |
216 | 235 | Field v = org.gdal.osr.osrConstants.class.getField("OAMS_TRADITIONAL_GIS_ORDER"); |
217 | 236 | setAxis.invoke(srs, v.getInt(v)); |
218 | 237 | latLonOrder = LatLonOrder.longitudeLatitude; |
219 | | - } catch (Exception e) { |
220 | | - e.printStackTrace(); |
221 | | - } |
| 238 | + } catch (NoSuchMethodException e) { |
| 239 | + } catch (NoSuchFieldException e) { |
| 240 | + } catch (InvocationTargetException e) { |
| 241 | + } catch (IllegalAccessException e) { |
| 242 | + } catch (IllegalArgumentException e) { |
| 243 | + } |
222 | 244 | } |
223 | 245 |
|
224 | 246 | public static LatLonOrder getLatLonOrder() { return latLonOrder; } |
|
0 commit comments