Vairāk

Nosakiet zemes gabalu kaimiņus, izmantojot PYTHON

Nosakiet zemes gabalu kaimiņus, izmantojot PYTHON


Kā redzat pirmajā attēlā, man ir 220. paka, un es vēlos noteikt katra viņa kaimiņa stāvokli! Tāpēc ideja bija aprēķināt gultni starp 220 centra malu un citu kaimiņu centroidu (kad gultnis ir starp [50,150] = ziemeļiem; [150, 250] = austrumiem; [250,350] = rietumiem ...). Tātad, lai noteiktu kaimiņus, es izmantoju šo funkcijuarcpy.PolygonNeighbors_analysis (in_features, out_table, {in_fields})(2. attēls), un 3. attēlā mums ir pakas ar centraidu (X, Y). Tāpēc katru reizi, kad man vajadzētu ņemt

  1. (X, Y) no P220 kā sākuma punktu un (X, Y) no P228 kā beigu punktu, nekā aprēķināt gultni
  2. (X, Y) no P220 kā sākuma punktu un (X, Y) no P227 kā beigu punktu, aprēķiniet gultni
  3. (X, Y) no P220 kā sākuma punktu un (X, Y) no P226 kā beigu punktu, aprēķiniet gultni
  4. nekā visiem 2. attēla kaimiņiem

Lai to izdarītu, es izmantoju trīs cilpu, un es domāju, ka tas pagriežas pa labi, bet tas tiek darīts tikai pirmajai rindai un nepārvietojas uz tritona rindu!

Kods ir šāds:

>>> cur = arcpy.UpdateCursor ("Join_Output_12") >>> cur2 = arcpy.UpdateCursor ("Join_Output_12") >>> cur_t = arcpy.UpdateCursor ("tb20_12_2014_") >>> del row2, Refname__table_ne1, kaimiņš, sākuma , end_x1, end_y1, copy_field >>> rindai cur:… Refname_feature = row.getValue ("RefName") ... rindai_t cur_t:… Refname__table_target = row_t.getValue ("src_RefName") ... if (Refname__table_target == Refname_feature : ... start_x1 = row.getValue ("POINT_X") ... start_y1 = row.getValue ("POINT_Y") ... print Refname_feature ... print start_x1 ... print start_y1… Refname__table_neighbor = row_t.getValue ("nbr_RefName") ... print Refbor____ tabulas cur2:… copy_field = row2.getValue ("copy_field") ... if (copy_field == Refname__table_neighbor):… end_x1 = row2.getValue ("POINT_X") ... end_y1 = row2.getValue ("POINT_Y") ... print copy_field ... print end_x1 ... drukāt end_y1 ... rinda = cur.next ()

Rezultāts ir:

1 221408.8543 200288.7235 1 1 221408.8543 200288.7235

Tāpēc es domāju, ka problēma rodas no cilpas!

Pēc šī rezultāta iegūšanas jūs to varat redzēt 4. attēlā (novietojiet pie katra sūtījuma) Rezultāts, ko saņemu, bija labs! Bet tas 100% nereaģē uz manu vajadzību, lai būtu skaidrāk, aplūkosim paku 221 piemēru, tai ir paku kaimiņš 220 ziemeļos un arī rietumos, bet pie galda mēs varam redzēt tikai ziemeļus, tāpēc es vēlos šo rezultātu katkatināt līdz funkcijas rezultātamAprēķināt blakus esošo lauku kartogrāfiju (in_features, in_field)tu man pateiksi, kāpēc tikai neizmantot tikai šo funkciju? bet tas ir arī nepilnīgs! apskatiet 5. attēlu, lai redzētu rezultātu Paņemsim piemēru P220, mēs varam redzēt, ka tas uz ziemeļiem nosaka tikai 224, 226, pat ja ir vairāk! Tāpēc ideja ir apvienot abus rezultātus, lai beidzot iegūtu pilnīgāku un uzticamāku rezultātu! Bet kā to izdarīt? es nevaru atrast vienu loģiku, lai tos apvienotu !!

REDIĢĒT: Šis ir sarežģītu attiecību piemērs, un uz galda pēc tam, kad man rodas rezultāts krāsaina līnija, piedāvā programmas Kaimiņus uzņemtos, un, kad es paskatījos, kāda veida pakas sajaucas, es atklāju, ka tas, kurš nav sazinājies ar tagu paku (kā 164 P2 un 150 ziemeļos ...)!


Iegultie kursori ir vissliktākais veids, kā kaut ko ieprogrammēt. Nedari to. Jūsu kods neizdodas, jo kursori vienā virzienā lasa tikai vienu reizi. Tātad iekšējais kursors ir pilnībā jāpārbūvē no jauna un jāsāk no jauna katram ierakstam ārējā kursorā. Katram papildu ierakstam katrā tabulā ir jāsalīdzina laiks, kas vajadzīgs, lai salīdzinātu abas tabulas, galvenokārt pieaug uz eksponenciālās izaugsmes līknes, no kuras būtu jāizvairās par katru cenu, ja katrā tabulā ir kaut kas vairāk par 50 ierakstiem.

Jūsu kursori arī nav da kursori, tāpēc tie ir 10 reizes lēnāki ārpus vārtiem. Izmantojiet divas pilnīgi atsevišķas kursora cilpas. Viens nolasa datus no avotiem divās vārdnīcās un otrs, lai atjauninātu funkcijas, pamatojoties uz vārdnīcās izveidotajiem sakritībām. Vārdnīcas ir brīvpiekļuves struktūras, kursori nav, un vārdnīcas ir atmiņā, kamēr kursori nav. Tātad jūs saņemat apmēram 20 līdz 100 reizes labāku sniegumu ar pieeju, kuru es iesaku. Skatiet manu emuāru vietnē Turbo Charging Data Manipulation with Python Cursors and Vārdnīcas.

Jūs izmantojat UpdateCursors, bet neko nerakstāt tabulā. Kāpēc? Lai rakstītu, nepieciešams lauks X un Y. Jums vienmēr ir nepieciešams tikai viens UpdateCursor vienā avotā, nekad divi vienā un tajā pašā datu avotā. Definējiet šos laukus, to nosaukumus un tabulu, kurā tie atradīsies.

Tāpēc izpētiet manu emuāru un sāciet no jauna. Jums būs prieks, ka to izdarījāt.

Paldies, ka rediģējāt savu ziņu ar grafiku, kas izskaidro tabulu avotu un analīzes mērķi, kā arī labākas tabulas, ar kurām strādāt. Pirmais solis ir pievienot 4 Double laukus tabulai ar diviem src_RefName un nbr_RefName laukiem, lai no otras tabulas noturētu abu centroidu XY, lai būtu vieta, kur saglabāt atjaunināšanas kursora rezultātus. Es tos saukšu par X_Start, Y_Start, X_End un Y_End. Pievienojiet arī vēl vienu dubulto lauku Bearing. Zemāk aprēķinātais gultnis ir trigonometriskais gultnis, kas sākas tieši uz austrumiem un iet pretēji pulksteņrādītāja kustības virzienam, nevis navigācijas gultnis, kas sākas tieši uz ziemeļiem un iet pulksteņrādītāja virzienā. Ja vēlaties navigācijas gultni, nomainiet līniju, kas skan: updateRow6 = (leņķis + 360)% 360, lai atjauninātuRow6 = (90 - leņķis)% 360. Gultņu saistība ar kompasa punktiem ir [45-135] = North, [ 135-225] = Rietumi, [225-315] = Dienvidi, [315-359.9…, 0-45] = Austrumi.

Tagad ielādējiet tabulu ar centroid XY vārdnīcā. Tad iegūstiet katras rindas divas RefName vērtības un aizpildiet 2 XY koordinātas un dubultos laukus. Trešo piemēru manā emuārā var pielāgot procesa veikšanai.

no laika importēt strftime print "Sākt skriptu:" + strftime ("% Y-% m-% d% H:% M:% S") importēt arcpy no matemātikas importa grādiem, atan2 sourceFC = r "C:  Path  SourceFeatureClass "sourceFieldsList = [" RefName "," POINT_X "," POINT_Y "] # Izmantojiet saraksta izpratni, lai izveidotu vārdnīcu no da SearchCursor valueDict = {r [0] :( r [1:]) r vietnei arcpy.da. SearchCursor (sourceFC, sourceFieldsList)} updateFC = r "C:  Path  UpdateFeatureClass" updateFieldsList = ["src_RefName", "nbr_RefName", "X_Start", "Y_Start", "X_End", "Y_End", "Bearing"] ar arcpy.da.UpdateCursor (updateFC, updateFieldsList) kā updateRows: for updateRow in updateRows: # rindas src_RefName un nbr_RefName vērtību glabājiet keyValue mainīgo pāra keyValue1 = updateRow [0] keyValue2 = updateRow [1] # pārbaudiet, vai keyValues ​​ir vārdnīcā, ja keyValue1 vērtībāDict un keyValue2 vērtībāDict: # pārsūta zem keyValues ​​saglabāto vērtību no vārdnīcas uz atjaunināto lauku. updateRow [2] = valueDict [keyValue1] [0] updateRow [3] = valueDict [keyValue1] [2] updateRow [4] = valueDict [keyValue2] [0] updateRow [5] = valueDict [keyValue2] [3] leņķis = grādi (atan2 (valueDict [keyValue1] [4] - valueDict [keyValue2] [5], valueDict [keyValue1] [0] - valueDict [keyValue2] [0])) updateRow [6] = (leņķis + 360)% 360 updateRows .updateRow (updateRow) del valueDict print "Pabeigts skripts:" + strftime ("% Y-% m-% d% H:% M:% S")

Rediģēt:

Jūs paplašinājāt savu jautājumu par citu problēmu par mēģinājumu precīzi aprakstīt attēlu, izmantojot kompasa norādījumu tabulu. To darot, jūs izvirzāt daudz lielāku problēmu. Programmas rakstīšana, lai pareizi novērtētu jūsu attēlu, šajā tabulā ir tāds pats kā mēģinājums panākt, ka neredzīgo vīriešu grupa vienojas, kāds ir zilonis, kad viņi piedzīvo tikai nelielu tās daļu. Tas ir tas, ko jūs mēģināt, ieprogrammējot sarežģītas realitātes vienkāršotos vispārinājumos un sadalot to atsevišķās mazo daļu pārbaudēs. Ir gandrīz neiespējami, ka neredzīgi vīrieši, kas darbojas šādi, nāk klajā ar tādu pašu realitātes aprakstu, kādu izskaidros redzīgs cilvēks.

Mūsu acis un smadzenes ir pārsteidzoši gandrīz uzreiz noteikt, ko ņemt un ko izmest, mēģinot novērtēt jūsu sniegto attēlu, un neviena programma, kuru jūs vai es varu rakstīt, nevar tai līdzināties. Tomēr pat redzīgiem cilvēkiem jūsu formu sarežģītība nozīmē, ka nav neviena perfekta galda, jo pat redzīgi cilvēki var vērsties pie jūsu problēmas no vairākiem skatpunktiem un nākt klajā ar dažādām kompasa virziena apraksta tabulām (es pats varu redzēt vairākas pareizas atbildes, atkarībā no manis izmantotajām metodēm). Tātad kādā brīdī jums ir jāapmierina nepilnības, ko vienmēr rada vispārinājumi, un izvēlētās metodikas ierobežojumi. Bet tas nenozīmē, ka jūs esat ierobežots ar programmu, kurā ņemta vērā tikai viena metodika. Tomēr metodoloģijas jāpiemēro pakāpeniski sarežģītākā veidā pēc tam, kad mazāk sarežģītas pieejas izrādās nepietiekamas.

Piemēram, jūs īsti neesat novērtējis savu daudzstūru gultņus, kur tie pieskaras, jūs esat novērtējuši tikai savu daudzstūru centraīdu gultņus. Šī ir tā ziloņa daļa, kuru jūsu neredzīgie ir pieredzējuši un šobrīd jums stāstījuši par šo ziloni.

Šiem centraīdiem var būt sliktas attiecības ar jūsu daudzstūru kopīgo malu. Iespējams, ka labāka analīze ir pārbaudīt abus daudzstūra centrālo centru gultņus līdz centroidam, kas nokrīt uz jūsu daudzstūru kopīgās malas. Šīs analīzes ietvaros jums, iespējams, arī jānosaka, kurš daudzstūris atrodas koplietojamās malas labajā pusē un kurš atrodas koplietojamās malas kreisajā pusē, lai iegūtu daudzstūra normālo leņķi pret līniju centrālās līnijas katrā daudzstūrī. Tas veidos vēl vienu leņķu kopumu, kas varētu atklāt jau pārbaudīto centroīdā gultņa pietiekamību vai nepietiekamību, lai aprakstītu abu daudzstūru relatīvās kompasa orientācijas. Acīmredzot šo leņķu kopu tulkošana, lai pielīdzinātu tam, ko jūsu acis un prāts uzskata, ir sarežģītāka, bet, iespējams, vairāk līdzīga tam, ko jūsu smadzenes faktiski dara. Jūs varētu arī apskatīt koplietojamās malas galus un to parastos leņķus, kā vēl vienu veidu, kā novērtēt kopējās malas centrālās daļas piemērotību, lai sniegtu priekšstatu par realitāti. Šeit ir attēls ar ziloņa daļu, ko varētu uzzīmēt šī kopīgā malaida analīze:

Pirmajā attēlā aplūkojot daudzstūra 224 centrmezgla gultni uz daudzstūra 220 centroidu, šķiet, ka nesošās attiecības jāapraksta kā dienvidrietumu virzienā. Tomēr, aplūkojot daudzstūra 224 centrmezgla gultņu attēlu līdz tā kopējās malas centram ar daudzstūri 220, ir skaidrs, ka no šī viedokļa nesošās attiecības starp 224 līdz 220 ir precīzāk aprakstītas kā dienvidaustrumu gultņu attiecības. No dažādiem viedokļiem abi attiecas uz šo ziloni. Jautājums ir, vai jūs tikai vienu no šīm atbildēm pieņemat kā patiesu, vai abas pieņemat kā patiesas?

Bet ko tad, ja abi daudzstūri pieskaras vairākās vietās un kopīgi izmanto vairāk nekā vienu nepārtrauktu malu? Ko jūs tad darāt? Atbilde vienmēr ir vispirms atrisināt visvienkāršākās problēmas un pēc tam atrast veidu, kā izolēt objektu kopu, kas neievēro šo risinājumu, un pārbaudīt tikai šo kopu. Tas padara labu programmas procesu efektīvu, netērējot dārgo laiku, veicot daudz nevajadzīgu novērtējumu.

Kā redzat, šī problēma var pārsniegt to, ko var atbildēt vienkāršs ziņojums, un atkarībā no šīs tabulas nozīmīguma jūsu analīzes vajadzībām tikai jūs varat noteikt, cik daudz laika esat gatavs pavadīt, lai programmatiski neredzīgos cilvēkus tuvinātu realitātei ziloņa, kuru redzat jūs, redzīgais. Neskatoties uz to, tagad jūs varat redzēt, ka nejaušas piekļuves kursoru pārveidošanas par brīvpiekļuves vārdnīcām (un tagad vārdnīcās iekļauto) pārveidošanas tehnika ir būtiska, lai būtu iespējams pat efektīvi novērtēt problēmu.


Skatīties video: LP EXPRESS 24 siuntos atsiėmimas