Skip to content

Instantly share code, notes, and snippets.

@stdavis
Created July 11, 2017 23:28
Show Gist options
  • Select an option

  • Save stdavis/54fc408c1ce43093e5b7a073b178bfe6 to your computer and use it in GitHub Desktop.

Select an option

Save stdavis/54fc408c1ce43093e5b7a073b178bfe6 to your computer and use it in GitHub Desktop.
Broadband Single Providers
import arcpy
from os.path import join
base_folder = r'\\Mac\Documents\Projects\working\SingleProviderBroadbandAreas'
fiber = join(base_folder, 'fiber.gdb')
broadband = join(base_folder, 'broadband.gdb')
output = join(base_folder, 'output.gdb')
fiber_providers = join(fiber, 'Providers')
bb_providers = join(broadband, 'BB_Providers_Table')
hexagons = join(fiber, 'Hexagons_project')
bb_service = join(broadband, 'BB_Service')
all_providers = join(output, 'AllProviders')
single_providers = join(output, 'SingleProviders')
fldCode = 'Code'
fldHexID = 'HexID'
fldProvName = 'ProvName'
fldUTProvCode = 'UTProvCode'
fldNAME = 'NAME'
ProviderServiceAreas = 'ProviderServiceAreas'
def generate_master_dataset():
print('generating master dataset of all providers...')
arcpy.management.TruncateTable(all_providers)
providers_list = set()
for table in [fiber_providers, bb_providers]:
with arcpy.da.SearchCursor(table, [fldCode]) as cursor:
for provider_code, in cursor:
providers_list.add(provider_code)
print('found {} unique providers'.format(len(providers_list)))
providers_data = {}
for provider_code in sorted(providers_list):
print(provider_code)
hex_query = '{0} IN (SELECT {0} FROM ProviderServiceAreas WHERE {1} = \'{2}\' AND ServiceClass = 1)'.format(fldHexID, fldProvName, provider_code)
res_query = '{} = \'{}\' AND MAXADDOWN >= 25 AND TransTech <> 80'.format(fldUTProvCode, provider_code)
for service_layer, query in [(hexagons, hex_query), (bb_service, res_query)]:
layer = arcpy.management.MakeFeatureLayer(service_layer, 'service_layer', query)
dissolved = arcpy.management.Dissolve(layer, 'in_memory/dissolved')
with arcpy.da.SearchCursor(dissolved, ['Shape@']) as scursor:
for shape, in scursor:
if provider_code in providers_data:
providers_data[provider_code] = providers_data[provider_code].union(shape)
else:
providers_data[provider_code] = shape
#: clean up
for delete_data in [layer, dissolved]:
arcpy.management.Delete(delete_data)
with arcpy.da.InsertCursor(all_providers, [fldNAME, 'Shape@']) as icursor:
for provider in providers_data:
icursor.insertRow((provider, providers_data[provider]))
def generate_single_providers():
print('generating single providers')
arcpy.management.TruncateTable(single_providers)
arcpy.management.Append(all_providers, single_providers)
with arcpy.da.UpdateCursor(single_providers, [fldNAME, 'Shape@']) as ucursor:
for provider, shape in ucursor:
print(provider)
with arcpy.da.SearchCursor(all_providers, ['Shape@', fldNAME], '{} <> \'{}\''.format(fldNAME, provider)) as cursor:
for cut_polygon, name in cursor:
shape = shape.difference(cut_polygon)
ucursor.updateRow((provider, shape))
generate_master_dataset()
generate_single_providers()
print('done')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment