Vairāk

Telpiskais savienojums ar MILZĪGĀM datu kopām

Telpiskais savienojums ar MILZĪGĀM datu kopām


Kā izveidot telpisku savienojumu ar ArcGIS, izmantojot šīs MILZĪGĀS datu kopas?

  • Mērķis: gandrīz 3 miljoni kvadrātu 500x500m lielumā (atribūtu tabula būtībā ir tukša)
  • Pievienošanās funkcija: 12000 polilīnijas
  • Darbība: viens pret daudziem
  • Spēle: krustojas

Visi mani mēģinājumi ir izgāzušies:

  • No rīkjoslas Spatial Join rīka: pēc 15 minūtēm izeja ir fails, kurā nav veikta pievienošanās (lauks Join_Count visās rindās ir 0)
  • No dialoglodziņa: Šķiet, ka tas darbojas, bet, pēc manām domām, tā izpilde prasa 4 dienas - bez jebkādas garantijas produkcija būs pareiza.

Tas darbojas, kad veicu telpisku pievienošanu nelielai teritorijai.

Vai jums ir idejas, kā to izdarīt pareizi?

Es izmantoju failu ģeodatu bāzi, ArcGIS 10.2, fona apstrādi, 32 GB RAM

(Ideja ir pārklāt šīs polilīnijas ar režģi (kvadrāti 500x500m). Pēc tam es izveidošu šķīdumu, lai uzzinātu, cik līniju ir katrā kvadrātā. Visbeidzot, es izveidošu blīvuma karti.)


Es tikko paņēmu Esri "Data & Maps" ASV galveno maģistrāļu apakškopu (CONUS ar CLASS = 1 - 11 803 funkcijām), projicēju to uz PCS_NAD_1983_CONUS_ALBERS un izveidoju 2km x 2km daudzstūra režģi aploksnē {-2,6m, 0,2m, + 2,4 m, 3,2 m} (2500 x 1500 šūnas = 3,75 m daudzstūri), lai simulētu jūsu datus.

Tad es izmantoju kodola blīvumu, lai izveidotu 2km x 2km šūnu karstuma karti (0,1 minūtēs):

Tad es sakrustoju līnijas caur daudzstūriem (10,8 minūtes, lai radītu 75 221 diskrētu līniju), un skrēju Frekvence, lai ģenerētu daudzstūru ID skaitu (0,2 minūtes, lai identificētu 55701 krustotos režģus). No šejienes bija vieglāk aizpildīt avota iezīmju klasi 'icount' ar pitona skriptu (kas darbojās 19,7 minūtes):

importēt arcpy arcpy.env.workspace = r'D:  Temp  gis_se  overlay.gdb 'tablePath =' grid_frequency_tab 'layerPath =' grid_albers 'tableCols = ["FID_grid_albers", "frekvence"] count = 0 ar arcpy.da. SearchCursor (tablePath, tableCols) kā kursors1: 1. rindai kursorā1: skaits = skaits + 1 kurClause = "" "{0} = {1}" "". Formāts ("Objectid_1", str (1. rinda [0])) ar arcpy.da.UpdateCursor (layerPath, "icount", whereClause) kā kursors2: 2. kursoram kursorā2: 2. rinda [0] = 1. rinda [1] kursors2.updateRow (2. rinda) drukas str (skaits) + "atjauninātās funkcijas"

Tad es izmantoju vaicājuma definīciju, lai atlasītu tikai daudzstūrus, kuru skaits ir lielāks par nulli, un rezultātu nokopēju jaunā daudzstūra pazīmju klasē (0,2 min):

Es iesaku meklēšanas metodē iekļaut bufera attālumu (kodola blīvums to padara vienkāršu), jo lielais režģa šūnu skaits apgrūtina lielu pārklāšanos.

Ir iespējami daudzi citi varianti, tostarp vaicājuma veiktspējas uzlabošanai funkciju in_memory izmantošana un divu DA meklēšanas kursoru ar vārdnīcu izmantošana, lai atmiņā sastādītu daudzstūra-id / skaitīšanas tabulu (pēc tam poligonu atjaunināšanu ar DA kursoru), bet procesam nav vajadzīgas vairākas dienas, ja izmantojat pareizo pieeju.


Tas ir alternatīvs veids, kā tikt galā ar šo problēmu, ar Python skriptu, kas sasprauž katra daudzstūra līnijas (atkārto visus poligonus), saskaita atlikušās līnijas un raksta atribūtu tabulā.

Šeit tiek parādīti koda gabali, kas man bija blakus, un tas nav pienācīgi pārbaudīts, ne arī pilnīgs skripts. Tas ir konfigurēts kā skripta rīks Arcmap. Man bija jāmaina daži mainīgo nosaukumi, iespējams, esmu palaidis garām vienu vai divus.

# Lietotāja daudzstūru lasīšanas ievade = arcpy.GetParameterAsText (0) līnijas = arcpy.GetParameterAsText (1) outcm = arcpy.GetParameterAsText (2) # Izveidojiet pagaidu FC tempLines = arcpy.CreateFeatureclass_management '' 'temp_memory' '' temp_memory , lines) mem_polygons = "in_memory  mem_polygons" arcpy.CopyFeatures_management (daudzstūri, mem_polygons) # Nospiediet ievades failu katram 50 000 daudzstūrim un apstrādājiet pa vienam gabalam cursorFields = ('SHAPE @', 'LineCount',…) # Neatkarīgi no laukiem, kas jums nepieciešami, izmantojot arcpy.da.UpdateCursor (mem_polygons, cursorFields) kā cmrows: rindai cmrows: arcpy.env.overwriteOutput = True arcpy.Clip_analysis (līnijas, [0], tempLines) arcpy.env.overwriteOutput = Nepatiesa ## Veiciet nepieciešamos aprēķinus, piemēram. saskaitīt rindas tempLines ... ## Rakstīt lauka LineCount lauka rindā [1] = #jūsu skaits mainīgais cmrows.updateRow (rinda) arcpy.CopyFeatures_management (mem_polygons, outcm)

Varat arī izveidot izejas failus ik pēc dažiem desmit tūkstošiem daudzstūru vai arī tā, lai pārliecinātos. Tas arī ļautu vieglāk veikt sērijveida apstrādi. Izmantojot 32 GB RAM, jums vajadzētu būt iespējai apstrādāt diezgan daudzus daudzstūrus ar vietu in_memory-space. Tomēr jūs varat arī uzrakstīt šo ierakstu parastajā shapefile vai gdb, ja tas kļūst par atmiņas problēmu.


Līdzīgi kā @Vince un @Martin, ja vēlaties redzēt, cik līnijas krustojas katrā daudzstūra šūnā, jūs varētu:

  1. Izmantojiet funkciju Funkcija līdz līnijai, lai sagrieztu līnijas pēc daudzstūra robežas, pēc tam noņemiet līnijas, kas faktiski piederēja daudzstūrim (jo tās abas atrodas izvadē), tāpēc jums vienkārši ir līnijas, kas pieder polilīnam FC.
  2. Izmantojiet tabulētu krustojumu ar skaitīt iespēja apkopot, cik "sagrieztu" līniju nokrita katrā daudzstūra šūnā.

Skatīties video: Darbības ar kopām