Skip to content

Commit f5ce843

Browse files
authored
Merge pull request #50 from OpenGeoscience/precompute-metadata
Precompute metadata
2 parents 90be99b + bd88f6c commit f5ce843

4 files changed

Lines changed: 68 additions & 8 deletions

File tree

ansible/Vagrantfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Vagrant.configure("2") do |config|
1212
# Ref: https://github.com/Kitware/minerva/pull/98#issuecomment-139023062
1313
config.vm.network "private_network", ip: "192.168.33.12"
1414
geoservices.vm.provider :virtualbox do |vb|
15-
vb.customize [ "modifyvm", :id, "--name", "geoservices","--memory", 6144 ]
15+
vb.customize [ "modifyvm", :id, "--name", "geoservices","--memory", 10000 ]
1616
end
1717
geoservices.vm.provision "ansible" do |ansible|
1818
ansible.playbook = "playbook.yml"

dataqs/helpers.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import sys
3232
from StringIO import StringIO
3333
import rasterio
34-
from osgeo import gdal
34+
from osgeo import gdal, ogr
3535
from rasterio.warp import RESAMPLING
3636
from rasterio.warp import calculate_default_transform, reproject
3737
import unicodedata
@@ -390,6 +390,60 @@ def add_keywords(keyword_list, extra_keywords):
390390
# keyword list
391391
filtered_keywords = [k for k in keyword_list if not
392392
(k.startswith('category:') or
393-
k.startswith('datetime:'))]
393+
k.startswith('datetime:') or
394+
k.startswith('layer_info'))]
394395

395396
return filtered_keywords + extra_keywords
397+
398+
399+
def _getMinMax(layer, field):
400+
min_value, max_value = float('inf'), float('-inf')
401+
for f in layer:
402+
value = f.GetField(field)
403+
if value < min_value:
404+
min_value = value
405+
if value > max_value:
406+
max_value = value
407+
408+
return {'properties': {'min': min_value, 'max': max_value},
409+
'type': 'numeric'}
410+
411+
412+
def _getNumericFields(layer):
413+
""" Gets only the numeric fields from layer"""
414+
415+
layerDefinition = layer.GetLayerDefn()
416+
numFields = []
417+
for i in xrange(layerDefinition.GetFieldCount()):
418+
fieldName = layerDefinition.GetFieldDefn(i).GetName()
419+
fieldTypeCode = layerDefinition.GetFieldDefn(i).GetType()
420+
fieldDef = layerDefinition.GetFieldDefn(i)
421+
fieldType = fieldDef.GetFieldTypeName(fieldTypeCode)
422+
if fieldType != 'String':
423+
numFields.append(fieldName)
424+
425+
return numFields
426+
427+
428+
def get_vector_layer_info(geojson):
429+
""" Gets information about a given geojson file """
430+
431+
dataSource = ogr.Open(geojson)
432+
layer = dataSource.GetLayer()
433+
geom = {0: 'polygon', 1: 'point', 2: 'line',
434+
3: 'polygon', 4: 'polygon', 5: 'polygon',
435+
6: 'polygon', -2147483647: 'point'}
436+
437+
subType = geom[layer.GetGeomType()]
438+
count = layer.GetFeatureCount()
439+
numFields = _getNumericFields(layer)
440+
info = {'layerType': 'vector', 'subType': subType}
441+
attr = {}
442+
for f in numFields:
443+
prop = _getMinMax(layer, f)
444+
prop['properties']['count'] = count
445+
attr[f.lower()] = prop
446+
layer.ResetReading()
447+
dataSource = None
448+
info['attributes'] = attr
449+
return info

dataqs/hifld/hifld.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818
###############################################################################
1919

2020
from __future__ import absolute_import
21+
import json
2122
import os
2223
import logging
2324
import time
2425
import traceback
2526
from django.conf import settings
2627
from dataqs.processor_base import GeoDataProcessor, DEFAULT_WORKSPACE
27-
from dataqs.helpers import ogr2ogr_exec, layer_exists, style_exists
28+
from dataqs.helpers import ogr2ogr_exec, layer_exists, style_exists,\
29+
get_vector_layer_info
2830
from geonode.geoserver.helpers import ogc_server_settings
2931

3032
logger = logging.getLogger("dataqs.processors")
@@ -90,6 +92,8 @@ def run(self):
9092
lyr_file = os.path.join(
9193
self.tmp_dir,
9294
self.download(layer['url'], filename=table))
95+
info = get_vector_layer_info(lyr_file)
96+
layer_info = 'layer_info:{}'.format(json.dumps(info))
9397
db = ogc_server_settings.datastore_db
9498
ogr2ogr_exec("-overwrite -skipfailures -f PostgreSQL \
9599
\"PG:host={db_host} user={db_user} password={db_pass} \
@@ -116,7 +120,7 @@ def run(self):
116120
title=layer['name'],
117121
description=layer['description'],
118122
store=datastore,
119-
extra_keywords=[keywords])
123+
extra_keywords=[keywords, layer_info])
120124
self.truncate_gs_cache(table)
121125
except Exception:
122126
logger.error('Error with layer {}'.format(layer['name']))

dataqs/usgs_quakes/usgs_quakes.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from django.db import connections
2626
from dataqs.processor_base import GeoDataProcessor, DEFAULT_WORKSPACE
2727
from dataqs.helpers import postgres_query, ogr2ogr_exec, layer_exists, \
28-
style_exists
28+
style_exists, get_vector_layer_info
2929
from geonode.geoserver.helpers import ogc_server_settings
3030

3131
logger = logging.getLogger("dataqs.processors")
@@ -106,7 +106,8 @@ def run(self, rss_file=None):
106106
"%Y-%m-%d %H:%M:%S")
107107
with open(rss_file, 'w') as modified_file:
108108
json.dump(json_data, modified_file)
109-
109+
info = get_vector_layer_info(rss_file)
110+
layer_info = 'layer_info:{}'.format(json.dumps(info))
110111
db = ogc_server_settings.datastore_db
111112
for table, title in zip(self.tables, self.titles):
112113
ogr2ogr_exec("-append -skipfailures -f PostgreSQL \
@@ -132,7 +133,8 @@ def run(self, rss_file=None):
132133
title="Earthquakes - {}".format(title),
133134
description=self.description,
134135
store=datastore,
135-
extra_keywords=['category:Geoscientific Information'])
136+
extra_keywords=['category:Geoscientific Information',
137+
layer_info])
136138
self.truncate_gs_cache(table)
137139
self.purge_old_data()
138140
self.cleanup()

0 commit comments

Comments
 (0)