44
44
import java .awt .color .*;
45
45
import java .awt .image .*;
46
46
import java .io .*;
47
+ import java .lang .reflect .Method ;
47
48
import java .nio .*;
48
49
import java .util .*;
49
50
import java .util .concurrent .atomic .AtomicBoolean ;
@@ -86,41 +87,30 @@ public class GDALUtils
86
87
87
88
static
88
89
{
89
- try
90
- {
91
- boolean runningAsJavaWebStart = (System .getProperty ("javawebstart.version" , null ) != null );
90
+ try {
91
+ String [] searchDirs ;
92
+ if (Configuration .isWindowsOS ())
93
+ searchDirs = new String [] { getCurrentDirectory (), "C:\\ Program Files\\ GDAL" };
94
+ else
95
+ searchDirs = new String [] { getCurrentDirectory (), "/usr/share/gdal" , "/usr/lib" , "/usr/lib/gdal" };
92
96
93
- if (!runningAsJavaWebStart )
94
- {
95
- String [] searchDirs ;
96
- if (Configuration .isWindowsOS ())
97
- {
98
- searchDirs = new String [] { getCurrentDirectory (), "C:\\ Program Files\\ GDAL" };
99
- }
100
- else
101
- {
102
- searchDirs = new String [] { getCurrentDirectory (), "/usr/share/gdal" , "/usr/lib" , "/usr/lib/gdal" };
103
- }
97
+ boolean runningAsJavaWebStart = (System .getProperty ("javawebstart.version" , null ) != null );
104
98
99
+ if (!runningAsJavaWebStart ) {
105
100
// If the environment variables are set, no need to set configuration options.
106
101
String dataFolder = System .getenv (GDAL_DATA_PATH );
107
- if (dataFolder == null )
108
- {
109
- for (String dir : searchDirs )
110
- {
102
+ if (dataFolder == null ) {
103
+ for (String dir : searchDirs ) {
111
104
dataFolder = findGdalDataFolder (dir );
112
- if (dataFolder != null )
113
- {
105
+ if (dataFolder != null ) {
114
106
String msg = Logging .getMessage ("gdal.SharedDataFolderFound" , dataFolder , Logging .getMessage ("gdal.FolderDiscovered" ));
115
107
Logging .logger ().info (msg );
116
108
gdal .SetConfigOption (GDAL_DATA_PATH , dataFolder );
117
109
break ;
118
110
}
119
111
}
120
112
if (dataFolder == null )
121
- {
122
113
Logging .logger ().log (Level .WARNING , "gdal.SharedDataFolderNotFound" );
123
- }
124
114
} else {
125
115
String msg = Logging .getMessage ("gdal.SharedDataFolderFound" , dataFolder , Logging .getMessage ("gdal.FolderFromEnv" , GDAL_DATA_PATH ));
126
116
Logging .logger ().info (msg );
@@ -129,21 +119,17 @@ public class GDALUtils
129
119
// Try for GDAL_DRIVER_PATH
130
120
String drvpath = System .getenv (GDAL_DRIVER_PATH );
131
121
if (drvpath == null ) {
132
- for (String dir : searchDirs )
133
- {
122
+ for (String dir : searchDirs ) {
134
123
drvpath = findGdalPlugins (dir );
135
- if (drvpath != null )
136
- {
124
+ if (drvpath != null ) {
137
125
String msg = Logging .getMessage ("gdal.PluginFolderFound" , drvpath , Logging .getMessage ("gdal.FolderDiscovered" ));
138
126
Logging .logger ().info (msg );
139
127
gdal .SetConfigOption (GDAL_DRIVER_PATH , drvpath );
140
128
break ;
141
129
}
142
130
}
143
131
if (drvpath == null )
144
- {
145
132
Logging .logger ().log (Level .WARNING , "gdal.PluginFolderNotFound" );
146
- }
147
133
} else {
148
134
String msg = Logging .getMessage ("gdal.PluginFolderFound" , drvpath , Logging .getMessage ("gdal.FolderFromEnv" , GDAL_DRIVER_PATH ));
149
135
Logging .logger ().info (msg );
@@ -163,38 +149,52 @@ public class GDALUtils
163
149
Logging .logger ().info (msg );
164
150
165
151
// For GDAL 3.x, the PROJ6 library is used, which requires the location of the 'proj.db' file.
166
- // Future GDAL releases will allow programatic setting of the location of the 'proj.db' file.
167
- // For GDAL 3.0.0, the user must set the PROJ_LIB envirnment variable for the location.
168
- // For now, just give a warning.
169
152
// References:
170
153
// https://github.com/OSGeo/gdal/issues/1191
171
154
// https://github.com/OSGeo/gdal/pull/1658/
172
155
//
173
- String versionNum = gdal .VersionInfo ("VERSION_NUM" );
174
- if (Integer .parseInt (versionNum .substring (0 ,1 )) >= 3 ) {
175
- if (System .getenv ("PROJ_LIB" ) == null ) {
176
- System .err .println ("*** ERROR - GDAL requires PROJ_LIB env var to locate 'proj.db'" );
177
- }
178
- }
179
- listAllRegisteredDrivers ();
156
+ String projdbPath = System .getenv ("PROJ_LIB" );
157
+ if (projdbPath != null ) {
158
+ Logging .logger ().info ("env PROJ_LIB = " + projdbPath );
159
+ } else {
160
+ String versionNum = gdal .VersionInfo ("VERSION_NUM" );
161
+ if (Integer .parseInt (versionNum .substring (0 ,1 )) >= 3 ) {
162
+ Method setProj = null ;
163
+ try {
164
+ setProj = org .gdal .osr .osr .class .getMethod ("SetPROJSearchPath" , String .class );
165
+ } catch (NoSuchMethodException e ) {}
166
+
167
+ if (setProj != null ) {
168
+ // Search for proj.db
169
+ for (String dir : searchDirs ) {
170
+ projdbPath = findGdalProjDB (dir );
171
+ if (projdbPath != null ) {
172
+ setProj .invoke (null , projdbPath );
173
+ Logging .logger ().info ("proj.db in " + projdbPath + " (discovered)" );
174
+ break ;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ if (projdbPath == null )
180
+ Logging .logger ().severe ("*** ERROR - GDAL requires PROJ_LIB env var to locate 'proj.db'" );
181
+ }
182
+
183
+ listAllRegisteredDrivers ();
180
184
181
185
gdalIsAvailable .set (true );
182
- }
183
- catch (Throwable throwable )
184
- {
186
+
187
+ } catch (Throwable throwable ) {
185
188
String reason = Logging .getMessage ("generic.LibraryNotFound" , "GDAL" );
186
189
String msg = Logging .getMessage ("generic.LibraryNotLoaded" , "GDAL" , reason );
187
190
Logging .logger ().warning (msg );
188
191
String throwableMessage = (throwable .getMessage () != null ) ? throwable .getMessage () : "" ;
189
192
Logging .logger ().log (Level .WARNING , throwableMessage , throwable );
190
193
Logging .logger ().info (JAVA_LIBRARY_PATH + "=" + System .getProperty (JAVA_LIBRARY_PATH ));
191
194
Logging .logger ().info ("user.dir" + "=" + getCurrentDirectory ());
192
- if (Configuration .isWindowsOS ())
193
- {
195
+ if (Configuration .isWindowsOS ()) {
194
196
Logging .logger ().info ("PATH" + "=" + System .getenv ("PATH" ));
195
- }
196
- else
197
- {
197
+ } else {
198
198
Logging .logger ().info ("LD_LIBRARY_PATH" + "=" + System .getenv ("LD_LIBRARY_PATH" ));
199
199
}
200
200
}
@@ -204,8 +204,7 @@ protected static String getCurrentDirectory()
204
204
{
205
205
String cwd = System .getProperty ("user.dir" );
206
206
207
- if (cwd == null || cwd .length () == 0 )
208
- {
207
+ if (cwd == null || cwd .length () == 0 ) {
209
208
String message = Logging .getMessage ("generic.UsersHomeDirectoryNotKnown" );
210
209
Logging .logger ().severe (message );
211
210
throw new WWRuntimeException (message );
@@ -229,52 +228,69 @@ public boolean accept(File pathname)
229
228
File [] filenames = (new File (dir )).listFiles (filter );
230
229
231
230
if (filenames != null && filenames .length > 0 )
232
- {
233
231
return filenames [0 ].getAbsolutePath ();
234
- }
235
232
else
236
- {
237
233
return null ;
238
- }
239
234
}
240
235
241
236
protected static String findGdalDataFolder (String dir )
242
237
{
243
- try
244
- {
238
+ try {
245
239
FileTree fileTree = new FileTree (new File (dir ));
246
240
fileTree .setMode (FileTree .FILES_AND_DIRECTORIES );
247
241
248
- GDALDataFinder filter = new GDALDataFinder ();
249
- fileTree .asList (filter );
250
- ArrayList <String > folders = filter .getFolders ();
251
-
252
- if (!folders .isEmpty ()) {
253
- if (folders .size () > 1 ) {
254
- String msg = Logging .getMessage ("gdal.MultipleDataFoldersFound" , folders .get (1 ));
255
- Logging .logger ().warning (msg );
256
- }
257
- return folders .get (0 );
258
- }
259
- }
260
- catch (Throwable t )
261
- {
242
+ String [] datumNames = { "gdal_datum.csv" , "gt_datum.csv" };
243
+ for (String s : datumNames ) {
244
+ GDALFileFinder filter = new GDALFileFinder (s );
245
+ fileTree .asList (filter );
246
+ ArrayList <String > folders = filter .getFolders ();
247
+
248
+ if (!folders .isEmpty ()) {
249
+ if (folders .size () > 1 ) {
250
+ String msg = Logging .getMessage ("gdal.MultipleDataFoldersFound" , folders .get (1 ));
251
+ Logging .logger ().warning (msg );
252
+ }
253
+ return folders .get (0 );
254
+ }
255
+ }
256
+ } catch (Throwable t ) {
262
257
Logging .logger ().severe (t .getMessage ());
263
258
}
264
259
return null ;
265
260
}
261
+
262
+ protected static String findGdalProjDB (String dir )
263
+ {
264
+ try {
265
+ FileTree fileTree = new FileTree (new File (dir ));
266
+ fileTree .setMode (FileTree .FILES_AND_DIRECTORIES );
267
+
268
+ GDALFileFinder filter = new GDALFileFinder ("proj.db" );
269
+ fileTree .asList (filter );
270
+ ArrayList <String > folders = filter .getFolders ();
271
+
272
+ if (!folders .isEmpty ()) {
273
+ if (folders .size () > 1 ) {
274
+ String msg = Logging .getMessage ("gdal.MultipleProjDbFoldersFound" , folders .get (1 ));
275
+ Logging .logger ().warning (msg );
276
+ }
277
+ return folders .get (0 );
278
+ }
279
+ } catch (Throwable t ) {
280
+ Logging .logger ().severe (t .getMessage ());
281
+ }
282
+
283
+ return null ;
284
+ }
266
285
267
286
protected static String buildPathString (String [] folders )
268
287
{
269
288
String del = File .pathSeparator ;
270
289
StringBuffer path = new StringBuffer ();
271
290
272
- if (null != folders && folders .length > 0 )
273
- {
291
+ if (null != folders && folders .length > 0 ) {
274
292
for (String folder : folders )
275
- {
276
293
path .append (folder ).append (del );
277
- }
278
294
}
279
295
280
296
return path .toString ();
0 commit comments