Daha çox

BÖYÜK məlumat dəstləri ilə məkan birləşməsi


Bu BÖYÜK məlumat dəstləri ilə ArcGIS ilə məkan birləşməsini necə etmək olar?

  • Hədəf: 500x500m ölçülü 3 milyon kvadrat (atribut cədvəli əsasən boşdur)
  • Qoşulma xüsusiyyəti: 12000 polylines
  • Əməliyyat: bir çox
  • Qarşılaşma: kəsişmək

Bütün cəhdlərim uğursuz oldu:

  • Alətlər qutusundakı Məkan Qeydiyyat vasitəsindən: 15 dəqiqədən sonra nəticə heç birləşdirilməmiş bir sənəddir (Join_Count sahəsi bütün satırlarda 0 olur)
  • Dialoq qutusundan: Görünür işləyir, amma təxminim budur ki, başa çatdırmaq 4 gün çəkir - heç bir zəmanət olmadan çıxış doğru olacaqdır.

Kiçik bir sahənin Mekansal Birləşməsi etdikdə işləyir.

Bunu düzgün bir şəkildə necə etmək barədə hər hansı bir fikir varmı?

Fayl geodatabase, ArcGIS 10.2, arxa plan işləmə, 32 GB RAM istifadə edirəm

(Fikir bu çox xəttləri şəbəkəyə (500x500m kvadratlar) üst-üstə qoymaqdır. Sonra hər kvadratda neçə sətir olduğunu öyrənmək üçün bir həll edəcəm. Nəhayət, bir sıxlıq xəritəsi hazırlayacağam.)


Sadəcə, ABŞ-ın Esri "Data & Maps" əsas magistral yollarının bir alt hissəsini götürdüm (CONUS with CLASS = 1 - 11.803 xüsusiyyətləri), PCS_NAD_1983_CONUS_ALBERS-ə proqnozlaşdırdım və zərfdə 2 km x 2 km çoxbucaqlı şəbəkə yaratdım {-2.6m, 0.2m, + 2.4m, 3.2m} (2500x1500 hüceyrə = 3.75m çoxbucaqlı) məlumatlarınızı simulyasiya etmək üçün.

Sonra 2 km x 2 km hüceyrələrin istilik xəritəsini hazırlamaq üçün Kernel Sıxlığı istifadə etdim (0,1 dəqiqədə):

Sonra poliqonların arasından xətləri kəsdim (75.221 ayrı xətt yaratmaq üçün 10.8 dəqiqə) və çoxbucaqlı id-lər sayını yaratmaq üçün Frequency (55701 kəsişən ızgaraları təyin etmək üçün 0.2 dəqiqə) çalışdım. Buradan 'icount' mənbə xüsusiyyət sinifini python skriptlə doldurmaq daha asan idi (19.7 dəqiqə davam etdi):

idxal arcpy arcpy.env.workspace = r'D:  Temp  gis_se  overlay.gdb 'tablePath =' grid_frequency_tab 'layerPath =' grid_albers 'tableCols = ["FID_grid_albers", "tezlik"] count = 0 arcpy.da ilə. Cursor1 olaraq SearchCursor (tablePath, tableCols): kursorda 1 satır üçün: count = count + 1 whereClause = "" "{0} = {1}" "". Format ("Objectid_1", str (row1 [0])) ilə arcpy.da.UpdateCursor (layerPath, "icount", whereClause) cursor2 olaraq: cursor2-dəki row2 üçün: row2 [0] = row1 [1] cursor2.updateRow (row2) print str (count) + "features updated"

Sonra yalnız sayı sıfırdan çox olan çoxbucaqları seçmək üçün bir sorğu tərifindən istifadə etdim və nəticəni yeni bir çoxbucaqlı xüsusiyyət sinifinə (0.2 dəq) kopyaladım:

Axtarış metodunuza bir tampon məsafəsi daxil etməyinizi tövsiyə edirəm (Kernel Sıxlığı bunu asanlaşdırır), çünki çox sayda ızgara hüceyrəsi çox miqdarda üst-üstə düşməyi çətinləşdirir:

Sorğu performansını yaxşılaşdırmaq üçün in_memory xüsusiyyət sinifindən istifadə etmək və yaddaşda çoxbucaqlı id / sayma cədvəlini tərtib etmək üçün lüğətli iki DA axtarış imlecindən istifadə etmək də daxil olmaqla bir çox başqa variant mövcuddur (sonra poliqonları DA imleci ilə yeniləmək), lakin doğru yanaşmadan istifadə etsəniz, müddətin bir neçə günü çəkməsi lazım deyil.


Bu, hər bir çoxbucaqlı üçün sətirləri kəsən (bütün çoxbucaqlıların üstündə təkrarlanan), qalan sətirləri sayan və atribut cədvəlinə yazan bir Python skripti ilə bu problemlə məşğul olmağın alternativ bir yoludur.

Burada təqdim etdiyim, ətrafımda yatdığım bir kod parçasıdır və lazımınca yoxlanılmamışdır və ya tam bir skript deyil. Arcmap-da bir skript aləti kimi konfiqurasiya edilmişdir. Bir neçə dəyişən ad dəyişdirməli idim, bəlkə bir və ya ikisini qaçırmışdım.

# İstifadəçi çoxbucaqlarından giriş oxunması = arcpy.GetParameterAsText (0) lines = arcpy.GetParameterAsText (1) outcm = arcpy.GetParameterAsText (2) # Müvəqqəti FC-nin tempLines = arcpy.CreateFeatureclass_managines ('in_mYY,' " , satır) mem_polygons = "in_memory  mem_polygons" arcpy.CopyFeatures_management (çoxbucaqlar, mem_polygons) # Hər 50 000 çoxbucaqlı üçün giriş faylını klip çəkin və bir dəfəyə bir parça işləyin cursorFields = ('SHAPE @', 'LineCount',…) # Arcpy.da.UpdateCursor (mem_polygons, cursorFields) ilə hansı sahələrə ehtiyacınız olursa olsun: cmrows sırası üçün: arcpy.env.overwriteOutput = True arcpy.Clip_analysis (satırlar, sıra [0], tempLines) arcpy.env.overwriteOput = Yanlış ## Ehtiyacınız olan hər hansı bir hesablamanı edin, məsələn. tempLines-də sətirləri saymaq ... ## LineCount sahə sətirinə yazın [1] = # sayınız dəyişən cmrows.updateRow (sıra) arcpy.CopyFeatures_management (mem_polygons, outcm)

İsteğe bağlı olaraq yalnız on min poliqonda və ya hər birində bir nəticə çıxarmaq üçün fayllar yarada bilərsiniz. Bu, daha asan toplu işlənməyə imkan verəcəkdir. 32 GB RAM ilə in_memory-space ilə çox sayda çoxbucaqlı emal etməlisiniz. Bununla yanaşı, yaddaş problemi yaranarsa, bu yazını adi bir shapefile və ya gdb-yə də verə bilərsiniz.


@Vince və @Martin kimi, hər çoxbucaqlı hüceyrənin neçə sətirlə kəsişdiyini görmək istəyirsənsə:

  1. Xətləri poliqon sərhədinə görə kəsmək üçün Xüsusiyyətdən istifadə edin, sonra çoxbucağa aid olan sətirləri silin (hər ikisi də çıxışda olduqları üçün), beləliklə yalnız polyline FC-yə aid sətirlər var.
  2. İlə cədvəl kəsişməsindən istifadə edin saymaq hər poliqon hüceyrənin içərisinə neçə "kəsilmiş" xətt düşdüyünü ümumiləşdirmək üçün seçim.


Videoya baxın: Whatsapp ilə övladınızın olduğu yeri öyrənmək, məkanın təyin olunması, izlənilməsi (Oktyabr 2021).