示例#1
0
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
示例#2
0
文件: ogr2vrt.py 项目: rbuffat/gdal
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
示例#4
0
    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
示例#5
0
文件: init.py 项目: craigds/sno
    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)),
        }
示例#6
0
文件: init.py 项目: craigds/sno
    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)
示例#7
0
    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