Esempio n. 1
0
def ogr_geom_build_from_edges_3():

    if gdaltest.have_geos == 0:
        return 'skip'

    src_geom = ogr.CreateGeometryFromWkt('POINT (0 1)')
    try:
        gdal.PushErrorHandler('CPLQuietErrorHandler')
        poly = ogr.BuildPolygonFromEdges(src_geom)
        gdal.PopErrorHandler()
        if poly is not None:
            return 'fail'
    except:
        pass

    src_geom = ogr.CreateGeometryFromWkt(
        'GEOMETRYCOLLECTION (LINESTRING(0 1,2 3),POINT(0 1),LINESTRING(0 1,-2 3),LINESTRING(-2 3,2 3))'
    )
    try:
        gdal.PushErrorHandler('CPLQuietErrorHandler')
        poly = ogr.BuildPolygonFromEdges(src_geom)
        gdal.PopErrorHandler()
        if poly is not None:
            return 'fail'
    except:
        pass

    return 'success'
Esempio n. 2
0
def ogr_geom_build_from_edges_2():

    if gdaltest.have_geos == 0:
        return 'skip'

    link_coll = ogr.Geometry(type=ogr.wkbMultiLineString)

    wkt_array = [
        'LINESTRING (-87.601595 30.999522,-87.599623 31.000059,-87.599219 31.00017)',
        'LINESTRING (-87.601595 30.999522,-87.604349 30.999493,-87.606935 30.99952)',
        'LINESTRING (-87.59966 31.000756,-87.599851 31.000805,-87.599992 31.000805,-87.600215 31.000761,-87.600279 31.000723,-87.600586 31.000624,-87.601256 31.000508,-87.602501 31.000447,-87.602801 31.000469,-87.603108 31.000579,-87.603331 31.000716,-87.603523 31.000909,-87.603766 31.001233,-87.603913 31.00136)',
        'LINESTRING (-87.606134 31.000182,-87.605885 31.000325,-87.605343 31.000716,-87.60466 31.001117,-87.604468 31.0012,-87.603913 31.00136)',
        'LINESTRING (-87.599219 31.00017,-87.599289 31.0003,-87.599398 31.000426,-87.599564 31.000547,-87.599609 31.000701,-87.59966 31.000756)',
        'LINESTRING (-87.606935 30.99952,-87.606713 30.999799,-87.6064 30.999981,-87.606134 31.000182)'
    ]

    for wkt in wkt_array:
        geom = ogr.CreateGeometryFromWkt(wkt)
        #print "geom is",geom
        link_coll.AddGeometry(geom)
        geom.Destroy()

    try:
        poly = ogr.BuildPolygonFromEdges(link_coll)
        if poly is None:
            return 'fail'
        poly.Destroy()
    except:
        return 'fail'

    return 'success'
Esempio n. 3
0
def ogr_geom_build_from_edges_4():

    if int(gdal.VersionInfo('VERSION_NUM')) < 1900:
        gdaltest.post_reason('would crash')
        return 'skip'

    if gdaltest.have_geos == 0:
        return 'skip'

    link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection)

    wkt_array = [
        'LINESTRING EMPTY', 'LINESTRING (1 1,1 2)', 'LINESTRING EMPTY',
        'LINESTRING (1 2,2 2)', 'LINESTRING (2 2,2 1)', 'LINESTRING (2 1,1 1)',
        'LINESTRING (0 0,0 10)', 'LINESTRING (0 10,10 10)',
        'LINESTRING (10 10,10 0)', 'LINESTRING (10 0,0 0)'
    ]

    for wkt in wkt_array:
        geom = ogr.CreateGeometryFromWkt(wkt)
        #print "geom is",geom
        link_coll.AddGeometry(geom)
        geom.Destroy()

    try:
        poly = ogr.BuildPolygonFromEdges(link_coll)
        if poly is None:
            return 'fail'
        wkt = poly.ExportToWkt()
        if wkt != 'POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1))':
            print(wkt)
            return 'fail'
        poly.Destroy()
    except:
        return 'fail'

    return 'success'
Esempio n. 4
0
        polyid = dest_polyid_hash[orig_polyid].polyid
    except:
        polyid = 0

    # we must only do those polygons that have not been mapped to others, or
    # we'll be doing them multiple times
    if polyid != 0 and polyid == orig_polyid:
        tlid_list = module.poly_line_links[polyid]

        link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection)
        for tlid in tlid_list:
            geom = module.lines[tlid]
            link_coll.AddGeometry(geom)

        try:
            poly = ogr.BuildPolygonFromEdges(link_coll)

            #print poly.ExportToWkt()
            #feat.SetGeometryDirectly( poly )

            feat2 = ogr.Feature(feature_def=shp_layer.GetLayerDefn())

            for fld_index in range(len(field_names)):
                theFieldName = field_names[fld_index]
                layerName = fields_hash[theFieldName].layerName
                theFieldIdx = fields_hash[theFieldName].fld_index
                #             print 'fetching field %s from layer %s' % (theFieldName, layerName)
                # if it's from Polygon just pop it in because we have it now:
                if layerName == 'Polygon':
                    feat2.SetField(fld_index, feat.GetField(theFieldIdx))
                # If it's from PIP, we definitely have one
Esempio n. 5
0
def tiger_to_tract(infile):
    class Module:
        def __init__(self):
            self.lines = {}
            self.poly_line_links = {}

    outfile = 'poly.shp'

    # Open the datasource to operate on.

    ds = ogr.Open(infile, update=0)
    poly_layer = ds.GetLayerByName('Polygon')

    # Create output file for the composed polygons.

    nad83 = osr.SpatialReference()
    nad83.SetFromUserInput('NAD83')

    shp_driver = ogr.GetDriverByName('ESRI Shapefile')
    shp_driver.DeleteDataSource(outfile)

    shp_ds = shp_driver.CreateDataSource(outfile)

    shp_layer = shp_ds.CreateLayer('out', geom_type=ogr.wkbPolygon, srs=nad83)

    src_defn = poly_layer.GetLayerDefn()
    poly_field_count = src_defn.GetFieldCount()

    for fld_index in range(poly_field_count):
        src_fd = src_defn.GetFieldDefn(fld_index)

        fd = ogr.FieldDefn(src_fd.GetName(), src_fd.GetType())
        fd.SetWidth(src_fd.GetWidth())
        fd.SetPrecision(src_fd.GetPrecision())
        shp_layer.CreateField(fd)

    # Read all features in the line layer, holding just the geometry in a hash
    # for fast lookup by TLID.

    line_layer = ds.GetLayerByName('CompleteChain')
    line_count = 0

    modules_hash = {}

    feat = line_layer.GetNextFeature()
    geom_id_field = feat.GetFieldIndex('TLID')
    tile_ref_field = feat.GetFieldIndex('MODULE')
    while feat is not None:
        geom_id = feat.GetField(geom_id_field)
        tile_ref = feat.GetField(tile_ref_field)

        try:
            module = modules_hash[tile_ref]
        except:
            module = Module()
            modules_hash[tile_ref] = module

        module.lines[geom_id] = feat.GetGeometryRef().Clone()
        line_count = line_count + 1

        feat.Destroy()

        feat = line_layer.GetNextFeature()

    # Read all polygon/chain links and build a hash keyed by POLY_ID listing
    # the chains (by TLID) attached to it.

    link_layer = ds.GetLayerByName('PolyChainLink')

    feat = link_layer.GetNextFeature()
    geom_id_field = feat.GetFieldIndex('TLID')
    tile_ref_field = feat.GetFieldIndex('MODULE')
    lpoly_field = feat.GetFieldIndex('POLYIDL')
    rpoly_field = feat.GetFieldIndex('POLYIDR')

    link_count = 0

    while feat is not None:
        module = modules_hash[feat.GetField(tile_ref_field)]

        tlid = feat.GetField(geom_id_field)

        lpoly_id = feat.GetField(lpoly_field)
        rpoly_id = feat.GetField(rpoly_field)

        if lpoly_id == rpoly_id:
            feat.Destroy()
            feat = link_layer.GetNextFeature()
            continue

        try:
            module.poly_line_links[lpoly_id].append(tlid)
        except:
            module.poly_line_links[lpoly_id] = [tlid]

        try:
            module.poly_line_links[rpoly_id].append(tlid)
        except:
            module.poly_line_links[rpoly_id] = [tlid]

        link_count = link_count + 1

        feat.Destroy()

        feat = link_layer.GetNextFeature()

    # Process all polygon features.

    feat = poly_layer.GetNextFeature()
    tile_ref_field = feat.GetFieldIndex('MODULE')
    polyid_field = feat.GetFieldIndex('POLYID')

    poly_count = 0
    degenerate_count = 0

    while feat is not None:
        module = modules_hash[feat.GetField(tile_ref_field)]
        polyid = feat.GetField(polyid_field)

        tlid_list = module.poly_line_links[polyid]

        link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection)
        for tlid in tlid_list:
            geom = module.lines[tlid]
            link_coll.AddGeometry(geom)

        try:
            poly = ogr.BuildPolygonFromEdges(link_coll)

            if poly.GetGeometryRef(0).GetPointCount() < 4:
                degenerate_count = degenerate_count + 1
                poly.Destroy()
                feat.Destroy()
                feat = poly_layer.GetNextFeature()
                continue

            # print poly.ExportToWkt()
            # feat.SetGeometryDirectly( poly )

            feat2 = ogr.Feature(feature_def=shp_layer.GetLayerDefn())

            for fld_index in range(poly_field_count):
                feat2.SetField(fld_index, feat.GetField(fld_index))

            feat2.SetGeometryDirectly(poly)

            shp_layer.CreateFeature(feat2)
            feat2.Destroy()

            poly_count = poly_count + 1
        except:
            warn('BuildPolygonFromEdges failed.')

        feat.Destroy()

        feat = poly_layer.GetNextFeature()

    if degenerate_count:
        warn('Discarded %d degenerate polygons.' % degenerate_count)

    print('Built %d polygons.' % poly_count)

    # Cleanup

    shp_ds.Destroy()
    ds.Destroy()

    # build a fully-qualified fips code and dissolve on it to create tract geographies
    gdf = gpd.read_file(outfile)

    if "CTBNA90" in gdf.columns:

        gdf = gdf.rename(columns={"CTBNA90": 'TRACT'})

    gdf['STATE'] = gdf['STATE'].astype(str).str.rjust(2, "0")

    gdf['COUNTY'] = gdf['COUNTY'].astype(str).str.rjust(3, "0")

    gdf['TRACT'] = gdf['TRACT'].astype(str).str.rjust(4, "0")

    gdf['fips'] = gdf.STATE + gdf.COUNTY + gdf.TRACT + '00'

    gdf.to_file(outfile)

    gdf = gdf.dropna(subset=['fips'])
    gdf = gdf.dissolve(by='fips')

    gdf.reset_index(inplace=True)

    gdf.to_file(outfile)

    return gdf
Esempio n. 6
0
def tiger_to_tract(infile):
    class Module:
        def __init__(self):
            self.lines = {}
            self.poly_line_links = {}
#############################################################################
# Argument processing.

    outfile = 'poly.shp'

    #############################################################################
    # Open the datasource to operate on.

    ds = ogr.Open(infile, update=0)

    poly_layer = ds.GetLayerByName('Polygon')

    #############################################################################
    #	Create output file for the composed polygons.

    nad83 = osr.SpatialReference()
    nad83.SetFromUserInput('NAD83')

    shp_driver = ogr.GetDriverByName('ESRI Shapefile')
    shp_driver.DeleteDataSource(outfile)

    shp_ds = shp_driver.CreateDataSource(outfile)

    shp_layer = shp_ds.CreateLayer('out', geom_type=ogr.wkbPolygon, srs=nad83)

    src_defn = poly_layer.GetLayerDefn()
    poly_field_count = src_defn.GetFieldCount()

    for fld_index in range(poly_field_count):
        src_fd = src_defn.GetFieldDefn(fld_index)

        fd = ogr.FieldDefn(src_fd.GetName(), src_fd.GetType())
        fd.SetWidth(src_fd.GetWidth())
        fd.SetPrecision(src_fd.GetPrecision())
        shp_layer.CreateField(fd)

    #############################################################################
    # Read all features in the line layer, holding just the geometry in a hash
    # for fast lookup by TLID.

    line_layer = ds.GetLayerByName('CompleteChain')
    line_count = 0

    modules_hash = {}

    feat = line_layer.GetNextFeature()
    geom_id_field = feat.GetFieldIndex('TLID')
    tile_ref_field = feat.GetFieldIndex('MODULE')
    while feat is not None:
        geom_id = feat.GetField(geom_id_field)
        tile_ref = feat.GetField(tile_ref_field)

        try:
            module = modules_hash[tile_ref]
        except:
            module = Module()
            modules_hash[tile_ref] = module

        module.lines[geom_id] = feat.GetGeometryRef().Clone()
        line_count = line_count + 1

        feat.Destroy()

        feat = line_layer.GetNextFeature()

    print('Got %d lines in %d modules.' % (line_count, len(modules_hash)))

    #############################################################################
    # Read all polygon/chain links and build a hash keyed by POLY_ID listing
    # the chains (by TLID) attached to it.

    link_layer = ds.GetLayerByName('PolyChainLink')

    feat = link_layer.GetNextFeature()
    geom_id_field = feat.GetFieldIndex('TLID')
    tile_ref_field = feat.GetFieldIndex('MODULE')
    lpoly_field = feat.GetFieldIndex('POLYIDL')
    rpoly_field = feat.GetFieldIndex('POLYIDR')

    link_count = 0

    while feat is not None:
        module = modules_hash[feat.GetField(tile_ref_field)]

        tlid = feat.GetField(geom_id_field)

        lpoly_id = feat.GetField(lpoly_field)
        rpoly_id = feat.GetField(rpoly_field)

        if lpoly_id == rpoly_id:
            feat.Destroy()
            feat = link_layer.GetNextFeature()
            continue

        try:
            module.poly_line_links[lpoly_id].append(tlid)
        except:
            module.poly_line_links[lpoly_id] = [tlid]

        try:
            module.poly_line_links[rpoly_id].append(tlid)
        except:
            module.poly_line_links[rpoly_id] = [tlid]

        link_count = link_count + 1

        feat.Destroy()

        feat = link_layer.GetNextFeature()

    print('Processed %d links.' % link_count)

    #############################################################################
    # Process all polygon features.

    feat = poly_layer.GetNextFeature()
    tile_ref_field = feat.GetFieldIndex('MODULE')
    polyid_field = feat.GetFieldIndex('POLYID')

    poly_count = 0
    degenerate_count = 0

    while feat is not None:
        module = modules_hash[feat.GetField(tile_ref_field)]
        polyid = feat.GetField(polyid_field)

        tlid_list = module.poly_line_links[polyid]

        link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection)
        for tlid in tlid_list:
            geom = module.lines[tlid]
            link_coll.AddGeometry(geom)

        try:
            poly = ogr.BuildPolygonFromEdges(link_coll)

            if poly.GetGeometryRef(0).GetPointCount() < 4:
                degenerate_count = degenerate_count + 1
                poly.Destroy()
                feat.Destroy()
                feat = poly_layer.GetNextFeature()
                continue

            #print poly.ExportToWkt()
            #feat.SetGeometryDirectly( poly )

            feat2 = ogr.Feature(feature_def=shp_layer.GetLayerDefn())

            for fld_index in range(poly_field_count):
                feat2.SetField(fld_index, feat.GetField(fld_index))

            feat2.SetGeometryDirectly(poly)

            shp_layer.CreateFeature(feat2)
            feat2.Destroy()

            poly_count = poly_count + 1
        except:
            print('BuildPolygonFromEdges failed.')

        feat.Destroy()

        feat = poly_layer.GetNextFeature()

    if degenerate_count:
        print('Discarded %d degenerate polygons.' % degenerate_count)

    print('Built %d polygons.' % poly_count)

    #############################################################################
    # Cleanup

    shp_ds.Destroy()
    ds.Destroy()
Esempio n. 7
0
poly_count = 0
degenerate_count = 0

while feat is not None:
    module = modules_hash[feat.GetField(tile_ref_field)]
    polyid = feat.GetField(polyid_field)
    cenid = feat.GetField(cenid_field)

    link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection)
    tlid_list = module.poly_line_links[cenid, polyid]
    for tlid in tlid_list:
        geom = module.lines[tlid]
        link_coll.AddGeometry(geom)

    try:
        poly = ogr.BuildPolygonFromEdges(link_coll, 0, 0)

        if poly.GetGeometryRef(0).GetPointCount() < 4:
            degenerate_count = degenerate_count + 1
            poly.Destroy()
            feat.Destroy()
            feat = poly_layer.GetNextFeature()
            continue

        #print poly.ExportToWkt()
        #feat.SetGeometryDirectly( poly )

        feat2 = ogr.Feature(feature_def=poly_out.GetLayerDefn())

        for fld_index in range(poly_out.GetLayerDefn().GetFieldCount()):
            feat2.SetField(fld_index, feat.GetField(fld_index))