|
31 | 31 | import sys |
32 | 32 | from StringIO import StringIO |
33 | 33 | import rasterio |
34 | | -from osgeo import gdal |
| 34 | +from osgeo import gdal, ogr |
35 | 35 | from rasterio.warp import RESAMPLING |
36 | 36 | from rasterio.warp import calculate_default_transform, reproject |
37 | 37 | import unicodedata |
@@ -390,6 +390,50 @@ def add_keywords(keyword_list, extra_keywords): |
390 | 390 | # keyword list |
391 | 391 | filtered_keywords = [k for k in keyword_list if not |
392 | 392 | (k.startswith('category:') or |
393 | | - k.startswith('datetime:'))] |
| 393 | + k.startswith('datetime:') or |
| 394 | + k.startswith('layer_info'))] |
394 | 395 |
|
395 | 396 | 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 |
0 commit comments