Vairāk

Metode, kā sadalīt līniju segmentus ceļu tīklā, kas pārsniedz X garumu, n mazākos līniju segmentos, izmantojot ArcGIS?

Metode, kā sadalīt līniju segmentus ceļu tīklā, kas pārsniedz X garumu, n mazākos līniju segmentos, izmantojot ArcGIS?


Es izmantoju ArcGIS Desktop 10.2, un es vēlētos pa ceļu iet tīklā, kas pārsniedz noteiktu garumu, un sadalīt tos vienādos mazākos gabalos. Esmu pamanījis, ka sadalīšanu pēc procentiem var panākt, izmantojot Redaktora izvēlni; tomēr šķiet, ka tas jādara pa rindām.

Vai jūs varētu ieteikt veidus, kā automatizēt procesu, lai sadalītu visus ceļus noteiktā garumā mazākās daļās, pamatojoties uz oriģināla procentiem?


Nedaudz Python automatizācijas ļauj paveikt šo darbu. Pamata darbības:

  • Nosakiet maksimālo attālumu objektu klases vienībās, izmantojot telpisko atsauces objektu (nepieciešama projicēta objektu klase, es ticu)
  • Izveidojiet jaunu, tukšu objektu klasi ar ievades rindas funkciju klasi kā veidni
  • Atkārtojiet ievades funkciju klasi un pārbaudiet tās līnijas garumus
  • Ja garums ir pārāk garš, nepārtraukti sadaliet līniju, izmantojot akamērcilpa,pozīcija gar līniju, unsadalīt līniju punktā.
  • Kad līnijas ir īsākas par maksimālo garumu, pievienojiet rindas objektu sarakstam
  • Ievietojiet visus rindas objektus jaunajā funkciju klasē, izmantojot ievietošanas kursoru

Ieejas:

inFc: ievades līnijas funkciju klase

outFc: izvades funkciju klase

dist: maksimālais attālums metros

Kods:

# Pilns ceļš uz ievades līnijas pazīmju klasi inFc = r "C:  Users  e1b8  Desktop  E1B8  Workspace  Workspace5.gdb  testLines_split" # Pilns ceļš uz izejas līnijas pazīmju klasi outFc = r "C:  Users  e1b8  Darbvirsma  E1B8  Workspace  Workspace5.gdb  testLines_split2 "# Attālums (metros) dist = 15 # ----------- importēt arcpy import os # pārrakstīt izejas (pēc izvēles) arcpy.env.overwriteOutput = True print "Telpiskās atsauces informācijas noteikšana" #Iegūstiet telpisko atsauces objektu sr = arcpy.Describe (inFc) .spatialReference #meters Conversion metersPerUnit = sr.metersPerUnit # Attālums objektu klases vienībās checkDistance = dist / metersPerUnit print "max distance:", checkDistance print " izejas objektu klases izveide "#Create out feature class outPath = os.path.dirname (outFc) outName = os.path.basename (outFc) arcpy.CreateFeatureclass_management (outPath, outName," POLYLINE ", inFc, spatial_reference = sr) #set darbvieta arcpy.env.workspace = outPath #list ar ģeometrijas lauku laukiem = ["SHAPE @"] #Pievienojiet objektu klases laukus saraksta laukam ds + = [f.name for f in arcpy.ListFields (inFc)] # Iegūt objekta lauka nosaukumu oidFld = arcpy.Describe (inFc). OIDFieldName # Noņemt oid lauku no lauku saraksta laukiem. rindas, kas pievienotas rindām = [] drukāt drukāt "iterating", arcpy.GetCount_management (inFc) .getOutput (0), "rows" i = 0 # kursors, lai atkārtotu objektu klasi ar arcpy.da.SearchCursor (inFc, lauki) kā kursoru : #iteratēt rindas kursora rindai: i + = 1 #get geometry object object geometry = rinda [0] #get length length = geometry.length #pārbaudiet, vai garums pārsniedz ierobežojumu, ja garums> checkDistance: drukāt "rindu", es drukāju "rindas garums:", garums # tukšs saraksts starpposma datumam, kas jāizdzēš garbage = [] #izveidojiet tukšu rindu fc vienai funkcijai split = arcpy.CreateUniqueName ("split") outPath = os.path.dirname (split) outName = os.path.basename (split) arcpy.CreateFeatureclass_management (outPath, outName, "POLYLINE", inFc, spatial_reference = sr) # ievietojiet funkciju jaunā fc ar arcpy.da.InsertCursor (sadalīt, lauki) kā cu r: cur.insertRow (rinda) del cur # pievienot jaunu fc uz atkritumu atkritumiem + = [split] # izveidot tukšu punktu fc vienai funkcijai midPnt = arcpy.CreateUniqueName ("punkts") outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", spatial_reference = sr) # Iegūstiet viduspunkta pnt = geometry.positionAlongLine (.5, True) # ievietojiet punktu jaunā funkciju klasē ar arcpy. da.InsertCursor (midPnt, "SHAPE @") kā cur: cur.insertRow ((pnt,)) del cur #add new fc to atkritumu atkritumiem + = [midPnt] #loop, kamēr garums ir lielāks par ierobežojumu, bet garums> checkDistance: #Split līnija (vidus) punktā newSplit = arcpy.CreateUniqueName ("split") atkritumi + = [newSplit] arcpy.SplitLineAtPoint_management (split, midPnt, newSplit) #Create jaunu viduspunktu midPnt = arcpy.CreateUniqueName ("point") atkritumi + = [midPnt] outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", spatial_reference = sr) # tukšs jaunu punktu saraksts pnts = [] #iterate split line and get midpoints with arcpy.da.SearchCursor (newSplit, "SHAPE @") as cur: for geom, in cur: pnt = geom.positionAlongLine (.5 , True) pnts + = [pnt] del cur #add midpoints to midpoint feature class with arcpy.da.InsertCursor (midPnt, "SHAPE @") kā cur: pnt pnts: cur.insertRow ((pnt,)) del cur # dalīt garuma mainīgo ar diviem garumiem = length / 2 print "line length:", length split = newSplit rows + = [rinda rindā arcpy.da.SearchCursor (split, lauki)] # ​​notīrīt miskastes starpposma datus atkritumi: arcpy.Delete_management (trash) cits: rindas + = [rinda] #del kursora mainīgais del kursora izdruka drukāt "rindu ievietošana jaunā funkciju klasē" # ievietot kursora jaunu funkciju klasi ar rindām ar arcpy.da.InsertCursor (outFc, lauki ) kā kursors: rindai rindās: cursor.insertRow (rinda) del kursora drukas druka "izveidota:", outFc drukas druka "pabeigta"

Rezultāts izskatās apmēram šādi:

nosakot telpiskās atsauces informāciju, maksimālais attālums: 65.6166666667 izejas elementu klases izveidošana, atkārtojot 11 rindas 4. rindas rindas garums: 90.6641581736 rindas garums: 45.3320790868 6. ​​rindas rindas garums: 81.7030489448 rindas garums: 40.8515244724 7. rindas rindas garums: 82.7060163161 rindas garums: 41.3530081581 9. rindas garums 97.005780961 rindas garums: 48.5028904805 10. rindas rindas garums: 90.6565601113 rindas garums: 45.3282800557 rindu ievietošana jaunajā izveidoto objektu klasē: C:  Users  e1b8  Desktop  E1B8  Workspace  Workspace5.gdb  testLines_split2 done

Funkciju klasē:

Out funkciju klase:


Tas nav tieši līdzvērtīgs jūsu aprakstītajam procesam, bet ArcGIS ir Kauli rīks, lai automātiski sadalītu garās līnijas X virsotņu daļās. Tas tomēr neizmanto procentuālo robežu, bet tikai virsotņu robežu. Tomēr, ja vienīgais mērķis ir sadalīt līnijas apmēram vienādos izmēros, tas var būt noderīgi:

http://resources.arcgis.com/EN/HELP/MAIN/10.2/index.html#//001700000037000000


Skatīties video: ArcGIS Desktop: New HTML Popup Tool