def _desired_gpkg_envelope_type(flags, wkb_buffer, wkb_offset=0): """ Given some GPKG geometry flags and some WKB, returns a constant indicating the type of envelope a geometry should have. The rules are: * Points never get envelopes * Empty geometries never get envelopes * Any M components are not included in envelopes * XY and XYM geometries get XY envelopes * XYZ and XYZM geometries get XYZ envelopes """ if flags & _GPKG_EMPTY_BIT: # no need to add envelopes to empties return GPKG_ENVELOPE_NONE wkb_is_le, geom_type = _wkb_endianness_and_geometry_type( wkb_buffer, wkb_offset=wkb_offset ) flat_geom_type = ogr.GT_Flatten(geom_type) if flat_geom_type == ogr.wkbPoint: # is this a point? if so, we don't *want* an envelope # it makes them significantly bigger (29 --> 61 bytes) # and is unnecessary - any optimisation that can use a bbox # can just trivially parse the point itself return GPKG_ENVELOPE_NONE else: has_z = ogr.GT_HasZ(geom_type) if has_z: return GPKG_ENVELOPE_XYZ else: return GPKG_ENVELOPE_XY
def GeomType2Name(type): flat_type = ogr.GT_Flatten(type) dic = { ogr.wkbUnknown: ('wkbUnknown', '25D'), ogr.wkbPoint: ('wkbPoint', '25D'), ogr.wkbLineString: ('wkbLineString', '25D'), ogr.wkbPolygon: ('wkbPolygon', '25D'), ogr.wkbMultiPoint: ('wkbMultiPoint', '25D'), ogr.wkbMultiLineString: ('wkbMultiLineString', '25D'), ogr.wkbMultiPolygon: ('wkbMultiPolygon', '25D'), ogr.wkbGeometryCollection: ('wkbGeometryCollection', '25D'), ogr.wkbNone: ('wkbNone', ''), ogr.wkbLinearRing: ('wkbLinearRing', ''), ogr.wkbCircularString: ('wkbCircularString', 'Z'), ogr.wkbCompoundCurve: ('wkbCompoundCurve', 'Z'), ogr.wkbCurvePolygon: ('wkbCurvePolygon', 'Z'), ogr.wkbMultiCurve: ('wkbMultiCurve', 'Z'), ogr.wkbMultiSurface: ('wkbMultiSurface', 'Z'), ogr.wkbCurve: ('wkbCurve', 'Z'), ogr.wkbSurface: ('wkbSurface', 'Z'), ogr.wkbPolyhedralSurface: ('wkbPolyhedralSurface', 'Z'), ogr.wkbTIN: ('wkbTIN', 'Z'), ogr.wkbTriangle: ('wkbTriangle', 'Z') } ret = dic[flat_type][0] if flat_type != type: if ogr.GT_HasM(type): if ogr.GT_HasZ(type): ret += "ZM" else: ret += "M" else: ret += dic[flat_type][1] return ret
def point_transform(geom_point, coord_original, coord_target): geom_type = geom_point.GetGeometryType() z_value = ogr.GT_HasZ(geom_type) # print(z_value) # 坐标系转换 if coord_original == 'gcj02' and coord_target == 'wgs84': point_polygon_trans = gcj02towgs84(geom_point.GetX(), geom_point.GetY()) elif coord_original == 'wgs84' and coord_target == 'gcj02': point_polygon_trans = wgs84togcj02(geom_point.GetX(), geom_point.GetY()) elif coord_original == 'gcj02' and coord_target == 'bd09': point_polygon_trans = gcj02tobd09(geom_point.GetX(), geom_point.GetY()) elif coord_original == 'bd09' and coord_target == 'gcj02': point_polygon_trans = bd09togcj02(geom_point.GetX(), geom_point.GetY()) elif coord_original == 'wgs84' and coord_target == 'bd09': point_polygon_trans_gcj02 = wgs84togcj02(geom_point.GetX(), geom_point.GetY()) point_polygon_trans = gcj02tobd09(point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) elif coord_original == 'bd09' and coord_target == 'wgs84': point_polygon_trans_gcj02 = bd09togcj02(geom_point.GetX(), geom_point.GetY()) point_polygon_trans = gcj02towgs84(point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) else: point_polygon_trans = [geom_point.GetX(), geom_point.GetY()] if z_value == 1: geom_point.SetPoint(0, point_polygon_trans[0], point_polygon_trans[1], geom_point.GetZ()) else: geom_point.SetPoint_2D(0, point_polygon_trans[0], point_polygon_trans[1]) return geom_point
def getVectorTables(self, schema=None): items = [] for i in range(self.gdal_ds.GetLayerCount()): lyr = self.gdal_ds.GetLayer(i) geomtype = lyr.GetGeomType() if hasattr(ogr, 'GT_Flatten'): geomtype_flatten = ogr.GT_Flatten(geomtype) else: geomtype_flatten = geomtype geomname = ogr.GeometryTypeToName(geomtype_flatten).upper() geomdim = 'XY' if hasattr(ogr, 'GT_HasZ') and ogr.GT_HasZ(lyr.GetGeomType()): geomdim += 'Z' if hasattr(ogr, 'GT_HasM') and ogr.GT_HasM(lyr.GetGeomType()): geomdim += 'M' srs = lyr.GetSpatialRef() srid = None if srs is not None: if srs.IsProjected(): name = srs.GetAttrValue('PROJCS', 0) elif srs.IsGeographic(): name = srs.GetAttrValue('GEOGCS', 0) else: name = None srid = srs.GetAuthorityCode(None) if srid is not None: srid = int(srid) else: srid = self._fetchOne( 'SELECT srid FROM gpkg_spatial_ref_sys WHERE table_name = %s' % self.quoteString(lyr.GetName())) if srid is not None: srid = int(srid) self.mapSridToName[srid] = name if geomtype == ogr.wkbNone: item = list([ Table.TableType, lyr.GetName(), False, # is_view ]) else: item = list([ Table.VectorType, lyr.GetName(), False, # is_view lyr.GetName(), lyr.GetGeometryColumn(), geomname, geomdim, srid ]) items.append(item) return items
def get_meta_geometry_columns(self): if not self.is_spatial: return None ogr_geom_type = self.ogrlayer.GetGeomType() return { "table_name": self.table, "column_name": self.ogrlayer.GetGeometryColumn() or self.geom_cols[0], "geometry_type_name": self._get_meta_geometry_type(), "srs_id": self._get_meta_srid(), "z": int(ogr.GT_HasZ(ogr_geom_type)), "m": int(ogr.GT_HasM(ogr_geom_type)), }
def get_geometry_v2_column_schema(self): from .dataset2 import ColumnSchema if not self.is_spatial: return None name = self.ogrlayer.GetGeometryColumn() or self.geom_cols[0] geometry_type = self._get_meta_geometry_type() ogr_geom_type = self.ogrlayer.GetGeomType() z = "Z" if ogr.GT_HasZ(ogr_geom_type) else "" m = "M" if ogr.GT_HasM(ogr_geom_type) else "" extra_type_info = { "geometryType": f"{geometry_type} {z}{m}".strip(), "geometrySRS": f"EPSG:{self._get_meta_srid()}", } return ColumnSchema(ColumnSchema.new_id(), name, "geometry", None, **extra_type_info)
def get_geometry_v2_column_schema(self): if not self.is_spatial: return None name = self.ogrlayer.GetGeometryColumn() or self.geom_cols[0] geometry_type = self._get_meta_geometry_type() ogr_geom_type = self.ogrlayer.GetGeomType() z = "Z" if ogr.GT_HasZ(ogr_geom_type) else "" m = "M" if ogr.GT_HasM(ogr_geom_type) else "" extra_type_info = { "geometryType": f"{geometry_type} {z}{m}".strip(), } crs_definitions = list(self.crs_definitions()) if crs_definitions: extra_type_info["geometryCRS"] = crs_definitions[0][0] return ColumnSchema(ColumnSchema.new_id(), name, "geometry", None, **extra_type_info)
def polyline_transform(geom_polyline, coord_original, coord_target): geom_type = geom_polyline.GetGeometryType() z_value = ogr.GT_HasZ(geom_type) # print(z_value) geom_polyline_count = geom_polyline.GetPointCount() for i in range(0, geom_polyline_count): point_orginal = geom_polyline.GetPoint(i) # 坐标系转换 if coord_original == 'gcj02' and coord_target == 'wgs84': point_polygon_trans = gcj02towgs84(point_orginal[0], point_orginal[1]) elif coord_original == 'wgs84' and coord_target == 'gcj02': point_polygon_trans = wgs84togcj02(point_orginal[0], point_orginal[1]) elif coord_original == 'gcj02' and coord_target == 'bd09': point_polygon_trans = gcj02tobd09(point_orginal[0], point_orginal[1]) elif coord_original == 'bd09' and coord_target == 'gcj02': point_polygon_trans = bd09togcj02(point_orginal[0], point_orginal[1]) elif coord_original == 'wgs84' and coord_target == 'bd09': point_polygon_trans_gcj02 = wgs84togcj02(point_orginal[0], point_orginal[1]) point_polygon_trans = gcj02tobd09(point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) elif coord_original == 'bd09' and coord_target == 'wgs84': point_polygon_trans_gcj02 = bd09togcj02(point_orginal[0], point_orginal[1]) point_polygon_trans = gcj02towgs84(point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) else: point_polygon_trans = [point_orginal[0], point_orginal[1]] if z_value == 1: geom_polyline.SetPoint(i, point_polygon_trans[0], point_polygon_trans[1], point_orginal[2]) else: geom_polyline.SetPoint_2D(i, point_polygon_trans[0], point_polygon_trans[1]) return geom_polyline
def getVectorTables(self, schema=None): items = [] for i in range(self.gdal_ds.GetLayerCount()): lyr = self.gdal_ds.GetLayer(i) geomtype = lyr.GetGeomType() if hasattr(ogr, 'GT_Flatten'): geomtype_flatten = ogr.GT_Flatten(geomtype) else: geomtype_flatten = geomtype geomname = 'GEOMETRY' if geomtype_flatten == ogr.wkbPoint: geomname = 'POINT' elif geomtype_flatten == ogr.wkbLineString: geomname = 'LINESTRING' elif geomtype_flatten == ogr.wkbPolygon: geomname = 'POLYGON' elif geomtype_flatten == ogr.wkbMultiPoint: geomname = 'MULTIPOINT' elif geomtype_flatten == ogr.wkbMultiLineString: geomname = 'MULTILINESTRING' elif geomtype_flatten == ogr.wkbMultiPolygon: geomname = 'MULTIPOLYGON' elif geomtype_flatten == ogr.wkbGeometryCollection: geomname = 'GEOMETRYCOLLECTION' elif geomtype_flatten == ogr.wkbCircularString: geomname = 'CIRCULARSTRING' elif geomtype_flatten == ogr.wkbCompoundCurve: geomname = 'COMPOUNDCURVE' elif geomtype_flatten == ogr.wkbCurvePolygon: geomname = 'CURVEPOLYGON' elif geomtype_flatten == ogr.wkbMultiCurve: geomname = 'MULTICURVE' elif geomtype_flatten == ogr.wkbMultiSurface: geomname = 'MULTISURFACE' geomdim = 'XY' if hasattr(ogr, 'GT_HasZ') and ogr.GT_HasZ(lyr.GetGeomType()): geomdim += 'Z' if hasattr(ogr, 'GT_HasM') and ogr.GT_HasM(lyr.GetGeomType()): geomdim += 'M' srs = lyr.GetSpatialRef() srid = None if srs is not None: if srs.IsProjected(): name = srs.GetAttrValue('PROJCS', 0) elif srs.IsGeographic(): name = srs.GetAttrValue('GEOGCS', 0) else: name = None srid = srs.GetAuthorityCode(None) if srid is not None: srid = int(srid) else: srid = self._fetchOne( 'SELECT srid FROM gpkg_spatial_ref_sys WHERE table_name = %s' % self.quoteString(lyr.GetName())) if srid is not None: srid = int(srid) self.mapSridToName[srid] = name if geomtype == ogr.wkbNone: item = list([ Table.TableType, lyr.GetName(), False, # is_view ]) else: item = list([ Table.VectorType, lyr.GetName(), False, # is_view lyr.GetName(), lyr.GetGeometryColumn(), geomname, geomdim, srid ]) items.append(item) return items
def polygon_transform(geom_polygon, coord_original, coord_target): geom_type = geom_polygon.GetGeometryType() z_value = ogr.GT_HasZ(geom_type) # print(z_value) geom_col_polygon = ogr.Geometry(ogr.wkbGeometryCollection) geom_col_polygon.AddGeometry(geom_polygon) geom_poly = geom_polygon # print(geom_poly.GetGeometryCount()) geom_poly_o_count = geom_poly.GetGeometryCount() for m in range(0, geom_poly_o_count): geom_poly.RemoveGeometry(geom_poly_o_count - m - 1) # print('geom_poly') # print(geom_poly) # 获取polygon对象的边界 boundary_polygon = geom_col_polygon.GetGeometryRef(0).GetBoundary() # print('boundary_polygon') # print(boundary_polygon) # 获取边界的数量,如果大于1,说明有孔洞 boundary_polygon_count = boundary_polygon.GetGeometryCount() # print('boundary_polygon_count') # print(boundary_polygon_count) if boundary_polygon_count == 0: boundary_polygon_point_count = boundary_polygon.GetPointCount() ring = ogr.Geometry(ogr.wkbLinearRing) for j in range(boundary_polygon_point_count): point_polygon = boundary_polygon.GetPoint(j) # 坐标系转换 if coord_original == 'gcj02' and coord_target == 'wgs84': point_polygon_trans = gcj02towgs84(point_polygon[0], point_polygon[1]) elif coord_original == 'wgs84' and coord_target == 'gcj02': point_polygon_trans = wgs84togcj02(point_polygon[0], point_polygon[1]) elif coord_original == 'gcj02' and coord_target == 'bd09': point_polygon_trans = gcj02tobd09(point_polygon[0], point_polygon[1]) elif coord_original == 'bd09' and coord_target == 'gcj02': point_polygon_trans = bd09togcj02(point_polygon[0], point_polygon[1]) elif coord_original == 'wgs84' and coord_target == 'bd09': point_polygon_trans_gcj02 = wgs84togcj02( point_polygon[0], point_polygon[1]) point_polygon_trans = gcj02tobd09(point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) elif coord_original == 'bd09' and coord_target == 'wgs84': point_polygon_trans_gcj02 = bd09togcj02( point_polygon[0], point_polygon[1]) point_polygon_trans = gcj02towgs84( point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) else: point_polygon_trans = [point_polygon[0], point_polygon[1]] # 添加坐标点 if z_value == 1: ring.AddPoint(point_polygon_trans[0], point_polygon_trans[1], point_polygon[2]) else: ring.AddPoint_2D(point_polygon_trans[0], point_polygon_trans[1]) geom_poly.AddGeometry(ring) else: for i in range(boundary_polygon_count): boundary_polygon_ring = boundary_polygon.GetGeometryRef(i) boundary_polygon_ring_point_count = boundary_polygon_ring.GetPointCount( ) ring = ogr.Geometry(ogr.wkbLinearRing) for j in range(0, boundary_polygon_ring_point_count): point_polygon = boundary_polygon_ring.GetPoint(j) # print('point_polygon') # print(point_polygon) # 坐标系转换 if coord_original == 'gcj02' and coord_target == 'wgs84': point_polygon_trans = gcj02towgs84(point_polygon[0], point_polygon[1]) elif coord_original == 'wgs84' and coord_target == 'gcj02': point_polygon_trans = wgs84togcj02(point_polygon[0], point_polygon[1]) elif coord_original == 'gcj02' and coord_target == 'bd09': point_polygon_trans = gcj02tobd09(point_polygon[0], point_polygon[1]) elif coord_original == 'bd09' and coord_target == 'gcj02': point_polygon_trans = bd09togcj02(point_polygon[0], point_polygon[1]) elif coord_original == 'wgs84' and coord_target == 'bd09': point_polygon_trans_gcj02 = wgs84togcj02( point_polygon[0], point_polygon[1]) point_polygon_trans = gcj02tobd09( point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) elif coord_original == 'bd09' and coord_target == 'wgs84': point_polygon_trans_gcj02 = bd09togcj02( point_polygon[0], point_polygon[1]) point_polygon_trans = gcj02towgs84( point_polygon_trans_gcj02[0], point_polygon_trans_gcj02[1]) else: point_polygon_trans = [point_polygon[0], point_polygon[1]] # 添加坐标点 if z_value == 1: ring.AddPoint(point_polygon_trans[0], point_polygon_trans[1], point_polygon[2]) else: ring.AddPoint_2D(point_polygon_trans[0], point_polygon_trans[1]) geom_poly.AddGeometry(ring) return geom_poly