Window Functions

نمایش تصاویر (رستر) با استفاده از GDAL و Openlayers

در این یادداشت یک روش ساده برای نمایش تصویر یا رستر بر روی یک نقشه تحت وب با استفاده از GDAL و Openlayers توضیح داده می شود.

سیستم اطلاعات جغرافیایی, سامانه اطلاعات جغرافیایی,سامانه اطلاعات مکانی, نرم افزار, ژئوپرتال, GIS, WebGIS, Web-GIS,Software, GIS-Software, Geoportal, Mobile-GIS, Openlayers, GeoTIFF, GDAL,Raster, Toturial

مرسوم ترین فرمت فایل های تصویری یا رستری مورد استفاده در GIS فرمت GeoTIFF است. در صورت وجود تصاویر ژئورفرنس شده در فرمت های دیگر، می توانید ابتدا این تصاویر را به فرمت GeoTIFF تبدیل کنید. برای تبدیل فرمت می توانید از دستور gdal_translate استفاده کنید.
با استفاده از کتابخانه Openlayers می توانید تصاویر ژئورفرنس با فرمت GeoTIFF را به صورت یک لایه بر روی نقشه اضافه کنید. با توجه به این که برای نمایش یک فایل، ابتدا باید فایل به صورت کامل توسط مرورگر دانلود شود و سپس توسط کتابخانه های مورد استفاده پردازش و ترسیم شود، نمایش فایل های حجیم عملا غیر ممکن است. برای رفع این مشکل راه حل های مختلفی وجود دارد که یکی از جدیدترین راه حل ها استفاده از قابلیت HTTP GET range requests در مرورگرهای مدرن است. توسط این قابلیت مرورگر می تواند فقط بخشی از فایل را که نیاز دارد دانلود کند. بر پایه این قابلیت، فرمت COG که مخفف Cloud Optimized GeoTIFF توسعه داده شده است. با استفاده از این فرمت کتابخانه های مختلف می توانند به صورت بهینه داده های مورد نیاز برای ترسیم تصویر را دانلود کنند. برای تبدیل یک فایل GeoTIFF به فرمت COG می توانید از برنامه gdal_translate از مجموعه GDAL استفاده کنید. بهتر است قبل از تبدیل فایل GeoTIFF، با استفاده از برنامه gdaladdo هرم تصاویر یا تصاویر Overview را نیز برای سطوح مورد نیاز به GeoTIFF اضافه کنید. در کد زیر نمونه اجرای دستورات مورد نیاز برای تبدیل یک فایل نمونه با نام hillshade_4326.tif نمایش داده شده است:


gdaladdo -r average hillshade_4326.tif
gdal_translate hillshade_4326.tif hillshade_4326_cog.tif -co TILED=YES -co COPY_SRC_OVERVIEWS=YES -co COMPRESS=DEFLATE

به صورت زیر می توانیم با ارجاع به آدرس فایل GeoTIFF مستقیما از آن در نقشه Openlayers استفاده کنیم:

var geotiffSource= new ol.source.GeoTIFF({
    sources:[{
        url: '/data/raster/hillshade_4326_cog.tif'
        }]
    });
var rasterTileLayer=new ol.layer.WebGLTile({
            source: geotiffSource
    });
var map = new ol.Map({
     layers: [
          new ol.layer.Tile({
              source: new ol.source.OSM({
                  maxZoom: 18
              })
          }),
         rasterTileLayer
     ],
     target: 'map1',
     view: new ol.View({
         center: ol.proj.fromLonLat([53, 33]),
         maxZoom: 18,
         zoom: 5
     })
  // view: geotiffSource.getView()
 }); 

نمایش GeoTIFF

استفاده از فرمت COG با وجود سادگی ممکن از در بعضی کتابخانه های نقشه پشتیبانی نشود. علاوه بر این در مورد تصاویر پوششی حجیم به دلیل حجم زیاد خود ایندکس تایل ها ممکن است زمان بارگذاری زیاد شود. به همین دلیل در ادامه روش های دیگر را مرور می کنیم.

استفاده از فرمت MBTiles

یک فایل با فرمت MBTiles در واقع یک دیتابیس SQLite است که کلیه تایل ها را در یک جدول به نام tiles نگهداری می کند. هر تایل براساس ستون های zoom_level، tile_column و tile_row قابل دستیابی است. برای تبدیل یک GeoTIFF یا هر رستر دیگر می توان از gdal_translate شبیه کد زیر استفاده کرد:

 gdalwarp  hillshade_4326.tif hillshade_3857.tif -t_srs  EPSG:3857 
 gdal_translate hillshade_3857.tif hillshade_3857.mbtiles -of MBTILES
 gdaladdo -r average hillshade_3857.mbtiles

بهتر است که سیستم تصویر تایل ها از ابتدا مطبق با سیستم تصویر نقشه مورد استفاده باشد. به همین دلیل در ابتدا با استفاده از دستور gdalwarp رستر مورد نظر را به سیستم تصویر نقشه (دراینجا Web Mercator) پروجکت می کنیم.
سپس با استفاده از gdal_translate فایل mbtiles را می سازیم و بعد از اون با استفاده از gdaladdo لول های مختلف هرم تصویر را به آن اضافه می کنیم.
در زیر ساختار فایل mbtiles خروجی نمایش داده شده است.

ساختار فایل mbtiles

مشکل استفاده از mbtiles این است که نیاز به یک سرویس در سمت سرور (Backend) است تا با دریافت پارامترهای سطر، ستون و سطح بزرگنمایی، تایل مورد نظر را در دیتابیس SQLite پیدا کند و برای کلاینت ارسال کند. در صورت نیاز به چنین کاری برنامه های آماده زیادی به زبان های مختلف وجود دارد که می توانید از آنها استفاده کنید.

استفاده از فرمت PMTiles

ساختار فرمت PMTiles برخلاف MBTiles نیاز به سرویس دهنده خاصی ندارد. در این ساختار جدید کلیه تایل های داده در یک فایل نگهداری می شوند و با بهره گیری از قابلیت HTTP GET range requests فقط دیتای مربوط به تایل مورد نظر برای کلاینت ارسال می شود. این فرمت اجازه می دهد که به راحتی از یک فضای ذخیره سازی ابری برای نگهداری و سرویس دهی داده های رستری شود. نرم افزار GDAL از نسخه 3.8 به بعد خواندن و نوشتن این فرمت را پشتیبانی می کند. برای استفاده از این فرمت در کتابخانه های مختلف، برنامه های لازم توسعه داده شده است.

نگهداری تایل ها به صورت فایل

راهکار دیگر مدیریت تایل های رستر، ذخیره و بازخوانی آنها در قالب فایل های مجزا است. در این روش نیازی به توسعه سرویس خاصی در سمت سرور نیست. فقط کافیست دایرکتوری حاوی فایل ها در دسترسی کلاینت باشد. برای ایجاد فایل ها می توان تایل های موجود در فایل mbtiles را با ساختار منظمی براساس شماره سطر، ستون و سطح بزرگنمایی در قالب فایل ذخیره کرد و به هنگام ارجاع در سمت کلاینت همان ساختار را برای دسترسی به آدرس فایل بازسازی کرد. برای اینکار می توانید از برنامه های موجود نیز استفاده کنید. برای نمونه با استفاده از کتابخانه mbutil می توان به شکل زیر محتویات یک فایل mbtiles را به یک فولدر استخراج کرد:


mb-util --image_format=png --scheme=xyz hillshade_3857.mbtiles hillshade_3857_zxy_tile

برای ساختن این لایه رستری در Openlayers می توان به شکل زیر عمل کرد:

var xyzTileSource = new ol.source.XYZ({
          url: '/data/rastertiles/hillshade_3857_zxy_tile/{z}/{x}/{y}.png'
      });
 
var rasterTileLayer=new ol.layer.WebGLTile({
            source: xyzTileSource,
            opacity: 0.8
          });

map.addLayer(rasterTileLayer);        

نمایش رستر