Daha çox

GDAL ilə vektor məlumatlarından raster plitələr - əsərləri yüngülləşdirmədən necə qorunmaq olar?


Prekretlər

Bir Shapefile-də vektor məlumatlarım varN47E007_CONTOURS.shpilə istehsal olunur

wget -O N47E007.zip http://e4ftl01.cr.usgs.gov/SRTM/SRTMGL1.003/2000.02.11/N47E007.SRTMGL1.hgt.zip unzip N47E007.zip # WGS 84-dən Web Mercator'a çevir GeoTIFF-ə gdalwarp -s_srs EPSG: 4326 N47E007.hgt  -t_srs EPSG: 3785 N47E007_WebMercator.tif  -co "COMPRESS = LZW"-GTiff -r bilinear # Hesablayın kontur vektoru məlumatları gdal_contour -a elev -7F-7 N-7 .shp

(Bir yamağa əsaslanan kontur xətləri (N47E007) NASA SRTM yüksəklik məlumatları.)

Proses

Buradan, əvvəlcə Shapefile-dən vektor məlumatlarını rasterləşdirərək broşurada istifadə olunmaq üçün TMS / WMTS plitələrini yaradıram.gdal_rasterizevə sonra döşəməyə qoyungdal2tiles.py. Hər zoom səviyyəsinə görə hər iki addımı təkrarlayıram, buna görə də daha yüksək zoom səviyyələri üçün daha böyük bir rasterə rastlaşa bilərəm ki, xətlərin hər birində eyni ekran qalınlığı olsun:

$! (seq 1 15) 'dəki z üçün #! / bin / sh do gdal_rasterize  --config GDAL_CACHEMAX 1024  -ts $ (calc "2851 << ($ {z} - 12)")  $ (calc "4220 < <($ {z} - 12) ")  -ot bayt -of GTiff -co KOMPRESS = DEFLATE -co PREDICTOR = 2 -co ZLEVEL = 9  -ot Bayt -burn 0 -a_nodata 255  -l N47E007_CONTOURS N47E007_CONTOURS.shp N47E007_CONTOURS_rasterized_z $ {z} .tif gdal2tiles.py  -r yaxın -z $ {z} -a 255,255,255  -e N47E007_CONTOURS_rasterized_z $ {z} .tif  N47E007_contours_tiled done

Çözünürlüyü zoomelevel səviyyəsinə uyğunlaşdırmaq

(Daha böyük zoom səviyyələrində kontur xəttlərinin qalınlığı ilə bağlı problemə cavabıma da baxın.)

calc "2851 << ($ {z} - 12)"calc "4220 << ($ {z} - 12)"rasterləşdirmək üçün görüntünün ölçüsünü hesablamaq (N47E007_CONTOURS_rasterized_z $ {z} .tif) zoomel səviyyəsindən asılı olaraq$ z.

<<ikili sola keçid operatorudur, buna görə bu 2851⋅2-ə çevrilir z-12 və 4220⋅2 z-12. Bu o deməkdir ki

  • zoomlevel 12 üçün, orta raster görüntüsüN47E007_CONTOURS_rasterized_z12.tif2851 × 4220 piksel olacaq,
  • zoom səviyyəsi 13 (N47E007_CONTOURS_rasterized_z13.tif) hər istiqamətdə iki dəfə (5702 × 8440) və
  • zoom səviyyəsi 11 (N47E007_CONTOURS_rasterized_z11.tif) zum səviyyəsinin 12-nin yarısı, yəni 1425 × 2110.

Qeyri-dəqiq parametrləşdirmə

Nömrələr28514220(zoomelevel 12 ölçüsü) təxmin edilir və ya ekranda ölçülür və ya başqa bir şəkildə qeyri-dəqiq şəkildə əldə edilir.

Problem

Yaranan plitələr ara (düzəldilmiş) rasterləşdirilmiş şəkillərdə görünməyən bəzi əsərləri göstərir:

  • cüt eni seqmentləri,
    məs.13/4270 / 5331.png "> vs

  • xətlərdəki boşluqlar,
    məs. arasında kafel kənarında

    14/8536 / 10665.png ">

    -dan müvafiq çıxarışN47E007_CONTOURS_rasterized_z14.tifmüqayisə üçün:

Mən keçsəm-r yaxın(buna görə rasterizasiya standart yenidən seçmə rejimindən istifadə edir 'orta') Bunun əvəzinə xətlərin kəskin görünməsini təmin edən bəzi yuyulmuş piksellər alıram.

Mənim nəzəriyyəm

Koordinat istinad sistemləri onsuz da uyğun gəlirgdalwarpkonturları hesablamadan əvvəl addım), buna görə ümumi transformasiya / yenidən proyeksiya tələb olunmamalıdır. Lakin rasterləşdiriləcək ölçü yalnız əhatə etdiyi coğrafi ərazinin ekrandakı ölçüsünə yaxın olduğundanN47E007məlumat yaması, bəzi düzəldilmə hələ də baş verməlidirgdal2tiles.py, düzgün yerləşdirilmiş və ölçülü dikişsiz plitələr istehsal etmək.

İlə-r yaxınbu, bir növ makroskopik Moiré təsirinə səbəb olur, çünki plitələrin və ara rasterin piksel ızgaraları demək olar ki, üst-üstə düşür. (Əlavə olaraq,gdal2tiles.pyboşluqlara səbəb olan mənbə görüntüsündə ən yaxın piksel axtararkən kafel taxtalarına əks görünə bilməz.) İləorta(üçün standart-r), eyni səbəb yuyulmuş görünüşü təsirləndirir, çünki birdən çox mənbədən pikseldən alınan dəyərlər müəyyən bir çini pikselinin dəyərini almaq üçün 'qarışdırılır'.

Beləliklə, məlumat yamasının coğrafi sahəsinin ekrandakı ölçüsünü (yaxınlaşma səviyyəsindən asılı olaraq) bilsəydim və rasterləşdirmə üçün istifadə etsəm, əsərlər getməlidir.

Suallar

  • Mənim nəzəriyyəm doğrudurmu?
  • Elədirsə, dəqiqliyini necə müəyyənləşdirə bilərəm-tsüçün parametrlərgdal_rasterize(və ya alternativ olaraq-trparametrlər), beləliklə heç bir yenidən ölçmə (və ya təsirsiz yenidən dəyişmə) edilməyəcəkdirgdal2tiles.py?

Mənim nəzəriyyəm doğrudurmu?

Aşağıda göstərilən üsulla qüsursuz nəticələr əldə etdiyim üçün belə görünür.

Elədirsə, dəqiqliyini necə müəyyənləşdirə bilərəm-tsüçün parametrlərgdal_rasterize(və ya alternativ olaraq-trparametrlər), beləliklə heç bir yenidən ölçmə (və ya təsirsiz yenidən dəyişmə) edilməyəcəkdirgdal2tiles.py?

Halbukigdal2tiles.pybir əmr kimi istifadə edilməsi nəzərdə tutulur, onu bir piton modulu kimi yükləyə bilərik və ölçülü hesablamalar üçün istifadə etdiyi eyni funksiyaları istifadə edə bilərik. Beləliklə, mənə bu kiçik piton skriptini hazırladım:

__future__ idxal print_function gdal2tiles-dən sys idxal GlobalMercator def main (): lat, lon = [flos. (arg) in arg in sys.argv [1: 3]] zoom = int (sys.argv [3]) px, py = lat_lon_to_pixels (lat, lon, zoom) print (px, py) def lat_lon_to_pixels (lat, lon, zoom): gm = GlobalMercator () mx, my = gm.LatLonToMeters (lat, lon) return tuple (int (round (p)) )) p in gm.MetersToPixels üçün (mx, my, zoom)) if __name__ == '__main__': main ()

Daha sonra WGS 84 koordinatlarını istifadə edirəmgdalinfo N47E007.hgt(onları normal ifadələrlə kənarlaşdırmaq/ ^ s * Yuxarı Sağ s * ( s * (? d + .? d *), s * (? d + .? d *) )/ ^ s * Aşağı Sol s * ( s * (? d + .? d *), s * (? d + .? d *) ) /) zəng etməklat_lon_to_piksellərşimal-şərq küncündə və cənub-qərb küncündə yuxarıdakı piton skriptindən fərqləri hesabladıqdan sonra arqument olaraq istifadə edirəm-tsseçimigdal_rasterize. (Bu yalnız işləyir, çünki bu HGT faylı koordinat istinad sistemi olaraq WGS 84 və WGS 84 və WebMercator bir-birinə oxla hizalanmışdır.)


Videoya baxın: GDAL Tutorial #1: Introduction + Installation (Oktyabr 2021).