Exemple #1
0
def feat_to_pnt(inShp, outPnt, epsg=None):
    """
    Get Centroid from each line in a PolyLine Feature Class
    """

    import os
    from osgeo import ogr
    from gasp.prop.ff import drv_name
    from gasp.mng.fld import ogr_copy_fields
    from gasp.mng.fld import lst_fld

    # TODO: check if geometry is correct

    # Open data
    polyData = ogr.GetDriverByName(drv_name(outPnt)).Open(inShp)

    polyLyr = polyData.GetLayer()

    # Get SRS for the output
    if not epsg:
        from gasp.prop.prj import get_shp_sref
        srs = get_shp_sref(polyLyr)

    else:
        from gasp.prop.prj import get_sref_from_epsg
        srs = get_sref_from_epsg(epsg)

    # Create output
    pntData = ogr.GetDriverByName(drv_name(outPnt)).CreateDataSource(outPnt)

    pntLyr = pntData.CreateLayer(os.path.splitext(os.path.basename(outPnt))[0],
                                 srs,
                                 geom_type=ogr.wkbPoint)

    # Copy fields from input to output
    fields = lst_fld(polyLyr)
    ogr_copy_fields(polyLyr, pntLyr)

    pntLyrDefn = pntLyr.GetLayerDefn()
    for feat in polyLyr:
        geom = feat.GetGeometryRef()

        pnt = geom.Centroid()

        new_feat = ogr.Feature(pntLyrDefn)
        new_feat.SetGeometry(pnt)

        for fld in fields:
            new_feat.SetField(fld, feat.GetField(fld))

        pntLyr.CreateFeature(new_feat)

        new_feat.Destroy()

    del pntLyr
    del polyLyr
    pntData.Destroy()
    polyData.Destroy()

    return outPnt
Exemple #2
0
def split_whr_attrIsTrue(osm_fc,
                         outputfolder,
                         fields=None,
                         sel_fields=None,
                         basename=None):
    """
    For each field in osm table or in fields, creates a new feature class 
    where the field attribute is not empty
    """

    import os
    from gasp.mng.fld import lst_fld
    from gasp.anls.exct import sel_by_attr

    # List table fields
    tbl_fields = fields if fields else lst_fld(osm_fc)

    if type(tbl_fields) == str or type(tbl_fields) == unicode:
        tbl_fields = [tbl_fields]

    if sel_fields:
        sel_fields.append('geometry')
        aux = 1

    else:
        aux = 0

    # Export each field in data
    outFilename = '{}.shp' if not basename else basename + '_{}.shp'
    for fld in tbl_fields:
        a = 0
        if not aux:
            sel_fields = ['geometry', fld]
        else:
            if fld not in sel_fields:
                sel_fields.append(fld)
                a += 1

        sel_by_attr(
            osm_fc,
            "SELECT {flds} FROM {t} WHERE {f}<>''".format(
                f=fld,
                t=os.path.splitext(os.path.basename(osm_fc))[0],
                flds=', '.join(sel_fields)),
            os.path.join(
                outputfolder,
                outFilename.format(fld if fld.islower() else fld.lower())),
            api_gis='ogr')

        if a:
            sel_fields.remove(fld)
Exemple #3
0
def splitShp_by_range(shp, nrFeat, outFolder):
    """
    Split one feature class by range
    """

    import os
    from gasp.oss import get_filename, get_fileformat
    from gasp.prop.feat import feat_count
    from gasp.mng.fld import lst_fld
    from gasp.anls.exct import sel_by_attr

    rowsN = feat_count(shp, gisApi='ogr')

    nrShp = int(rowsN / float(nrFeat)) + 1 if nrFeat != rowsN else 1

    fields = lst_fld(shp)

    offset = 0
    exportedShp = []
    for i in range(nrShp):
        outShp = sel_by_attr(
            shp,
            "SELECT {cols}, geometry FROM {t} ORDER BY {cols} LIMIT {l} OFFSET {o}"
            .format(t=os.path.splitext(os.path.basename(shp))[0],
                    l=str(nrFeat),
                    o=str(offset),
                    cols=", ".join(fields)),
            os.path.join(
                outFolder, "{}_{}{}".format(get_filename(shp, forceLower=True),
                                            str(i), get_fileformat(shp))),
            api_gis='ogr')

        exportedShp.append(outShp)
        offset += nrFeat

    return exportedShp
Exemple #4
0
def eachfeat_to_newshp(inShp, outFolder, epsg=None):
    """
    Export each feature in inShp to a new/single File
    """

    import os
    from osgeo import ogr
    from gasp.prop.ff import drv_name
    from gasp.prop.feat import get_geom_type
    from gasp.mng.fld import lst_fld
    from gasp.mng.fld import ogr_copy_fields
    from gasp.oss import get_fileformat, get_filename

    inDt = ogr.GetDriverByName(drv_name(inShp)).Open(inShp)

    lyr = inDt.GetLayer()

    # Get SRS for the output
    if not epsg:
        from gasp.prop.prj import get_shp_sref
        srs = get_shp_sref(lyr)

    else:
        from gasp.prop.prj import get_sref_from_epsg
        srs = get_sref_from_epsg(epsg)

    # Get fields name
    fields = lst_fld(lyr)

    # Get Geometry type
    geomCls = get_geom_type(inShp, gisApi='ogr', name=None, py_cls=True)

    # Read features and create a new file for each feature
    RESULT_SHP = []
    for feat in lyr:
        # Create output
        newShp = os.path.join(
            outFolder, "{}_{}{}".format(get_filename(inShp),
                                        str(feat.GetFID()),
                                        get_fileformat(inShp)))

        newData = ogr.GetDriverByName(
            drv_name(newShp)).CreateDataSource(newShp)

        newLyr = newData.CreateLayer(str(get_filename(newShp)),
                                     srs,
                                     geom_type=geomCls)

        # Copy fields from input to output
        ogr_copy_fields(lyr, newLyr)

        newLyrDefn = newLyr.GetLayerDefn()

        # Create new feature
        newFeat = ogr.Feature(newLyrDefn)

        # Copy geometry
        geom = feat.GetGeometryRef()
        newFeat.SetGeometry(geom)

        # Set fields attributes
        for fld in fields:
            newFeat.SetField(fld, feat.GetField(fld))

        # Save feature
        newLyr.CreateFeature(newFeat)

        newFeat.Destroy()

        del newLyr
        newData.Destroy()
        RESULT_SHP.append(newShp)

    return RESULT_SHP