برای جستجو چیزی تایپ کنید...

ابزارهای پردازش شطرنجی

ابزارهای پردازش شطرنجی

این مثال برخی از ابزارهای شطرنجی و پردازش تصویر را نشان می‌دهد که KDRM برای خودکارسازی گردش‌های کار شطرنجی ایجاد کرده است. این ابزارها برای کارهایی مانند برش دسته ای رسترها در یک منطقه مورد علاقه، نمونه برداری مجدد از رسترها به وضوح خروجی مورد نیاز، آماده سازی ورودی های شطرنجی برای تجزیه و تحلیل بعدی، و حذف مراحل پردازش دستی آهسته تکراری از جریان های کاری تحویل بزرگتر مفید هستند.

مثال‌های زیر فقط بر روی بسته‌های منبع باز پایتون تمرکز دارند. در عمل، ابزارهایی مانند این را می‌توان به‌عنوان اسکریپت‌های مستقل، کارهای پردازش برنامه‌ریزی‌شده، یا در جریان‌های کاری گسترده‌تر دسکتاپ در ArcGIS Pro یا QGIS، بسته به محیط کلاینت و نحوه کارکرد گردش کار، اجرا کرد.

این ابزارها برای چه استفاده می شوند

  • برش دسته ای DEM ها، DTM ها، و دیگر رسترها در یک منطقه مورد علاقه.
  • نمونه برداری مجدد از رسترها برای تراز کردن اندازه سلول ها برای محاسبات و مدل سازی های بعدی.
  • فیلتر کردن و اعتبارسنجی ورودی های شطرنجی قبل از تجزیه و تحلیل پایین دست.
  • خودکار کردن مراحل پردازش شطرنجی که در غیر این صورت ساعت ها کار دستی را می طلبد.
  • ساخت خطوط لوله پردازش شطرنجی قابل تکرار که می توانند در محیط های دسکتاپ، سرور یا خط فرمان اجرا شوند.

چرا ما ابزارهایی مانند این می سازیم

ما مرتباً اتوماسیون سفارشی را برای پروژه های سنگین شطرنجی ایجاد می کنیم زیرا عملکرد، تکرارپذیری و قابلیت حمل اهمیت دارد. گاهی اوقات لازم است که به عنوان یک گردش کار منبع باز خالص بدون وابستگی ArcGIS اجرا شود. در موارد دیگر، همان منطق باید در یک گردش کار ArcGIS Pro یا QGIS قرار گیرد تا تحلیلگران بتوانند فرآیند را در یک محیط دسکتاپ آشنا اجرا کنند. رویکرد اساسی یکسان است: قطعات تکراری را خودکار کنید، منطق را شفاف نگه دارید، و گردش کار را برای اجرای مجدد و پشتیبانی آسان تر کنید.

نمونه برش زیر برای گردش کاری ایجاد شد که در آن برش دسته ای رسترها با رویکرد دسکتاپ سنتی بسیار کند بود. بازنویسی فرآیند با بسته‌های منبع باز پایتون، گردش کار را برای مجموعه‌های شطرنجی بزرگ‌تر به‌طور چشمگیری سریع‌تر و کاربردی‌تر کرد. مثال نمونه‌گیری مجدد به دلیل مشابهی ساخته شد، جایی که مجموعه داده‌های شطرنجی بزرگ باید با اندازه سلول خروجی دقیق‌تر تراز شوند تا محاسبات شطرنجی بعدی بتوانند با وضوح مورد نیاز اجرا شوند.

مثال 1. برش دسته ای رسترها با پایتون منبع باز

import json
import numpy as np
import os
import rasterio
import shutil

from rasterio.mask import mask
from shapely.geometry import shape
# the input and output directories for the rasters
input_directory = "input"
output_directory = "output"

# delete and recreate the output directory
if(os.path.exists(output_directory)):
    shutil.rmtree(output_directory)

os.makedirs(output_directory)

feature_collection = dict()

with open('national_park.geojson', 'r') as f:
    feature_collection = json.load(f)
area_of_interest = feature_collection['features'][0]['geometry']
clip_area = shape(area_of_interest)

for file in os.listdir(input_directory):
    # filter by tif files and only files with 2019 in the name
    if file.endswith('.tif') and '2019' in file:
        print(file)

        input_raster = os.path.join(input_directory, file)
        output_raster=os.path.join(output_directory, file)
        with rasterio.open(input_raster) as src:
            try:
                out_image, out_transform = mask(src, [clip_area], crop=True)

                # Set all nodata values to -99999
                out_image[out_image == src.nodata] = -99999
                raster_intersected = not np.all(out_image == -99999)
                # Check if the clip area intersects the raster and only save the raster if the clip area intersects with it
                if raster_intersected:
                    out_meta = src.meta.copy()
                    out_meta.update(
                        {
                            "driver": "GTiff",
                            "height": out_image.shape[1],
                            "width": out_image.shape[2],
                            "transform": out_transform,
                        }
                    )
                    with rasterio.open(output_raster, "w", **out_meta) as dest:
                        dest.write(out_image)

            except Exception as err:
                if ('Input shapes do not overlap raster' not in str(err)):
                    print('### Error with {} ###'.format(input_raster))
                    print(err)
                pass

مثال 2. نمونه برداری مجدد رسترها با پایتون منبع باز

import os
from osgeo import gdal

import numpy as np
import os

# the input and output directories
input_directory = 'input/DTM'
output_directory = 'output/DTM'

if not os.path.exists(output_directory):
    os.makedirs(output_directory)
for root, dirs, files in os.walk(input_directory):
    for file in files:
        if(file.endswith('.tif')):
            input_file = os.path.join(root, file)
            output_file = os.path.join(output_directory, file)

            print(file)

            # Read the input raster file
            raster = gdal.Open(input_file)
            # Get the original cell size
            cell_size = raster.GetGeoTransform()[1]
            # print('Original cell size: {}'.format(cell_size))

            # Calculate the number of cells for the output
            num_cells = int(np.ceil(cell_size / 0.5))
            # Create the output raster file
            driver = gdal.GetDriverByName('GTiff')
            out_raster = driver.Create(output_file, raster.RasterXSize * num_cells,
                                    raster.RasterYSize * num_cells, 1,
                                    gdal.GDT_Float32)

            # Set the output raster's projection
            out_raster.SetProjection(raster.GetProjection())
            # Set the output raster's geotransform
            out_raster_geo = list(raster.GetGeoTransform())
            out_raster_geo[1] = 0.5
            out_raster_geo[5] = -0.5
            out_raster.SetGeoTransform(out_raster_geo)

            nodata = -99999

            for i in range(1, out_raster.RasterCount + 1):
                # set the nodata value of the band
                out_raster.GetRasterBand(i).SetNoDataValue(nodata)
            # Copy the input raster data to the output raster
            gdal.ReprojectImage(raster, out_raster,
                                raster.GetProjection(),
                                out_raster.GetProjection(),
                                gdal.GRA_NearestNeighbour)

            # Close the files
            out_raster = None
            raster = None

گزینه های تحویل

مثال‌های بالا عمداً ساده هستند، اما همین رویکرد را می‌توان برای گردش‌های کاری تولید بزرگ‌تر با ورود به سیستم، اعتبارسنجی، پردازش موازی، بررسی ابرداده‌ها، بسته‌بندی و ادغام در خطوط لوله تحویل GIS گسترده‌تر گسترش داد. بسته به نیاز مشتری، ما می‌توانیم این ابزارها را به‌عنوان اسکریپت‌های مستقل، ابزارهای یکپارچه دسکتاپ برای ArcGIS Pro یا QGIS، یا خدمات تولیدی به‌عنوان بخشی از یک پلتفرم داده‌های مکانی گسترده‌تر ارائه کنیم.