রাস্টার তৈরি হচ্ছে যেখানে প্রতিটি ঘর সমুদ্রের দূরত্ব রেকর্ড করে?


10

আমি 25 মিটার × 25 মিটার রেজোলিউশন সহ একটি রাস্টার তৈরি করতে চাই, যেখানে প্রতিটি ঘর ঘরের কেন্দ্র থেকে গণনা অনুসারে নিকটতম উপকূলরেখার দূরত্ব ধারণ করে। এই কাজের জন্য, আমি আছে হয় নিউজিল্যান্ড এর উপকূলের এর shapefile

আর তে কাজ করার জন্য ডমিনিক রয়ের টিউটোরিয়ালটি অনুসরণ করার চেষ্টা করেছি যা ... ধরণের। এটি প্রায় 1 কিলোমিটার 1 কিলোমিটার রেজোলিউশনে নেমে গেছে তবে আমি যদি আরও বেশি র‌্যাম যেতে চাই তবে এটির জন্য আমার পিসিতে উপলব্ধ available 70 গিগাবাইট র‌্যাম প্রয়োজনীয়) বা আমার অ্যাক্সেস রয়েছে এমন অন্য যে কোনও পরিমাণ ছাড়িয়ে যায়। এই বলে, আমি মনে করি এটি আর এর একটি সীমাবদ্ধতা এবং আমি সন্দেহ করি যে কিউজিআইএস এর এই রাস্টারটি তৈরি করার আরও গণ্যতামূলক দক্ষ উপায় থাকতে পারে তবে আমি এটিতে নতুন এবং এটি কীভাবে করব তা আমি যথেষ্ট অনুমান করতে পারি না।

আমি কিউজিআইএস ব্যবহার করে বৈশিষ্ট্যটির দূরত্ব সহ রাস্টার তৈরি করার চেষ্টা করেছি? কিউজিআইএস এ এটি তৈরি করতে কিন্তু এটি এই ত্রুটিটি ফিরিয়ে দেয়:

_कोर.কিউজ প্রসেসিং এক্সেপশন: ইনপুট-এর জন্য উত্স স্তর লোড করা যায়নি: সি: / / / উপকূলরেখা / এনজেড-কোস্টলাইনস-ও-দ্বীপপুঞ্জ-বহুভুজ-টোপো -150k.shp পাওয়া যায়নি

এবং আমি নিশ্চিত না কেন।

ভুলের কারণ হতে পারে বা এটি করার বিকল্প পদ্ধতিতে কারও কি কোনও পরামর্শ রয়েছে?

সম্পাদনা:

আমি যে রাস্টারটি তৈরির প্রত্যাশা করছি তাতে প্রায় 59684 সারি এবং 40827 কলাম থাকবে যাতে এটি লিনজ থেকে বার্ষিক পানির ঘাটতি রাস্টারের সাথে ওভারল্যাপ হয়ে যায় । উত্পাদিত রাস্টার যদি বার্ষিক পানির ঘাটতি রাস্টার থেকে বড় হয় তবে আমি এটি আরতে স্ন্যাপ করতে পারি ...

একটি জিনিস যা আমি সম্ভবত একটি সম্ভাব্য সমস্যা বলে মনে করি তা হ'ল এনজেডের উপকূলরেখার শেফফিল দ্বীপের মাঝে প্রচুর পরিমাণে সমুদ্র রয়েছে এবং আমি এই কোষগুলির জন্য উপকূলের দূরত্ব গণনা করতে আগ্রহী নই। আমি কেবলমাত্র এমন কক্ষগুলির জন্য মানগুলি গণনা করতে চাই যাতে কিছু জমির জমিতে অন্তর্ভুক্ত থাকে। এটি কীভাবে করবেন তা আমি নিশ্চিত নই বা এটি যদি আসলেই সমস্যা হয় তবে।


1
আপনি এটি করার জন্য কোনও স্ক্রিপ্ট চালাচ্ছেন? অথবা আপনি কিউজিআইএস-এ সরঞ্জামগুলি ব্যবহার করছেন? পরীক্ষা করার মতো কিছু, যদিও এটি মনে হওয়া উচিত - ফাইলটি বাস্তবে উপস্থিত রয়েছে তা যাচাই করে দেখুন যেখানে এটি আছে ... এছাড়াও আপনি যে নির্দিষ্ট ফোল্ডারে পড়তে এবং লিখতে পেরেছেন তা পরীক্ষা করে দেখুন।
কেগান অ্যালান

বর্তমানে সরঞ্জামগুলি ব্যবহার করছি তবে আমি স্ক্রিপ্টটি শিখতে বেশ আগ্রহী, কোথা থেকে শুরু করব তা নিশ্চিত নয়। আমি নিশ্চিত যে ফাইলটি উপস্থিত রয়েছে, কারণ আমি .Sp ফাইলটি QGIS এ লোড করেছি এবং এটি একটি চিত্র হিসাবে পপ আপ হয়। আমি মেশিনে প্রশাসক হওয়ায় আমারও পড়ার / লেখার অ্যাক্সেস থাকা উচিত ছিল এবং এটি আমার ড্রপবক্সে রয়েছে।
André.B

এটিকে ড্রপবক্স থেকে স্থানীয় ড্রাইভে নিয়ে যাওয়ার চেষ্টা করুন। QGIS এটিকে প্রত্যাখ্যান করে এমন পথে কোনও সমস্যা হতে পারে। আপনি যা করতে চাইছেন তা QGIS এ বেশ সহজ হওয়া উচিত। আপনি কিউজিআইএস এর কোন সংস্করণ ব্যবহার করছেন?
কেগান অ্যালান

1
ঠিক আছে, পললাইনটিকে রাস্টার হিসাবে রূপান্তর করার চেষ্টা করুন। কিউজিআইএসের প্রক্সিমিটি সরঞ্জামটির রাস্টার ইনপুট দরকার। ডিভাইসটির সহায়তা অনুসারে সেটিংসটি নিয়ে ঘুরে দেখুন: ডকস.কিগিস.আর.সি . / ২.৮ / এ / ডকস / ব্যবহারকারীর_মানুয়াল / প্রসেসিং_্যালগস / জিডিএলগ্রার / … খেয়াল করুন, এটি এখনও একটি নিবিড় প্রক্রিয়া, আমি এটি এখন মজাদার জন্য পরীক্ষা করছি এবং এটি 30 মিনিট ধরে চলছে এবং এখনও চলছে ...
কেগান অ্যালান

1
সারি এবং কলামগুলির ক্ষেত্রে আপনি কোন আকারের আউটপুট রাস্টার তৈরি করার চেষ্টা করছেন? একবার আপনি তৈরি করার পরে আপনি কি আসলেই সেই রাস্টারটির সাথে কাজ করতে সক্ষম হবেন? পুরো জিনিসটির ফাইলের আকারটি যদি সমস্যা হয় তবে আপনি কি ছোট টাইলস তৈরি করতে পারেন যা গতির জন্য ক্লাস্টার বা মেঘের সমান্তরালে কিছু করতে পারে।
স্পেসডম্যান

উত্তর:


9

সঙ্গে PyQGIS এবং GDAL পাইথন গ্রন্থাগার যে কাজ করতে খুব কঠিন নয়। ফলস্বরূপ রাস্টার তৈরি করার জন্য আপনার জিও ট্রান্সফর্ম প্যারামিটারগুলি (শীর্ষ বাম এক্স, এক্স পিক্সেল রেজোলিউশন, রোটেশন, শীর্ষ বাম y, রোটেশন, এনএস পিক্সেল রেজোলিউশন) এবং সারি এবং কলামগুলির সংখ্যা প্রয়োজন। নিকটতম উপকূলরেখার দূরত্ব গণনা করার জন্য উপকূলরেখার উপস্থাপনের জন্য এটি একটি ভেক্টর স্তর প্রয়োজনীয়।

সঙ্গে PyQGIS , সেল কেন্দ্রে প্রতিটি রাস্টার বিন্দু গণনা করা হয় এবং তটরেখা তার দূরত্ব থেকে 'closestSegmentWithContext' পদ্ধতি ব্যবহার করে মাপা হয় QgsGeometry বর্গ। জিডিএল পাইথন লাইব্রেরিটি সারি এক্স কলামগুলির অ্যারেতে এই দূরত্বের মানগুলি সহ একটি রাস্টার উত্পাদন করতে ব্যবহৃত হয়।

পয়েন্ট (397106.7689872353, 4499634.06675821) থেকে শুরু করে একটি দূরত্বের রাস্টার (25 মি × 25 মি রেজোলিউশন এবং 1000 সারি x 1000 কলাম) তৈরি করার জন্য নিম্নলিখিত কোড ব্যবহার করা হয়েছিল; মার্কিন যুক্তরাষ্ট্রের পশ্চিম উপকূলের কাছাকাছি।

from osgeo import gdal, osr
import numpy as np
from math import sqrt

registry = QgsProject.instance()

line = registry.mapLayersByName('shoreline_10N')

crs = line[0].crs()

wkt = crs.toWkt()

feats_line = [ feat for feat in line[0].getFeatures()]

pt = QgsPoint(397106.7689872353, 4499634.06675821)

xSize = 25
ySize = 25

rows = 1000
cols = 1000

raster = [ [] for i in range(cols) ]

x =   xSize/2
y = - ySize/2

for i in range(rows):
    for j in range(cols):
        point = QgsPointXY(pt.x() + x, pt.y() + y)
        tupla = feats_line[0].geometry().closestSegmentWithContext(point)
        raster[i].append(sqrt(tupla[0]))

        x += xSize
    x =  xSize/2
    y -= ySize

data = np.array(raster)

# Create gtif file 
driver = gdal.GetDriverByName("GTiff")

output_file = "/home/zeito/pyqgis_data/distance_raster.tif"

dst_ds = driver.Create(output_file, 
                       cols, 
                       rows, 
                       1, 
                       gdal.GDT_Float32)

#writting output raster
dst_ds.GetRasterBand(1).WriteArray( data )

transform = (pt.x(), xSize, 0, pt.y(), 0, -ySize)

#setting extension of output raster
# top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
dst_ds.SetGeoTransform(transform)

# setting spatial reference of output raster 
srs = osr.SpatialReference()
srs.ImportFromWkt(wkt)
dst_ds.SetProjection( srs.ExportToWkt() )

dst_ds = None

উপরের কোডটি চালানোর পরে, ফলাফলের রাস্টার কিউজিআইএস-এ লোড করা হয়েছিল এবং এটি নিম্নলিখিত চিত্রের মতো দেখায় (5 টি ক্লাস এবং স্পেকট্রাল র‌্যাম্প সহ সিউডোকোলার)। প্রজেকশনটি ইউটিএম 10 এন (ইপিএসজি: 32610)

এখানে চিত্র বর্ণনা লিখুন


এটি কোনও সমস্যা হতে পারে না তবে একটি বিষয় যা সম্পর্কে আমি একটু চিন্তিত তা হ'ল বহুভুজটি নিউজিল্যান্ড এবং এর আশেপাশের দ্বীপপুঞ্জের, যার অর্থ এটি চারপাশের সমুদ্রের একটি বিশাল পরিমাণের অন্তর্ভুক্ত। আমি কোডটি আমার মাথা পেতে চেষ্টা করছি, তবে আপনার উদাহরণ দিয়ে আমি সমুদ্রের সমস্ত কক্ষের জন্য এনএ তে মান সেট করতে সক্ষম হব? স্থলভাগের দিক থেকে সমুদ্রের দূরত্বের বিষয়ে আমি সত্যিই আগ্রহী।
André.B

যদি এই বোবা প্রশ্ন হয় তবে আগেই ক্ষমা চাইছি তবে আমি কীভাবে নিউজিল্যান্ডে একটি নতুন সূচনার পয়েন্টটি বেছে নেব যেভাবে আপনি রাজ্যগুলির জন্য সমন্বয় স্থির করেন? এছাড়াও আমি কীভাবে এটি ইপিএসজিতে রাখব: 2193?
André.B

7

চেষ্টা করার সমাধান হতে পারে:

  1. একটি গ্রিড তৈরি করুন (টাইপ করুন "পয়েন্ট", অ্যালগোরিদম "গ্রিড তৈরি করুন")
  2. "নিকটতম দ্বারা বৈশিষ্ট্য যোগ করুন" অ্যালগরিদম দিয়ে আপনার পয়েন্ট (গ্রিড) এবং আপনার লাইন (উপকূল) এর মধ্যে নিকটতম দূরত্ব গণনা করুন। সর্বাধিক 1 নিকটতম প্রতিবেশী চয়ন করতে যত্নবান হন।

উদাহরণস্বরূপ, উপকূলের দূরত্ব সহ এখন আপনার একটি নতুন পয়েন্ট স্তর থাকা উচিত এখানে চিত্র বর্ণনা লিখুন

  1. যদি প্রয়োজন হয় তবে আপনি আপনার নতুন পয়েন্ট স্তরটিকে একজন রাস্টার হিসাবে রূপান্তর করতে পারেন (অ্যালগোরিদম "রাস্টারাইজ")

এখানে চিত্র বর্ণনা লিখুন


2

কিউজিআইএস-এর মধ্যে আপনি গ্রাস প্লাগইন চেষ্টা করতে পারেন। আমি যতদূর জানি এটি আর এর চেয়ে মেমরির পরিচালনা করে, এবং আমি আশা করি যে অন্যান্য ক্ষেত্রগুলি বড় ক্ষেত্রগুলিতে ব্যর্থ হবে।

জিআরএসএস কমান্ডকে r.grow.distance বলা হয়, যা আপনি প্রসেসিং সরঞ্জামদণ্ডে খুঁজে পেতে পারেন। নোট করুন যে আপনাকে প্রথমে আপনার লাইনটিকে রাস্টারগুলিতে রূপান্তর করতে হবে।

এখানে চিত্র বর্ণনা লিখুন

আপনার ইস্যুগুলির মধ্যে একটি আউটপুটটির আকার হতে পারে, তাই আপনি কয়েকটি দরকারী তৈরি বিকল্পগুলি যুক্ত করতে পারেন (যেমন একটি টিফ ফাইলের জন্য) বিগটিফ = হ্যাঁ, টাইল্ড = হ্যাঁ, সংযোগ = এলজেডব্লিউ, প্রিডিটেক্টর = 3


আকার / গণনার সময় হ্রাস করার জন্য এমন কোনও উপায় আছে যা আমি কোনও সমুদ্র অঞ্চলকে অপসারণ করতে পারি?
André.B

তত্ত্ব অনুসারে, আপনি উপকূলরেখার পরিবর্তে যদি দেখা থেকে দূরত্বটি ব্যবহার করেন (সমস্ত একই পিক্সেল একই মান সহ, এটি একটি বহুভুজ) তবে আপনার গণনার সময় সাশ্রয় করা উচিত। রাস্টার এর সঙ্কুচিত আকার একই হওয়া উচিত, তবে সংক্ষেপণ আরও কার্যকর হবে, সুতরাং আপনার চূড়ান্ত আকারও হ্রাস করা উচিত।
Radouxju

0

আমি অন্য উপায় চেষ্টা করবে। আপনি যদি এনজেডের বহুভুজ ব্যবহার করে থাকেন তবে বহুভুজ প্রান্তগুলিকে লাইনে রূপান্তর করুন। এর পরে সীমানা থেকে প্রতি 25 মিটার দূরত্বে বাউন্ডারে বাফার তৈরি করুন (সম্ভবত সেন্টোরিড যখন থামতে হবে তখন ডিটারমেন্টে সহায়তা করতে পারে)। তারপরে বহুভুজ দিয়ে বাফারগুলি কেটে ফেলুন এবং তারপরে সেই বহুভুজকে রাস্টার হিসাবে রূপান্তর করুন। আমি নিশ্চিত না যে এটি কাজ করবে তবে অবশ্যই আপনার কম র‌্যাম লাগবে। এবং পোস্টজিআইএস দুর্দান্ত যখন আপনি পারফরম্যান্স সমস্যা আছে।

আশা করি এটি কমপক্ষে কিছুটা সাহায্য করবে :)


0

আমি মূলত আমার নিজের প্রশ্নের উত্তর দিতে যাচ্ছিলাম না তবে আমার এক সহকর্মী (যিনি এই সাইটটি ব্যবহার করেন না), আমি পরে যা করছি তা করতে আমাকে একগুচ্ছ পাইথন কোড লিখেছিলেন; কেবলমাত্র স্থল কোষগুলির জন্য উপকূলের দূরত্বের জন্য কোষগুলিকে সীমাবদ্ধ করা এবং সমুদ্র ভিত্তিক কোষগুলিকে এনএ হিসাবে ছেড়ে দেওয়া সহ। নিম্নলিখিত কোডটি যে কোনও পাইথন কনসোল থেকে চালাতে সক্ষম হওয়া উচিত, কেবলমাত্র পরিবর্তনের জন্য প্রয়োজনীয় জিনিসগুলি:

1) স্ক্রিপ্ট ফাইলটি আগ্রহের আকারের ফাইলের মতো একই ফোল্ডারে রাখুন;

২) পাইথন স্ক্রিপ্টে শেপফিলের নাম পরিবর্তন করুন আপনার শেপফিলের নাম যাই হোক না কেন;

3) পছন্দসই রেজোলিউশন সেট করুন, এবং;

4) অন্যান্য রেস্টারদের সাথে মেলে সীমা পরিবর্তন করুন।

আমি যা ব্যবহার করছি তার থেকে বড় আকারের ফাইলগুলি বড় পরিমাণে র‍্যামের প্রয়োজন হবে তবে অন্যথায় স্ক্রিপ্টটি দ্রুত চালানো হয় (50 মিটার রেজোলিউশন রাস্টার উত্পাদন করতে প্রায় তিন মিনিট এবং 25 মিটার রেজোলিউশন রাস্টারটির জন্য দশ মিনিট)।

#------------------------------------------------------------------------------

from osgeo import gdal, ogr
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
import time

startTime = time.perf_counter()

#------------------------------------------------------------------------------

# Define spatial footprint for new raster
cellSize = 50 # ANDRE CHANGE THIS!!
noData = -9999
xMin, xMax, yMin, yMax = [1089000, 2092000, 4747000, 6224000]
nCol = int((xMax - xMin) / cellSize)
nRow = int((yMax - yMin) / cellSize)
gdal.AllRegister()
rasterDriver = gdal.GetDriverByName('GTiff')
NZTM = 'PROJCS["NZGD2000 / New Zealand Transverse Mercator 2000",GEOGCS["NZGD2000",DATUM["New_Zealand_Geodetic_Datum_2000",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6167"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4167"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",173],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",1600000],PARAMETER["false_northing",10000000],AUTHORITY["EPSG","2193"],AXIS["Easting",EAST],AXIS["Northing",NORTH]]'

#------------------------------------------------------------------------------ 

inFile = "new_zealand.shp" # CHANGE THIS!!

# Import vector file and extract information
vectorData = ogr.Open(inFile)
vectorLayer = vectorData.GetLayer()
vectorSRS = vectorLayer.GetSpatialRef()
x_min, x_max, y_min, y_max = vectorLayer.GetExtent()

# Create raster file and write information
rasterFile = 'nz.tif'
rasterData = rasterDriver.Create(rasterFile, nCol, nRow, 1, gdal.GDT_Int32, options=['COMPRESS=LZW'])
rasterData.SetGeoTransform((xMin, cellSize, 0, yMax, 0, -cellSize))
rasterData.SetProjection(vectorSRS.ExportToWkt())
band = rasterData.GetRasterBand(1)
band.WriteArray(np.zeros((nRow, nCol)))
band.SetNoDataValue(noData)
gdal.RasterizeLayer(rasterData, [1], vectorLayer, burn_values=[1])
array = band.ReadAsArray()
del(rasterData)

#------------------------------------------------------------------------------

distance = ndimage.distance_transform_edt(array)
distance = distance * cellSize
np.place(distance, array==0, noData)

# Create raster file and write information
rasterFile = 'nz-coast-distance.tif'
rasterData = rasterDriver.Create(rasterFile, nCol, nRow, 1, gdal.GDT_Float32, options=['COMPRESS=LZW'])
rasterData.SetGeoTransform((xMin, cellSize, 0, yMax, 0, -cellSize))
rasterData.SetProjection(vectorSRS.ExportToWkt())
band = rasterData.GetRasterBand(1)
band.WriteArray(distance)
band.SetNoDataValue(noData)
del(rasterData)

#------------------------------------------------------------------------------

endTime = time.perf_counter()

processTime = endTime - startTime

print(processTime)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.