gis_.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. from osgeo import ogr
  5. from path import Path
  6. GEOM_UNKNOWN = 0
  7. GEOM_POINT = 1
  8. GEOM_LINE = 2
  9. GEOM_POLYGON = 3
  10. GEOM_MULTIPOINT = 4
  11. GEOM_MULTILINE = 5
  12. GEOM_MULTIPOLYGON = 6
  13. GEOM_NAMES = {0: "(AUCUN)",
  14. 1: "POINT",
  15. 2: "LIGNE",
  16. 3: "POLYGONE",
  17. 4: "MULTI-POINT",
  18. 5:"MULTI-LIGNE",
  19. 6:"MULTI-POLYGONE",
  20. }
  21. class Datasource():
  22. DRIVER_NAME = "ESRI Shapefile"
  23. def __init__(self, filename, readonly=True):
  24. self.filename = Path(filename)
  25. driver = ogr.GetDriverByName(self.DRIVER_NAME)
  26. self._ogr_datasource = driver.Open(filename, 0 if readonly else 1)
  27. if not self._ogr_datasource:
  28. raise IOError("Unable to read the file {}".format(filename))
  29. @property
  30. def layer(self):
  31. return Layer(self._ogr_datasource.GetLayer())
  32. class LayerField():
  33. def __init__(self, ogr_field):
  34. self.name = ogr_field.GetName()
  35. self.type_ = ogr_field.GetType()
  36. self.type_name = ogr_field.GetFieldTypeName(self.type_)
  37. self.width = ogr_field.GetWidth()
  38. self.precision = ogr_field.GetPrecision()
  39. def __repr__(self):
  40. return "<Field: nom={}, type={}, longueur={}>".format(self.name, self.type_name, self.width)
  41. class Layer():
  42. def __init__(self, ogr_layer):
  43. self._ogr_layer = ogr_layer
  44. self.name = ogr_layer.GetName()
  45. self.srid = ogr_layer.GetSpatialRef().GetAttrValue('AUTHORITY',1)
  46. self.geom_type = ogr_layer.GetGeomType()
  47. _layer_def = self._ogr_layer.GetLayerDefn()
  48. self.fields = [LayerField(_layer_def.GetFieldDefn(i)) for i in range(_layer_def.GetFieldCount())]
  49. @property
  50. def geom_name(self):
  51. return GEOM_NAMES[self._ogr_layer.GetGeomType()]
  52. def __len__(self):
  53. return self._ogr_layer.GetFeatureCount()
  54. def __iter__(self):
  55. for f in self._ogr_layer.__iter__():
  56. yield Feature(f)
  57. self._ogr_layer.ResetReading()
  58. def __getitem__(self, i):
  59. return Feature(self._ogr_layer.GetFeature(i))
  60. class Feature():
  61. def __init__(self, ogr_feature):
  62. self._ogr_feature = ogr_feature
  63. self.geom = self._ogr_feature.GetGeometryRef()
  64. self.geom_type = self.geom.GetGeometryType()
  65. self.bounding_box = self.geom.GetEnvelope()
  66. _def = ogr_feature.GetDefnRef()
  67. self.fields = [LayerField(_def.GetFieldDefn(i)) for i in range(_def.GetFieldCount())]
  68. @property
  69. def geom_name(self):
  70. return GEOM_NAMES[self.geom.GetGeometryType()]
  71. def fields(self):
  72. layerDefinition = self._ogr_layer.GetLayerDefn()
  73. return [LayerField(layerDefinition.GetFieldDefn(i)) for i in range(layerDefinition.GetFieldCount())]
  74. def __repr__(self):
  75. return "<Feature: type={}, bounding_box={}>".format(self.geom_name, self.bounding_box)
  76. def points(self):
  77. return [p for p in self.geom.GetPoints()]
  78. def __getattr__(self, key):
  79. return self._ogr_feature.__getattr__(key)
  80. if __name__ == "__main__":
  81. ds = Datasource(r"C:\dev\python\datacheck\work\STURNO_178AP1_REC_171121_OK\ARTERE_GEO.shp")
  82. layer = ds.layer
  83. print(layer.fields)
  84. # for f in layer:
  85. # print(f)
  86. f = layer[4]
  87. print(f)
  88. print(f.fields)
  89. print(f.geom)
  90. print(f.AR_ID_INSE)