Skip to content

Commit d7f518a

Browse files
author
doruk.ozturk
committed
Add method for computing statistics about vector layers
1 parent a8ddaf4 commit d7f518a

2 files changed

Lines changed: 52 additions & 4 deletions

File tree

dataqs/helpers.py

Lines changed: 46 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,50 @@ 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+
fieldVal = [f.GetField(field) for f in layer]
401+
return {'properties': {'min': min(fieldVal), 'max': max(fieldVal)},
402+
'type': 'numeric'}
403+
404+
405+
def _getNumericFields(layer):
406+
""" Gets only the numeric fields from layer"""
407+
408+
layerDefinition = layer.GetLayerDefn()
409+
numFields = []
410+
for i in range(layerDefinition.GetFieldCount()):
411+
fieldName = layerDefinition.GetFieldDefn(i).GetName()
412+
fieldTypeCode = layerDefinition.GetFieldDefn(i).GetType()
413+
fieldDef = layerDefinition.GetFieldDefn(i)
414+
fieldType = fieldDef.GetFieldTypeName(fieldTypeCode)
415+
if fieldType != 'String':
416+
numFields.append(fieldName)
417+
418+
return numFields
419+
420+
421+
def get_vector_layer_info(geojson):
422+
""" Gets information about a given geojson file """
423+
424+
dataSource = ogr.Open(geojson)
425+
layer = dataSource.GetLayer()
426+
geom = {1: 'point', 2: 'line', 3: 'polygon'}
427+
subType = geom[layer.GetGeomType()]
428+
count = layer.GetFeatureCount()
429+
numFields = _getNumericFields(layer)
430+
info = {'layerType': 'vector', 'subType': subType}
431+
attr = {}
432+
for f in numFields:
433+
prop = _getMinMax(layer, f)
434+
prop['properties']['count'] = count
435+
attr[f.lower()] = prop
436+
layer.ResetReading()
437+
dataSource = None
438+
info['attributes'] = attr
439+
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")
@@ -80,6 +82,8 @@ def run(self):
8082
lyr_file = os.path.join(
8183
self.tmp_dir,
8284
self.download(layer['url'], filename=table))
85+
info = get_vector_layer_info(os.path.join(self.tmp_dir, table))
86+
layer_info = 'layer_info:{}'.format(json.dumps(info))
8387
db = ogc_server_settings.datastore_db
8488
ogr2ogr_exec("-overwrite -skipfailures -f PostgreSQL \
8589
\"PG:host={db_host} user={db_user} password={db_pass} \
@@ -106,7 +110,7 @@ def run(self):
106110
title=layer['name'],
107111
description=layer['description'],
108112
store=datastore,
109-
extra_keywords=[keywords])
113+
extra_keywords=[keywords, layer_info])
110114
self.truncate_gs_cache(table)
111115
except Exception:
112116
logger.error('Error with layer {}'.format(layer['name']))

0 commit comments

Comments
 (0)