Vairāk

Poligonu dalīšana * n * vienādu skaitļu grupu skaitā ar ArcPy?

Poligonu dalīšana * n * vienādu skaitļu grupu skaitā ar ArcPy?


Viens no maniem darba uzdevumiem ir sadalīt pakas grupās. Šīs grupas aģenti izmantos, lai sarunātos ar īpašumu īpašniekiem. Mērķis ir atvieglot aģenta darbu, sagrupējot sūtījumus, kas atrodas blakus viens otram, kā arī sadalot pakas vienādos skaitļos, lai darbs būtu vienmērīgi sadalīts. Aģentu skaits var svārstīties no pāris līdz 10+.

Pašlaik šo uzdevumu veicu manuāli, bet vēlos procesu automatizēt, ja tas ir iespējams. Esmu izpētījis dažādus ArcGIS rīkus, taču neviens, šķiet, neatbilst manām vajadzībām. Es izmēģināju skriptu (pitonā), kurā tiek izmantotsgandrīz_analīzeun daudzstūru atlase, taču tas ir diezgan nejaušs un prasa daļēji pareizu rezultātu, kas pēc manis labošanas prasa ilgāku laiku, nekā tad, ja es visu darīju tikai manuāli no sākuma.

Vai ir kāda uzticama metode šī uzdevuma automatizēšanai?

Rezultātu piemērs (cerams, ka bez dalījuma mēs redzam dzelteno krāsu):


Sākotnējais komplekts:

Izveidojiet no tā pseidokopiju (CNTRL-drag in TOC) un izveidojiet telpisko savienojumu ar daudziem, izmantojot klonu. Šajā gadījumā es izmantoju 500m distanci. Rezultātu tabula:

  1. Noņemiet ierakstus no šīs tabulas, kur PAR_ID = PAR_ID_1 - viegli.

  2. Atkārtojiet tabulu un noņemiet ierakstus, kur (PAR_ID, PAR_ID_1) = (PAR_ID_1, PAR_ID) jebkurš ieraksts virs tā. Nav tik vienkārši, izmantojiet acrpy.

Aprēķiniet sateces baseina centrālās daļas (UniqID = PAR_ID). Tie ir mezgli vai tīkls. Savienojiet tos pa līnijām, izmantojot telpisko savienojumu tabulu. Šī ir atsevišķa tēma, kas noteikti ir apskatīta kaut kur šajā forumā.

Zemāk esošajā skriptā tiek pieņemts, ka mezglu tabula izskatās šādi:

kur MUID nāca no pakām, kopsavilkuma lauks ir P2013. Šajā gadījumā = 1 tikai skaitīšanai. [rcvnode] - skripta izvade, lai saglabātu grupas ID, kas vienāds ar NODEREC pirmajam mezglam definētajā grupā / klasterī.

Saista tabulas struktūru ar iezīmētiem svarīgiem laukiem

Times saglabā saites / malu svaru, t.i., ceļa izmaksas no mezgla uz mezglu. Šajā gadījumā vienāds ar 1, lai ceļa izmaksas visiem kaimiņiem būtu vienādas. [fi] un [ti] ir secīgu savienoto mezglu skaits. Lai aizpildītu šo tabulu, meklējiet šajā forumā informāciju par to, kā piešķirt un saistīt mezglus.

Skripts, kas pielāgots manam darbagaldam mxd. Tas ir jāpārveido, cietā kodējumā norādot lauku un avotu nosaukumus:

importēt arcpy, traceback, os, sys, time importēt iterolus kā itt scriptsPath = os.path.dirname (os.path.realpath (__ file__)) os.chdir (scriptsPath) importēt COMMON sys.path.append (r'C:  Lietotāji  felix_pertziger  AppData  Roaming  Python  Python27  site-package ') importē networkx kā nx RATIO = int (arcpy.GetParameterAsText (0)) mēģiniet: def showPyMessage (): arcpy.AddMessage (str (time.ctime () ) + "-" + ziņojums) mxd = arcpy.mapping.MapDocument ("CURRENT") theT = COMMON.getTable (mxd)

Atrodiet mezglu slāni

theNodesLayer = COMMON.getInfoFromTable (theT, 1) theNodesLayer = COMMON.isLayerExist (mxd, theNodesLayer)

IEGŪT SAITES SLĀNI

theLinksLayer = COMMON.getInfoFromTable (theT, 9) theLinksLayer = COMMON.isLayerExist (mxd, theLinksLayer) arcpy.SelectLayerByAttribute_management (theLinksLayer, "CLEAR_SELECTION" linksFromI = COMMON.TableTable G = nx.Graph () arcpy.AddMessage ("Saites pievienošana grafikam") ar arcpy.da.SearchCursor (theLinksLayer, (linksFromI, linksToI, "Times")) kā kursoru: kursora rindai: (f, t, c) = rinda G.add_edge (f, t, svars = c) del rinda, kursors parādās = [] pops = arcpy.da.TableToNumPyArray (theNodesLayer, ("P2013")) garums0 = nx.all_pairs_shortest_path_length (G) nNodes = len (pops) aBmNodes = [] aBig = xrange (nNodes) resursdators = [- 1] * nNodes, bet True: RATIO + = - 1, ja RATIO == 0: salauzt aBig = filtru (lambda x: x nav aBmNodes, aBig) p = itt.combinācijas (aBig, 2) pMin = 1000000 mazs = [] a a p: S0, S1 = 0,0 i i in aBig: p = pops [i] [0] p0 = length0 [a [0 ]] [i] p1 = garums0 [a [1]] [i] ja p0

Rezultātu piemērs 6 grupām:

Jums būs nepieciešama vietnes pakete NETWORKX http://networkx.github.io/documentation/development/install.html

Skripts kā parametrs ņem nepieciešamo kopu skaitu (6 piemērā iepriekš). Tas izmanto mezglus un saites tabulas, lai izveidotu grafiku ar vienādu braukšanas malu svaru / attālumu (Times = 1). Tajā tiek ņemta vērā visu mezglu kombinācija ar 2 un aprēķināts kopējais [P2013] rādītājs divās kaimiņu grupās. Kad sasniegta vajadzīgā attiecība, piem. (6-1) / 1 pirmajā atkārtojumā, turpinās ar samazinātu proporcijas mērķi, ti, 4 utt. Līdz 1. Sākuma punktiem ir milzīga nozīme, tāpēc pārliecinieties, ka jūsu "beigu" mezgli atrodas jūsu mezglu tabulas augšpusē (šķirošana ?) Skatīt pirmās 3 grupas izvades piemērā. Tas palīdz izvairīties no “zaru griešanas” katrā nākamajā atkārtojumā.

Skriptu pielāgošana darbam no mxd:

  1. jums nav nepieciešams kopīgs imports. Tā ir mana lieta, kas nolasa savu vides tabulu, kurā norādīti mezgliNayerLayer, theLinksLayer, linksFromI, linksToI. Nomainiet attiecīgās rindas ar savu mezglu un saišu slāņu nosaukšanu.
  2. Ņemiet vērā, ka laukā P2013 var saglabāt jebko, piem. īrnieku skaits vai zemes gabala platība. Ja tā, jūs varētu apvienot daudzstūrus, lai turētu aptuveni vienādu cilvēku skaitu utt.

Lai sasniegtu savu mērķi, jums jāizmanto rīks “Grupas analīze”. Šis rīks ir lielisks rīks no "telpiskās statistikas" rīkkopa, kā norādīja @phloem. Tomēr jums vajadzētu precīzi pielāgot rīku, lai tas pielāgotos jūsu datiem un problēmai. Es izveidoju līdzīgu scenāriju, kādu jūs ievietojāt, un saņēmu atbildi tuvu jūsu mērķim.

Padoms: Izmantojot ArcGIS 10.2, kad palaidu rīku, tā sūdzējās par trūkstošo python paketi "six". Tāpēc vispirms pārliecinieties, vai esat to instalējis

Soļi:

  1. Pievienojiet lauku daudzstūra klasei, lai turētu unikālu vērtību
  2. Pievienojiet vēl vienu lauka veidu Short ar nosaukumu, piem. "SameGroup"
  3. jūs lauka kalkulatoru, lai piešķirtu 1 šim laukam visām rindām. vienkārši nomainiet vienu rindu uz 2.

  4. Iestatiet šādus rīka parametrus "Grupas analīze":

mēģiniet mainīt parametru "Kaimiņu skaits", lai tas būtu piemērots jums.

Rezultāta momentuzņēmumi:


būtībā vēlaties vienāda lieluma klasterizācijas metodi, lai jūs varētu meklēt tīmeklī ar šiem atslēgas vārdiem. Man ir laba atbilde par statistiku. SE ar Python ieviešanu vienā no atbildēm. Ja esat pazīstams ar arcpy, jums vajadzētu būt iespējai to izmantot kopā ar saviem datiem.

Vispirms jums jāaprēķina daudzstūru centroidu X un Y, pēc tam jūs varat ievadīt šīs koordinātas skriptā un atjaunināt to atribūtu tabulu, izmantojot .da kursoru.


Sveiki, man bija līdzīgs jautājums kā šim iepriekš, tāpēc es biju tam kaut ko devis, nekad ar citu nesācu, bet es domāju tikai par thoery pusi

IEVADES forma

es domāju, ka jūs varētu izveidot zivju tīklu uz ievades formas

zivju tīkls ar jūsu krustojuma ievades formu būtu

Pēc tam jūs varat aprēķināt šo paku laukumu tikko apstrādātā daudzstūra iekšpusē

Skripta sākumā apgabala ievades daudzstūris / vēlamais vienādu izmēru daudzums n

Pēc tam jums būs nepieciešams veids, kā pakas sasaistīt, lai viņi apzinātos robežas.

Tad jūs varētu iziet cauri rindu kursoram, kurā apkopotas pakas

Noteikumi ir

* Tā robežojas ar pēdējo vasaru * Tā nav summēta * Kad tā pārsniegs vērtību, kas aprēķināta kā vienāda platība, tā atkāpsies un tā būs grupa * Process sāksies no jauna * pēdējā grupa varētu būt atlikušo paku summa

es domāju, ka attiecību nodibināšana starp pakām varētu būt sarežģīta lieta, bet, kad tas ir izdarīts, es domāju, ka varētu būt iespējams to automatizēt


Es uzskatu, ka paplašinājums, kuru meklējat, ir rajons. To parasti izmanto vēlēšanām, kā arī vienāda lieluma franšīzes teritorijām. (Izmērs ne vienmēr nozīmē apgabalu, tas var būt jebkurš demogrāfiskais stāvoklis)

http://www.esri.com/software/arcgis/extensions/districting

http://help.arcgis.com/en/redistricting/pdf/D Districting_for_ArcGIS_Help.pdf


Tas ir mans risinājums punktveida notikumiem. Nav garantiju, ka tas vienmēr darbosies ...

  1. Punkta notikuma slānī (izsaukuma slānis1) pievienojiet slejas x (dubultā), y (dubultā) un unikālai (garam veselam skaitlim)
  2. Atvērt atribūtu tabulu 1. slānim. Aprēķiniet x koordinātu punktu x, y koordinātu punktu y un FID unikālo ID
  3. Izpildiet telpiskās statistikas rīku> Klasteru kartēšana> Grupēšanas analīze
    • iestatiet 1. slāni kā ievades funkcijas
    • iestatiet unikālu kā unikālo lauka ID
    • Definējiet grupu skaitu (mēs teiksim 10)
    • Analīzes laukiem atlasiet x un y
    • Telpiskajiem ierobežojumiem izvēlieties “NO_SPATIAL_CONSTRAINT”
    • Noklikšķiniet uz Labi
  4. Izpildiet telpiskās statistikas rīkus> Ģeogrāfisko sadalījumu mērīšana> Mean Center
    • Atlasiet Izeja no 3. vietas kā Ievades funkciju klase
    • Kā lietas lauku atlasiet SS_Group
    • Noklikšķiniet uz Labi
  5. Atveriet Tīkla analītiķis> Atrašanās vietas piešķiršanas rīks
    • # 4 slodze kā aprīkojums
    • Ielādējiet 1. slāni kā pieprasījuma punktus
    • Atveriet atribūtus un iestatiet
      • Problēmas veids kā maksimizēt kapacitēto pārklājumu
      • Iespējas, kuras izvēlēties kā 10 (no 3. pozīcijas iepriekš)
      • Noklusējuma ietilpība kā kopējais 1. slāņa funkciju skaits, dalīts ar iespējām, kuras izvēlēties noapaļot uz augšu (tātad, ja 145 funkcijas un 10 iespējas / apgabali, iestatiet kā 15)
      • Noklikšķiniet uz Labi
        • Atrisiniet
        • Jūsu pieprasījuma punktiem jābūt vairāk vai mazāk vienādi sadalītiem 10 ģeogrāfiskās kopās

Vispirms jums būs jāizveido tīkla datu kopa, izmantojot savas ielas. Esmu izmēģinājis šo piedāvāto metodi un līdz šim man ir veicies pats, darot to pašu ar Grupēšanu (3. darbība), ievades laukiem izmantojot X, Y koordinātas un k-līdzekļus (nav perfekti, bet ātrāk un tuvāk tam, kas esmu nepieciešams). Esmu atvērts citiem komentāriem un atsauksmēm.