aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2023-09-28 14:51:35 +0200
committerGuilhem Moulin <guilhem@fripost.org>2023-09-28 15:19:01 +0200
commitd068cc2a1058ba23515593a6e2fb8bd178946f5d (patch)
treea522fea2d6ad4fb69d549f7f9b0e223ab1220a12
parentb5c5e586bf27214aa68dcee20c610e00f2b9c745 (diff)
Add option --observation-file to choose a custom observation file name.
(Relative to project home.) Format is derived from its extension when possible.
-rwxr-xr-xgis-observation-map59
1 files changed, 50 insertions, 9 deletions
diff --git a/gis-observation-map b/gis-observation-map
index d7dc03a..dd8f5fe 100755
--- a/gis-observation-map
+++ b/gis-observation-map
@@ -95,9 +95,12 @@ parser_geom.add_argument('--point', nargs='*', metavar='X,Y', default=[],
help=f'Coordinates of interest (in {target_srs.GetName()})')
parser_geom.add_argument('--margin', metavar='N', type=int,
help='Margin (in meters) around geometry envelopes')
-parser.add_argument('--observation-format', metavar='FORMAT', default='GPKG',
- help='Format for the observation file (default: %(default)s)')
-parser.add_argument('--observation-style', default=config['QGIS']['observation-style'], metavar='STYLE_FILE', type=ePath,
+parser_obs = parser.add_argument_group('Observation file')
+parser_obs.add_argument('--observation-file', type=Path, metavar='NAME',
+ help='Observation file name relative to --project-home')
+parser_obs.add_argument('--observation-format', metavar='FORMAT',
+ help='Format for the observation file')
+parser_obs.add_argument('--observation-style', default=config['QGIS']['observation-style'], metavar='STYLE_FILE', type=ePath,
help='QGIS Layer Style File (*.qml) to apply to the observation layer (default: %(default)s)')
parser_filter = parser.add_argument_group('Search filter')
parser_filter.add_argument('--data-provider', nargs='*', metavar='IDENTIFIER', default=[],
@@ -134,6 +137,9 @@ if args.project_home is not None and args.project_name is not None:
else:
raise Exception('Invalid CRS')
+ if args.observation_file is None:
+ args.observation_file = Path('observations')
+
elif args.project_home is None or args.project_name is None:
parser.print_usage()
exit(1)
@@ -420,11 +426,10 @@ def getObservations(taxonLists, taxonRedlistCategories, searchFilter):
if 'crs' not in obs.keys():
print('WARN: GeoJSON output lacks CRS', file=sys.stderr)
- layername = 'Observations'
if obs['type'] == 'FeatureCollection' and 'features' in obs.keys() and type(obs['features']) == list:
print(f'{len(obs["features"])} observations found', file=sys.stderr)
if 'name' not in obs.keys() or obs['name'] is None:
- obs['name'] = layername
+ obs['name'] = 'Observations'
for feat in obs['features']:
if (type(feat) != dict or 'type' not in feat.keys() or feat['type'] != 'Feature'
or 'properties' not in feat.keys() or type(feat['properties']) != dict):
@@ -449,9 +454,47 @@ def getObservations(taxonLists, taxonRedlistCategories, searchFilter):
print(f'WARN: #{tid} {k}: {properties[k]} → {v}', file=sys.stderr)
properties[k] = v
- drv = ogr.GetDriverByName(args.observation_format)
+ if args.observation_file.is_absolute():
+ path = args.observation_file
+ elif args.project_home is None:
+ path = args.observation_file.expanduser()
+ else:
+ path = args.project_home.joinpath(args.observation_file)
+
+ drv = None
+ suffix = path.suffix
+ if suffix is not None and suffix != '' and suffix != '.':
+ # try to infer format from extension
+ for i in range(ogr.GetDriverCount()):
+ drv2 = ogr.GetDriver(i)
+ if drv2 is None:
+ continue
+ v = drv2.GetMetadataItem(gdal.DMD_EXTENSIONS)
+ if v is None:
+ continue
+ if suffix.removeprefix('.') in v.split(' '):
+ drv = drv2
+ break
+ if drv is None:
+ if args.observation_format is None:
+ observation_format = 'GPKG'
+ else:
+ observation_format = args.observation_format
+ drv = ogr.GetDriverByName(observation_format)
+ if drv is None:
+ raise Exception(f'Invalid format {observation_format}')
+ suffixes = drv.GetMetadataItem(gdal.DMD_EXTENSIONS).split(' ')
+ if len(suffixes) < 1 or suffixes[0] == '':
+ raise Exception(f'Invalid format {observation_format}')
+ if suffix is not None and suffix != '' and suffix != '.':
+ print(f'WARN: unknown extension "{suffix}", appending ".{suffixes[0]}"', file=sys.stderr)
+ suffix += '.' + suffixes[0]
+ path = path.with_suffix(suffix)
+
+ if args.observation_format is not None and drv.name.lower() != args.observation_format.lower():
+ print(f'WARN: overwriting observation file format to {drv.name}', file=sys.stderr)
+
if drv.name == geojson_drv.name:
- path = args.project_home.joinpath(layername.lower() + '.geojson')
with path.open(mode='w') as fp:
json.dump(obs, fp, indent=2, ensure_ascii=False)
else:
@@ -459,8 +502,6 @@ def getObservations(taxonLists, taxonRedlistCategories, searchFilter):
json.dump(obs, fp)
fp.flush()
- suffix = drv.GetMetadataItem(gdal.DMD_EXTENSIONS).split(' ')[0]
- path = args.project_home.joinpath(layername.lower()).with_suffix('.' + suffix)
gdal.VectorTranslate(path.as_posix(), fp.name, format=drv.name, reproject=True, dstSRS=target_srs)
obs = None