Example #1
0
def test_ogr_factory_2():

    src_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt()

    src_wkt = 'MULTISURFACE (((0 0,100 0,100 100,0 0)))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt()

    src_wkt = 'CURVEPOLYGON ((0 0,100 0,100 100,0 0))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt()

    src_wkt = 'CURVEPOLYGON (CIRCULARSTRING(0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))'
    exp_wkt = 'POLYGON ((0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt()
Example #2
0
def get_lonlat_intersection(geometry1, geometry2):
    """
    gets the intersect in lonlat space.
    geometry1 is split at the antimeridian
    (i.e. the 180 degree dateline)

    Parameters
    ----------
    geometry1 : OGRGeometry
        polygon geometry object in lonlat space
        is split by the antimeridian
    geometry2 : OGRGeometry
        geometry object
        should be the large one

    Returns
    -------
    boolean
        does geometry1 intersect with geometry2?
    """

    geometry1c = geometry1.Clone()
    geometry2c = geometry2.Clone()
    geometry1 = None
    geometry2 = None

    if geometry1c.GetGeometryName() == 'MULTIPOLYGON':
        geometry1c = ogr.ForceToPolygon(geometry1c)
        print(
            'Warning: get_lonlat_intersection(): Take care: Multipolygon is forced to Polygon!'
        )

    polygons = split_polygon_by_antimeridian(geometry1c)

    return polygons.Intersection(geometry2c)
Example #3
0
def test_ogr_factory_6():

    src_wkt_list = [
        None,
        'POINT EMPTY',
        'LINESTRING EMPTY',
        'POLYGON EMPTY',
        'MULTIPOINT EMPTY',
        'MULTILINESTRING EMPTY',
        'MULTIPOLYGON EMPTY',
        'GEOMETRYCOLLECTION EMPTY',
        'POINT(0 0)',
        'LINESTRING(0 0)',
        'POLYGON((0 0))',
        'POLYGON(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTIPOINT(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTILINESTRING(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTIPOLYGON(((0 0),EMPTY,(1 1)),EMPTY,((2 2)))',
        'GEOMETRYCOLLECTION(POINT EMPTY)',
        'GEOMETRYCOLLECTION(LINESTRING EMPTY)',
        'GEOMETRYCOLLECTION(POLYGON EMPTY)',
        'GEOMETRYCOLLECTION(MULTIPOINT EMPTY)',
        'GEOMETRYCOLLECTION(MULTILINESTRING EMPTY)',
        'GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY)',
        'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY)',
        'GEOMETRYCOLLECTION(POINT(0 0))',
        'GEOMETRYCOLLECTION(LINESTRING(0 0),LINESTRING(1 1))',
        'GEOMETRYCOLLECTION(POLYGON((0 0),EMPTY,(2 2)), POLYGON((1 1)))',
        'CURVEPOLYGON EMPTY',
        'CURVEPOLYGON ((0 0,0 1,1 1,1 0,0 0))',
        'CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))',
        'COMPOUNDCURVE EMPTY',
        'COMPOUNDCURVE ((0 0,0 1,1 1,1 0,0 0))',
        'COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))',
        'CIRCULARSTRING EMPTY',
        'CIRCULARSTRING (0 0,1 0,0 0)',
        'MULTISURFACE EMPTY',
        'MULTISURFACE (((0 0,0 1,1 1,1 0,0 0)))',
        'MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,1 0,0 0)))',
        'MULTICURVE EMPTY',
        'MULTICURVE ((0 0,0 1))',
        'MULTICURVE (COMPOUNDCURVE((0 0,0 1)))',
        'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))',
    ]

    for src_wkt in src_wkt_list:
        if src_wkt is None:
            src_geom = None
        else:
            src_geom = ogr.CreateGeometryFromWkt(src_wkt)

        ogr.ForceToPolygon(src_geom)
        ogr.ForceToMultiPolygon(src_geom)
        ogr.ForceToMultiPoint(src_geom)
        ogr.ForceToMultiLineString(src_geom)
        ogr.ForceToLineString(src_geom)
        for target_type in range(ogr.wkbMultiSurface):
            gdal.PushErrorHandler('CPLQuietErrorHandler')
            ogr.ForceTo(src_geom, 1 + target_type)
            gdal.PopErrorHandler()
Example #4
0
def ogr_factory_2():

    src_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    if ogrtest.check_feature_geometry(dst_geom, exp_wkt):
        print(dst_geom.ExportToWkt())
        return 'fail'

    src_wkt = 'MULTISURFACE (((0 0,100 0,100 100,0 0)))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    if ogrtest.check_feature_geometry(dst_geom, exp_wkt):
        print(dst_geom.ExportToWkt())
        return 'fail'

    src_wkt = 'CURVEPOLYGON ((0 0,100 0,100 100,0 0))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    if ogrtest.check_feature_geometry(dst_geom, exp_wkt):
        print(dst_geom.ExportToWkt())
        return 'fail'

    src_wkt = 'CURVEPOLYGON (CIRCULARSTRING(0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))'
    exp_wkt = 'POLYGON ((0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    if ogrtest.check_feature_geometry(dst_geom, exp_wkt):
        print(dst_geom.ExportToWkt())
        return 'fail'

    return 'success'
Example #5
0
def ogr_factory_2():

    src_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))'
    exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))'

    src_geom = ogr.CreateGeometryFromWkt(src_wkt)
    dst_geom = ogr.ForceToPolygon(src_geom)

    if ogrtest.check_feature_geometry(dst_geom, exp_wkt):
        print(dst_geom.ExportToWkt())
        return 'fail'

    return 'success'
Example #6
0
def create_geometry(entity_geometry):
    assert entity_geometry is not None
    # Get geometry from GEOJSON or WKTstring (GraphQLStreaming)
    geometry_wkt = shape(entity_geometry).wkt if isinstance(
        entity_geometry, dict) else entity_geometry
    # Add geometrie
    poly = ogr.CreateGeometryFromWkt(geometry_wkt)

    # Force geometriecollection to polygon
    if poly and poly.GetGeometryType() == ogr.wkbGeometryCollection:
        poly = ogr.ForceToPolygon(poly)

    return poly
Example #7
0
def loadGeometry(poLyr):
    poGeom = None
    poFeat = poLyr.GetNextFeature()
    ifeaCount = 0
    while poFeat is not None:
        posrcGeom = poFeat.GetGeometryRef()
        posrcGeom = ogr.ForceToPolygon(posrcGeom)
        if ifeaCount == 0:
            pResGeo = posrcGeom.Clone()

        if ifeaCount == 3:
            print("error")

        if posrcGeom is not None:
            eType = wkbFlatten(posrcGeom.GetGeometryType())

            # if poGeom is None:
            #     poGeom = ogr.Geometry(ogr.wkbMultiPolygon)

            if eType == ogr.wkbPolygon:
                # poGeom.AddGeometry(posrcGeom)
                pResGeo = pResGeo.Union(posrcGeom)
            elif eType == ogr.wkbMultiPolygon:
                if posrcGeom is not None:
                    for iGeom in range(posrcGeom.GetGeometryCount()):
                        # poGeom.AddGeometry(posrcGeom.GetGeometryRef(iGeom))
                        pResGeo = pResGeo.Union(posrcGeom)
            else:
                print("ERROR: Geometry not of polygon type.")
                return None

        print(ifeaCount)
        poFeat = poLyr.GetNextFeature()
        ifeaCount += 1

    # pGeo = poGeom.UnionCascaded()
    return ogr.ForceToPolygon(pResGeo)
Example #8
0
def ogr_factory_6():

    src_wkt_list = [
        None,
        'POINT EMPTY',
        'LINESTRING EMPTY',
        'POLYGON EMPTY',
        'MULTIPOINT EMPTY',
        'MULTILINESTRING EMPTY',
        'MULTIPOLYGON EMPTY',
        'GEOMETRYCOLLECTION EMPTY',
        'POINT(0 0)',
        'LINESTRING(0 0)',
        'POLYGON((0 0))',
        'POLYGON(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTIPOINT(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTILINESTRING(EMPTY,(0 0),EMPTY,(1 1))',
        'MULTIPOLYGON(((0 0),EMPTY,(1 1)),EMPTY,((2 2)))',
        'GEOMETRYCOLLECTION(POINT EMPTY)',
        'GEOMETRYCOLLECTION(LINESTRING EMPTY)',
        'GEOMETRYCOLLECTION(POLYGON EMPTY)',
        'GEOMETRYCOLLECTION(MULTIPOINT EMPTY)',
        'GEOMETRYCOLLECTION(MULTILINESTRING EMPTY)',
        'GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY)',
        'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY)',
        'GEOMETRYCOLLECTION(POINT(0 0))',
        'GEOMETRYCOLLECTION(LINESTRING(0 0),LINESTRING(1 1))',
        'GEOMETRYCOLLECTION(POLYGON((0 0),EMPTY,(2 2)), POLYGON((1 1)))',
    ]

    for src_wkt in src_wkt_list:
        if src_wkt is None:
            src_geom = None
        else:
            src_geom = ogr.CreateGeometryFromWkt(src_wkt)
        dst_geom1 = ogr.ForceToPolygon(src_geom)
        dst_geom2 = ogr.ForceToMultiPolygon(src_geom)
        dst_geom3 = ogr.ForceToMultiPoint(src_geom)
        dst_geom4 = ogr.ForceToMultiLineString(src_geom)
        dst_geom5 = ogr.ForceToLineString(src_geom)
        #print(src_geom.ExportToWkt(), dst_geom1.ExportToWkt(), dst_geom2.ExportToWkt(), dst_geom3.ExportToWkt(), dst_geom4.ExportToWkt())

    return 'success'
Example #9
0
    def read_from_file(self, filename):
        """Read and unpack vector data.

        It is assumed that the file contains only one layer with the
        pertinent features. Further it is assumed for the moment that
        all geometries are points.

        * A feature is a geometry and a set of attributes.
        * A geometry refers to location and can be point, line, polygon or
          combinations thereof.
        * The attributes or obtained through GetField()

        The full OGR architecture is documented at
        * http://www.gdal.org/ogr/ogr_arch.html
        * http://www.gdal.org/ogr/ogr_apitut.html

        Examples are at
        * danieljlewis.org/files/2010/09/basicpythonmap.pdf
        * http://invisibleroads.com/tutorials/gdal-shapefile-points-save.html
        * http://www.packtpub.com/article/geospatial-data-python-geometry

        Limitation of the Shapefile are documented in
        http://resources.esri.com/help/9.3/ArcGISDesktop/com/Gp_ToolRef/
        geoprocessing_tool_reference/
        geoprocessing_considerations_for_shapefile_output.htm

        :param filename: a fully qualified location to the file
        :type filename: str

        :raises: ReadLayerError
        """

        base_name = os.path.splitext(filename)[0]

        # Look for any keywords
        self.keywords = read_keywords(base_name + '.keywords')

        # FIXME (Ole): Should also look for style file to populate style_info

        # Determine name
        if 'title' in self.keywords:
            title = self.keywords['title']

            # Lookup internationalised title if available
            title = safe_tr(title)

            vector_name = title
        else:
            # Use base_name without leading directories as name
            vector_name = os.path.split(base_name)[-1]

        if self.name is None:
            self.name = vector_name
        self.filename = filename
        self.geometry_type = None  # In case there are no features

        fid = ogr.Open(filename)
        if fid is None:
            msg = 'Could not open %s' % filename
            raise ReadLayerError(msg)

        # Assume that file contains all data in one layer
        msg = 'Only one vector layer currently allowed'
        if fid.GetLayerCount() > 1 and self.sublayer is None:
            msg = ('WARNING: Number of layers in %s are %i. '
                   'Only the first layer will currently be '
                   'used. Specify sublayer when creating '
                   'the Vector if you wish to use a different layer.' %
                   (filename, fid.GetLayerCount()))
            LOGGER.warn(msg)
            # Why do we raise an exception if it is only a warning? TS
            raise ReadLayerError(msg)

        if self.sublayer is not None:
            layer = fid.GetLayerByName(self.sublayer)
        else:
            layer = fid.GetLayerByIndex(0)

        # Get spatial extent
        self.extent = layer.GetExtent()

        # Get projection
        p = layer.GetSpatialRef()
        self.projection = Projection(p)

        layer.ResetReading()

        # Extract coordinates and attributes for all features
        geometry = []
        data = []
        # Use feature iterator
        for feature in layer:
            # Record coordinates ordered as Longitude, Latitude
            G = feature.GetGeometryRef()
            if G is None:
                msg = ('Geometry was None in filename %s ' % filename)
                raise ReadLayerError(msg)
            else:
                self.geometry_type = G.GetGeometryType()
                if self.is_point_data:
                    geometry.append((G.GetX(), G.GetY()))
                elif self.is_line_data:
                    ring = get_ring_data(G)
                    geometry.append(ring)
                elif self.is_polygon_data:
                    polygon = get_polygon_data(G)
                    geometry.append(polygon)
                elif self.is_multi_polygon_data:
                    try:
                        G = ogr.ForceToPolygon(G)
                    except:
                        msg = ('Got geometry type Multipolygon (%s) for '
                               'filename %s and could not convert it to '
                               'singlepart. However, you can use QGIS '
                               'functionality to convert multipart vector '
                               'data to singlepart (Vector -> Geometry Tools '
                               '-> Multipart to Singleparts and use the '
                               'resulting dataset.' %
                               (ogr.wkbMultiPolygon, filename))
                        raise ReadLayerError(msg)
                    else:
                        # Read polygon data as single part
                        self.geometry_type = ogr.wkbPolygon
                        polygon = get_polygon_data(G)
                        geometry.append(polygon)
                else:
                    msg = ('Only point, line and polygon geometries are '
                           'supported. '
                           'Geometry type in filename %s '
                           'was %s.' % (filename, self.geometry_type))
                    raise ReadLayerError(msg)

            # Record attributes by name
            number_of_fields = feature.GetFieldCount()
            fields = {}
            for j in range(number_of_fields):
                name = feature.GetFieldDefnRef(j).GetName()

                # FIXME (Ole): Ascertain the type of each field?
                #              We need to cast each appropriately?
                #              This is issue #66
                #              (https://github.com/AIFDR/riab/issues/66)
                #feature_type = feature.GetFieldDefnRef(j).GetType()
                fields[name] = feature.GetField(j)

                # We do this because there is NaN problem on windows
                # NaN value must be converted to _pseudo_in to solve the
                # problem. But, when InaSAFE read the file, it'll be
                # converted back to NaN value, so that NaN in InaSAFE is a
                # numpy.nan
                # please check https://github.com/AIFDR/inasafe/issues/269
                # for more information
                if fields[name] == _pseudo_inf:
                    fields[name] = float('nan')
                #print 'Field', name, feature_type, j, fields[name]

            data.append(fields)
        # Store geometry coordinates as a compact numeric array
        self.geometry = geometry
        self.data = data
    def openGeoJson(self, check_field, filename):

        driver = ogr.GetDriverByName("GeoJSON")
        dataSource = driver.Open(filename, 0)
        layer = dataSource.GetLayer()

        wfs_result = dict()
        for feat in layer:

            #create geometry object
            geom = feat.GetGeometryRef()
            if geom is not None:
                sr = osr.SpatialReference()
                sr.ImportFromEPSG(3857)
                geom_type = geom.GetGeometryType()  #say to Dima

                if self.ForceToMultiGeom:
                    if geom_type == ogr.wkbLineString:
                        mercator_geom = ogr.ForceToLineString(geom)
                    elif geom_type == ogr.wkbPolygon:
                        mercator_geom = ogr.ForceToPolygon(geom)
                    elif geom_type == ogr.wkbPoint:
                        mercator_geom = ogr.ForceToMultiPoint(geom)
                    elif geom_type == ogr.wkbMultiPolygon:
                        mercator_geom = ogr.ForceToMultiPolygon(geom)
                    elif geom_type == ogr.wkbMultiPoint:
                        mercator_geom = ogr.ForceToMultiPoint(geom)
                    elif geom_type == ogr.wkbMultiLineString:
                        mercator_geom = ogr.ForceToMultiPolygon(geom)
                    else:
                        mercator_geom = geom
                else:
                    mercator_geom = geom
            else:
                continue

            #Read broker fields

            feat_defn = layer.GetLayerDefn()
            wfs_fields = dict()

            for i in range(feat_defn.GetFieldCount()):
                field_defn = feat_defn.GetFieldDefn(i)
                #if field_defn.GetName() == 'gml_id':
                #    continue

                #Compare by one control field

                if field_defn.GetName() == check_field:
                    check_field_val = feat.GetFieldAsString(i).decode(
                        'utf-8')  #GetFieldAsInteger64(i)

                #Read fields
                if field_defn.GetType(
                ) == ogr.OFTInteger:  #or field_defn.GetType() == ogr.OFTInteger64:
                    wfs_fields[field_defn.GetName()] = feat.GetFieldAsInteger(
                        i)  #GetFieldAsInteger64(i)
#                    print "%s = %d" % (field_defn.GetName(), feat.GetFieldAsInteger64(i))
                elif field_defn.GetType() == ogr.OFTReal:
                    wfs_fields[field_defn.GetName()] = feat.GetFieldAsDouble(i)


#                    print "%s = %.3f" % (field_defn.GetName(), feat.GetFieldAsDouble(i))
                elif field_defn.GetType() == ogr.OFTString:
                    #                    print "%s = %s" % (field_defn.GetName(), feat.GetFieldAsString(i))
                    wfs_fields[field_defn.GetName()] = feat.GetFieldAsString(
                        i).decode('utf-8')
                else:
                    #                    print "%s = %s" % (field_defn.GetName(), feat.GetFieldAsString(i))
                    wfs_fields[field_defn.GetName()] = feat.GetFieldAsString(
                        i).decode('utf-8')

            #Object with keys - as values of one control field
            wfs_result[check_field_val] = dict()
            wfs_result[check_field_val]['id'] = check_field_val
            wfs_result[check_field_val]['fields'] = wfs_fields
            wfs_result[check_field_val]['geom'] = mercator_geom.Clone()

        layer_result_sorted = dict()
        for key in sorted(wfs_result):
            layer_result_sorted[key] = wfs_result[key]

        return layer_result_sorted
    def kopieren(self, dsOut, lyrIn, name, zieltyp, codierung=''):

        try:
            #srs = osr.SpatialReference()
            #srs.ImportFromEPSG( 31254 )

            ly = None  # unser zukünftiges Layerobjekt
            # lyrIn (das Eingangsshape) hat bereits eine SRS (original oder vom kopierprogramm vorher zugewiesen)
            # im Modul verglRef überprüft un bei Bedarf neu zugewiesen!
            srs = lyrIn.GetSpatialRef()

            if not dsOut == None:
                driverName = dsOut.GetDriver().GetName()
            else:
                if zieltyp == 'file':
                    driverName = "ESRI Shapefile"
                elif zieltyp == 'sqlite':
                    drivername = "SQLite"
                elif zieltyp == 'postgres':
                    driverName == "PostgreSQL"
                else:
                    raise Exception

            #Das Ziel des Kopierprozesses
            #wird anhand des Treibernamens identifiziert: ACHTUNG: Ist der Workspace
            #leer, dann ist dsOut None (z.B. kein Shape im Verzeichnis)
            if driverName == "ESRI Shapefile":
                ly = dsOut.CopyLayer(lyrIn, name)  #das Kopieren, unabhängig
                if ly == None:  #vom OGR Treiber!

                    raise Exception

                #arcgis Attributindex Dateien
                #glob liefert eine liste mit Pfadnamen zurück
                # 1.PROBLEM: Sind quasi Doppelsuffix
                # 2.PROBLEM: Gross Kleinschreibung sollte einheitlich sein mit dem
                # anderen Kopierprozesse!!
                atxes = glob.glob(self.dsIn.GetName() + '/' + lyrIn.GetName() +
                                  ".*.atx")
                for atx in atxes:
                    if os.path.exists(atx):

                        #Wegen der gleichen Gross/Kleinschreibung wie in
                        # outputname angegeben!!!!!!!!
                        atx_suffix = os.path.splitext(atx)
                        atx_suffix = os.path.splitext(
                            atx_suffix[0])[1] + atx_suffix[1]

                        shutil.copyfile(
                            atx,
                            dsOut.GetName() + '/' + name + atx_suffix)

            elif driverName == "PostgreSQL" or driverName == "SQLite":

                #falls noch ein temp Layer existiert
                #(Beim Aktualisieren ist der name ja XXX_tmp_aktual!)
                if string.count(name, 'temp_aktual') > 0:
                    if dsOut.GetLayerByName(name) > 0:
                        dsOut.DeleteLayer(name)

                # Create a memory OGR datasource to put results in. Von frank W. Die Doku ist einfach schwach
                # Deshalb wirds hier zu Dokumentationszwecken dringelassen:
                # Der Memory Layer ist deutlich performanter bei CreateFeature als wenn es direkt auf eine
                # Spatial Lite DB angewandt wird
                mem_drv = ogr.GetDriverByName('Memory')
                mem_ds = mem_drv.CreateDataSource('out')

                ##                if lyrIn.GetGeomType() == 100 and driverName == "SQLite":   #Also keine Geometrie vorhanden

                ##                    if driverName == "PostgreSQL":
                ##                        ly = dsOut.CopyLayer(lyrIn,name, ['SPATIAL_INDEX=no','PRECISION=no','GEOMETRY_NAME=the_geom', 'LAUNDER=no'])
                ##                    elif driverName == "SQLite":
                ##                        ly = dsOut.CopyLayer(lyrIn,name, ['GEOMETRY_NAME=the_geom', 'LAUNDER=no'])

                if driverName == "SQLite":

                    if lyrIn.GetGeomType(
                    ) == 100:  # also KEINE Geometrie Tabelle
                        ly = dsOut.CopyLayer(
                            lyrIn, name,
                            ['GEOMETRY_NAME=the_geom', 'LAUNDER=no'])
                    else:
                        memme = mem_ds.CreateLayer(name, srs,
                                                   lyrIn.GetGeomType())

                        i = 0
                        feldanzahl = lyrIn.GetLayerDefn().GetFieldCount()
                        while i < feldanzahl:
                            Fdefn = lyrIn.GetLayerDefn().GetFieldDefn(i)
                            memme.CreateField(Fdefn)
                            i = i + 1

                        # Unbedingt die Geometrie vereinheitlichen, im Shape ist das anscheinend
                        # nicht immer sauber und würde sonst nicht in die DB übernommen werden!!!
                        # Mehr Unterscheidungen (der Geometrie) gibt es derzeit noch nicht, also Single point oder line
                        for fea in lyrIn:

                            # None kann vom Shape weg vorkommen, deshalb die Prüfung
                            # Gibts ein Feature ohne Geometrie (das kann beim Shape vorkommen), wirds
                            # ignoriert.
                            if not fea.GetGeometryRef() == None:
                                gemi = fea.GetGeometryRef().Clone()
                            else:
                                next

                            if lyrIn.GetGeomType() == ogr.wkbMultiPoint:
                                gemi = ogr.ForceToMultiPoint(gemi)
                            elif lyrIn.GetGeomType() == ogr.wkbMultiLineString:
                                gemi = ogr.ForceToMultiLineString(gemi)
                            elif lyrIn.GetGeomType() == ogr.wkbMultiPolygon:
                                gemi = ogr.ForceToMultiPolygon(gemi)
                            elif lyrIn.GetGeomType() == ogr.wkbPolygon:
                                gemi = ogr.ForceToPolygon(gemi)
                            else:
                                gemi = gemi.Clone()

                            fea.SetGeometry(gemi)
                            memme.CreateFeature(fea)
                        if memme == None:
                            raise Exception

                        dsOut.CopyLayer(memme, name, [
                            'SPATIAL_INDEX=no', 'GEOM_TYPE=geometry',
                            'GEOMETRY_NAME=the_geom', 'LAUNDER=no'
                        ])

                # Einen leeren Layer in der Postgis erzeugen
                # ACHTUNG: Beim Shape wird zwischen Linestring und Multilinestring etc.
                # nicht unterschieden, es können also in einem Shape beide Arten vorkommen!
                # Es muss deshalb per Default immer die Multi- Version erzeugt werden!
                elif driverName == "PostgreSQL":

                    if lyrIn.GetGeomType() == 100:  # Keine Geometrie
                        ly = mem_ds.CreateLayer(name, None, ogr.wkbNone)

                        i = 0

                        feldanzahl = lyrIn.GetLayerDefn().GetFieldCount()
                        while i < feldanzahl:
                            Fdefn = lyrIn.GetLayerDefn().GetFieldDefn(i)
                            Fdefn.SetName(string.lower(Fdefn.GetName()))
                            ly.CreateField(Fdefn)
                            i = i + 1

                        # Der gesmate Layer muss neu geschrieben werden
                        # damit Probleme beim Laden in die Datenbank
                        # möglichst ausgeschlossen werden
                        for fea in lyrIn:

                            fea_tmp = ogr.Feature(fea.GetDefnRef())

                            # sachinformation einfügen

                            i = 0
                            while i < feldanzahl:
                                if not fea.GetField(i) == None:

                                    if fea.GetFieldDefnRef(
                                            i).GetType() == 4:  # Textfeld
                                        if codierung == 'nein' or '':
                                            fea_tmp.SetField(
                                                i, fea.GetFieldAsString(i))
                                        else:  # bei Bedarf umcodieren
                                            kasperle = fea.GetFieldAsString(
                                                i).decode(
                                                    codierung,
                                                    'replace').encode(
                                                        'utf8', 'replace')
                                            fea_tmp.SetField(i, kasperle)
                                    else:  # numerisches Feld
                                        fea_tmp.SetField(i, fea.GetField(i))
                                i = i + 1

                            # ein neues (konvertiertes) Feature im Memory Layer erzeugen
                            fea_tmp.SetFID(-1)
                            ly.CreateFeature(fea_tmp)

                    #########################################
                    # Alle Formen von Punktgeometrien
                    #########################################

                    #Point oder Multipoint
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPoint or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPoint:

                        ly = mem_ds.CreateLayer(name, srs, ogr.wkbMultiPoint)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPoint, 'point', lyrIn,
                                codierung, ly):
                            ly = None

                    #Point oder Multipoint mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPointM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPointM:

                        ly = mem_ds.CreateLayer(name, srs, ogr.wkbMultiPointM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPointM, 'point', lyrIn,
                                codierung, ly):
                            ly = None

                    #Point oder Multipoint 3D mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPointZM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPointZM:

                        ly = mem_ds.CreateLayer(name, srs, ogr.wkbMultiPointZM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPointZM, 'point', lyrIn,
                                codierung, ly):
                            ly = None

                    #Point oder Multipoint 3D
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPoint25D or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPoint25D:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiPoint25D)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPoint25D, 'point',
                                lyrIn, codierung, ly):
                            ly = None

                    #########################################
                    # Alle Formen von Liniengeometrien
                    #########################################

                    # Line oder Multiline
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbLineString or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiLineString:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiLineString)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiLineString, 'line',
                                lyrIn, codierung, ly):
                            ly = None

                    # Line oder Multiline mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbLineStringM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiLineStringM:
                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiLineStringM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiLineStringM, 'line',
                                lyrIn, codierung, ly):
                            ly = None

                    # Line oder Multiline 3D mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbLineStringZM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiLineStringZM:
                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiLineStringZM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiLineStringZM, 'line',
                                lyrIn, codierung, ly):
                            ly = None

                    # Linien mit 3D
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbMultiLineString25D or lyrIn.GetGeomType(
                    ) == ogr.wkbLineString25D:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiLineString25D)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiLineString25D, 'line',
                                lyrIn, codierung, ly):
                            ly = None

                    #########################################
                    # Alle Formen von Polygongeometrien
                    #########################################

                    #Polygon oder Multipolygon
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPolygon or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPolygon:

                        ly = mem_ds.CreateLayer(name, srs, ogr.wkbMultiPolygon)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPolygon, 'polygon',
                                lyrIn, codierung, ly):
                            ly = None

                    #Polygon oder Multipolygon mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPolygonM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPolygonM:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiPolygonM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPolygonM, 'polygon',
                                lyrIn, codierung, ly):
                            ly = None

                    #Polygon oder Multipolygon 3D mit M
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbPolygonZM or lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPolygonZM:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiPolygonZM)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPolygonZM, 'polygon',
                                lyrIn, codierung, ly):
                            ly = None

                    # Polygone mit 3D
                    elif lyrIn.GetGeomType(
                    ) == ogr.wkbMultiPolygon25D or lyrIn.GetGeomType(
                    ) == ogr.wkbPolygon25D:

                        ly = mem_ds.CreateLayer(name, srs,
                                                ogr.wkbMultiPolygon25D)
                        # ACHTUNG: return hat mit dem im sub erzeugten Layer Objekt nicht funktioniert (crash)
                        # dh wird das Lyerobjekt ly bereits vorher erzeugt und im Sub (Pointer!) verändert.
                        # zurückgegeben wird nur das fehlerstatement
                        if not self.__create_and_populate_layer(
                                name, srs, ogr.wkbMultiPolygon25D, 'polygon',
                                lyrIn, codierung, ly):
                            ly = None

                    # alles andere
                    else:
                        dsOut.CopyLayer(lyrIn, name, [
                            'SPATIAL_INDEX=no', 'PRECISION=NO',
                            'GEOM_TYPE=geometry', 'GEOMETRY_NAME=the_geom',
                            'LAUNDER=yes'
                        ])

                    # Fertig: der Memorylayer mit dem gesäuberten Inhalt des Shapes kann in die Datenbank kopiert werden
                    if not ly == None:
                        dsOut.CopyLayer(ly, name, [
                            'SPATIAL_INDEX=no', 'PRECISION=NO',
                            'GEOM_TYPE=geometry', 'GEOMETRY_NAME=the_geom',
                            'LAUNDER=yes'
                        ])
                    else:
                        return [
                            False,
                            'Geometrietyp nicht unterstuetzt oder Layer Nachbesserung fehlgeschlagen'
                        ]

            return [True]

        # Wir geben die Exception auch mit zurück - damit die fehlermeldung informativer ist!
        except Exception as e:
            print str(e)
            return [False, e]
Example #12
0
def clip_gpkg(input, clip):
    start = time.time()

    driver = ogr.GetDriverByName("GPKG")
    inDataSource = driver.Open(input, 0)
    inLayer = inDataSource.GetLayerByName("一张图")

    print(inLayer.GetFeatureCount())

    ## Clip
    inClipSource = driver.Open(clip, 0)
    inClipLayer = inClipSource.GetLayerByName("建设用地")

    outdriver = ogr.GetDriverByName('FileGDB')
    output_path = "res/res.gdb"
    if os.path.exists(output_path):
        outDataSource = outdriver.Open(output_path, 1)
        logging.info("文件数据库已存在,在已有数据库基础上创建图层.")
    else:
        outDataSource = outdriver.CreateDataSource(output_path)

    outLayer = outDataSource.CreateLayer("clip", geom_type=ogr.wkbPolygon)

    # pUnionGeo = loadGeometry(inClipLayer)

    i = 0
    pFeat = inLayer.GetNextFeature()
    while pFeat is not None:
        pGeom = pFeat.GetGeometryRef()

        # inClipLayer.ResetReading()
        inClipLayer.SetSpatialFilter(pGeom)
        # pClipGeo = pGeom.Intersection(poClipGeo)
        multi = ogr.Geometry(ogr.wkbMultiPolygon)
        for feature in inClipLayer:
            # pGeo = feature.GetGeometryRef()
            # pResGeo = pUnionGeo.Intersection(pGeo)
            # if pResGeo is not None:
            #     print("{}:{}".format(i, pResGeo.GetGeometryCount()))
            # else:
            #     print(i)
            pGeo = feature.GetGeometryRef()
            if pGeo.GetGeometryType() == ogr.wkbMultiPolygon:
                multi.AddGeometry(ogr.ForceToPolygon(pGeo))
            else:
                multi.AddGeometry(pGeo)

        pGeo = multi.UnionCascaded()
        if pGeo is not None:
            pResGeo = pGeom.Intersection(pGeo)
            if pResGeo is not None:
                print("{}:{}".format(i, pResGeo.GetGeometryCount()))
            else:
                print(i)

        pFeat = inLayer.GetNextFeature()
        i += 1

    inDataSource.Destroy()
    inClipSource.Destroy()

    end = time.time()
    print("clip操作总共耗时 " + str(end - start) + "\n")