Daha çox

GDAL istifadə edərək vektor təbəqəsi ilə raster kəsmə

GDAL istifadə edərək vektor təbəqəsi ilə raster kəsmə


Osgeo quraşdırıcısını istifadə edərək GDAL quraşdırdım. Proqramlı olaraq bir vektor təbəqəsi ilə bir raster qatını necə kəsə bilərəm? Bu işdə mənə kömək edə biləcək bir GDAL API varmı? Python istifadə edirəm.


Gdal api haqqında əmin deyiləm, varvoid * GDALWarpOptions :: hCutlineWarp API təlimatında istinad edilən Çözgü Seçimlərində açıq nümunələr yoxdur. Proqramlı bir cavaba ehtiyacınız olduğuna əminsinizmi? Komut satırı yardım proqramları bunu qutudan kənarda edə bilər:

  1. yalnız maraq kəsmə sahəsi olan çoxbucaqlı bir shapefile yaradın
  2. istifadə edin ogrinfo qırpma şəklinin ölçüsünü təyin etmək
  3. istifadə edin gdal_translate forma ölçülərinə klip etmək
  4. istifadə edin gdalwarp ilə-süt xəttiparametr

2 və 3-cü addımlar optimallaşdırma üçündür, sadəcə olaraq əldə edə bilərsinizgdalwarp - xətt….

Linux əsaslı həll üçün Linfinity-dən çoxbucaqlı istifadə edərək GDAL ilə kəsmə rastersinə baxın, hamısı bir skriptə bükülmüşdür. Michael Corey-in Mapnik üçün təpələr yaratmaq təlimində başqa bir kəsik nümunəsinə də rast gəlmək olar.


Deyəsən bu mövzu həmişə geri qayıdır. Mən özüm də bilmirdim ki, GDAL> 1.8 o qədər inkişaf etmişdir ki, bu tapşırığı yerinə yetirmək üçün onsuz da sizə ədalətli bir komanda xətti işləmə qabiliyyəti verir.

Mike Toews-dan şərh olduqca faydalıdır, ancaq sadəcə misal üçün edə bilərsiniz:

gdalwarp -of GTiff -kəsit məlumatları / area_of_interest.shp -cl area_of_interest -crop_to_cutline DATA / PCE_in_gw.asc data_masked7.tiff

Bu əmri əla alt prosess modulu ilə bir python skriptinin içərisinə bağlaya bilərsiniz.

Mənim üçün həqiqətən problemli olan bir şey, mümkün qədər sadə və bir çox xarici asılılıq tələb etməyən mənada bu problemə minimal bir həll verməyim lazım idi. Joel Lawhead tərəfindən verilən təlimdə olduğu kimi Python Görüntüləmə Kitabxanasının istifadəsi səliqəlidir, amma aşağıdakı həll yolu tapdım: Numpy maskalı massivlərdən istifadə etmək.
Daha yaxşı olub olmadığını bilmirəm, amma bu (3 il əvvəl ...) ilə müqayisədə bildiyim şey idi.
Əvvəlcə orijinal rasterin içərisində etibarlı bir məlumat sahəsi yaratdım (məsələn, eyni yerdəki çıxış rasterinin ölçüsü), amma rasterin daha kiçik edilməsi fikrini bəyəndim (məsələn -crop_to_cutline), buna görə qəbul etdimdünya2PikselJoel Lawhead-dən. Budur öz həll yolum:

def RasterClipper (): craster = MaskRaster () contraster2 = 'PCE_in_gw.aux' craster.reader ("DATA /" + contraster2.replace ('aux', 'asc')) xres, yres = craster.extent [1], craster.extent [1] craster.fillrasterpoints (xres, yres) craster.getareaofinterest ("DATA / area_of_interest.shp") minX, maxX = craster.new_extent [0] -5, craster.new_extent [1] +5 minY, maxY = craster.new_extent [2] -5, craster.new_extent [3] +5 ulX, ulY = world2Pixel (craster.extent, minX, maxY) lrX, lrY = world2Pixel (craster.extent, maxX, minY) craster.getmask ( craster.corners) craster.mask = np.logical_not (craster.mask) craster.mask.resize (craster.Yrange.size, craster.Xrange.size) # AOI-nin kvadrat sərhədləri daxilindəki bütün məlumat nöqtələrini seçin, # hamısını əvəz edin NULL ilə digər nöqtələr craster.cdata = np.choose (np.flipud (craster.mask), (craster.data, -9999)) # məlumat dəstini kvadrat şəklində çoxbucaqlı ölçünün ölçüsünə uyğunlaşdırın craster.ccdata = craster.cdata [ulY: lrY, ulX: lrX] craster.writer ("ccdata2m.asc", craster.ccdata, (minX + xres * .5, maxY + yres * .5), 10,10, Flip = Fa lse) # ikinci addımda AOI # -nın sərhəd zirvələrinin içərisində olan bütün məlumat nöqtələrini yenidən seçirik # raster nöqtələrimizi yenidən müəyyənləşdirməliyik craster.xllcorner, craster.yllcorner = minX, minY craster.xurcorner, craster.yurcorner = maxX , maxY craster.fillrasterpoints (10,10) craster.getmask (craster.boundingvertices) # yalnız matplotlib.nxutils.points_in_poly craster.data = craster.ccdata craster.clip2 (new_extent_polygon = craster.boundingvertices) craster. .ma.MaskedArray (craster.data, mask = craster.mask) craster.data = np.ma.filled (craster.data, fill_value = -9999) # rasteri diskə yazın craster.writer ("ccdata2m_clipped.asc", craster.data, (minX + xres * .5, maxY + yres * .5), 10,10, Flip = False)

tam təsviri üçünsinif MaskRastervə bu metodlar, layihəmin githubuna baxın.

Bu kodu istifadə edərək hələ də GDAL istifadə etməlisiniz. Lakin plan gələcəkdə təmiz Python'dan istifadə edə bilməkdir, çünki proqramımın nəzərdə tutulan auditoriyası çox asılılıq ilə çətinlik çəkir (proqramı inkişaf etdirmək üçün Debian istifadə edirəm və müştərilər Windows 7 istifadə edir ...).


GeospatialPython'dan Joel Lawhead, yaxşı yazılmış bir dərs olan shapefile istifadə edərək Clip rasterində tam bir piton nümunəsinə malikdir. Osgeo4W-ə daxil olmayan Python Image Kitabxanasını (PIL) yükləməlisiniz (bunun üçün quraşdırma proqramının işləməsi üçün Windows qeydinə o4w python əlavə etməlisiniz).


Videoya baxın: How to install numpy, scipy and matplotlib - python