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
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)
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
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