Daha çox

ArcGIS-də çoxsaylı rastrlarda yerləşdirilmiş şərti ifadə


ArcGIS-də rastrların siyahısı var və siyahının bütün rasterlərinə əsaslanan şərti (Con) iç içə bir bəyanat yaratmaq istəyirəm. Bunun bir çox siyahılar vasitəsilə təkrarlanmasını istəyirəm (siyahıdakı rasterlərin sayı dəyişə bilər). İndiyə qədər bir simli düzəldən və sonra simli exec funksiyasına ötürən zərif olmayan bir yol tapdım, amma exec istifadəsinin çox cəsarətli olduğunu oxudum. Bunu etmək üçün hər hansı bir ağıllı yol varmı?

listRst = arcpy.ListRasters ("*", "TIF") initString = "outCon =" listRst-dəki rst üçün: rstString = "Con ((Raster (" "+ rst +"  ")> 0) & (Raster (  "" + rst + "") <367), 1, "initString = initString + rstString conString = initString +" 0 "+") "* len (listRst) exec (conString) outCon.Save (" ConTest.tif) ")

Siz haqlısınızexecqaşqabaqlıdır və düşünürəm ki, massivlərdən istifadə etmək üçün daha uyğun olacaqsınızsəssizraster kalkulyatorunu istifadə etməkdənsə probleminizi həll etmək.

Sonda nəticələri birləşdirmək barədə danışdığınız üçün siyahınızdakı bütün rasterlərin eyni sayda sətir və sütuna sahib olduğunu düşünürəm. Aşağıdakı nəticə verəcəkdir:

  • Rasterlərin heç birinin hücrədə 0 ilə 367 arasında qiymət olmadığı hüceyrələr üçün 1
  • Rasterlərdən ən azı 1-in hüceyrədə 0 ilə 367 arasında bir dəyəri olan hüceyrələr üçün 0

İstədiyiniz şeyin kifayət qədər olduğuna əminəm.

Kodun bu birinci hissəsi əvvəlcə ehtiyac duyduğunuz bütün dəyişənləri əldə edir:

# alt və üst dəyərləri təyin edin lower_break_value = 0 upper_break_value = 367 # raster siyahısı əldə edin, nəticələrin saxlanılması üçün out_raster_data yaratmaq üçün ilk rasterin xüsusiyyətləri list_rasters = arcpy.ListRasters ('*', "TIF") temp_raster = arcpy.Raster (list_rasters [ 0]) raster_rows = temp_raster.width raster_columns = temp_raster.height out_raster_data = numpy.ones ((raster_columns, raster_rows), numpy.int) # sualınızda yalnız tam dəyərlərə istinad edirsiniz, lakin bu dəyişdirilə bilər

Aşağıdakı bölmə, hər bir raster üçün aşağıdakıları etmək üçün siyahınızdakı rastrlarda bir döngədən istifadə edir:

  1. rasterdən bir səssiz sıra yaratmaq
  2. istifadə edinsəssiz. hər yerdəsizdən daha böyük dəyərləri təsnif etməkalt_qırılma_dedi(0)
  3. istifadə edinsəssiz. hər yerdəsizdən az olan dəyərləri təsnif etməkyuxarı_qırıq_qiymət(367). səssiz. hər yerdəyalnız bir şərti qiymətləndirə bilərik, buna görə iki ayrı bəyanata bölməliyik.
  4. nəticələnən iki massivi əlavə edinsəssiz. hər yerdəəməliyyatlar. Hər iki şərtə cavab verən hər şey 0 əlavə edəcəkdir.
  5. yaratmaqtemp_maskabütün dəyərləri 0-a bərabər olmayan True və 0-a bərabər olan False olaraq təyin edir
  6. əlavə edintemp_masksiyahıyabands_list

    list_rasters-də i üçün bands_list = []: temp_array = arcpy.RasterToNumPyArray (i) .astype (numpy.int) great_than = numpy.where (temp_array> alt_break_value, 0, temp_array) less_than = numpy.where (temp_array, upper_break, temp_array) temp_result = temp_result = temp_mask-dan az_sem = temp_result! = 0 bands_list.append (temp_mask)

Kodun son hissəsində maskalanmış massivlərin üstündən keçirikband_listvə onları artırınout_raster_databu yalnız bir sıra. 0 və 367 arasındakı hər hansı bir sıra / rasterdəki hər hansı bir hücrə bir 0-dır, buna görə digər dəyərlərlə çarpdığımız zaman 0 ilə nəticələnəcəkdirout_raster_data:

aralığında olan i üçün (0, len (bands_list)): out_raster_data * = bands_list [i] # out_raster_data-nı rasterə çevirin və nəticələri save_raster = arcpy.NumPyArrayToRaster (out_raster_data) result_raster.save (r ") # giriş çıxış yolu burada