|
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,60 @@ 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 | + 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 |
0 commit comments