আমার কাছে রাস্তার বড় আকারের (M 70MB) আকার রয়েছে এবং এটিকে প্রতিটি ঘরের রাস্তার ঘনত্ব সহ রাস্টারে রূপান্তর করতে চাই। আদর্শভাবে আমি জিডিএল কমান্ড লাইন সরঞ্জামগুলির সাথে আর প্রয়োজনে এটি করতে চাই।
আমার প্রাথমিক পন্থাটি ছিল এই থ্রেড অনুযায়ী প্রতিটি ঘরে সরাসরি রেখাংশগুলির দৈর্ঘ্য গণনা করা । এটি পছন্দসই ফলাফল উত্পন্ন করে, তবে খনি থেকে অনেক ছোট শেফফিলের জন্যও এটি বেশ ধীর। এখানে একটি খুব সরলীকৃত উদাহরণ যার জন্য সঠিক সেল মানগুলি সুস্পষ্ট:
require(sp)
require(raster)
require(rgeos)
require(RColorBrewer)
# Create some sample lines
l1 <- Lines(Line(cbind(c(0,1),c(.25,0.25))), ID="a")
l2 <- Lines(Line(cbind(c(0.25,0.25),c(0,1))), ID="b")
sl <- SpatialLines(list(l1,l2))
# Function to calculate lengths of lines in given raster cell
lengthInCell <- function(i, r, l) {
r[i] <- 1
rpoly <- rasterToPolygons(r, na.rm=T)
lc <- crop(l, rpoly)
if (!is.null(lc)) {
return(gLength(lc))
} else {
return(0)
}
}
# Make template
rLength <- raster(extent(sl), res=0.5)
# Calculate lengths
lengths <- sapply(1:ncell(rLength), lengthInCell, rLength, sl)
rLength[] <- lengths
# Plot results
spplot(rLength, scales = list(draw=TRUE), xlab="x", ylab="y",
col.regions=colorRampPalette(brewer.pal(9, "YlOrRd")),
sp.layout=list("sp.lines", sl),
par.settings=list(fontsize=list(text=15)))
round(as.matrix(rLength),3)
#### Results
[,1] [,2]
[1,] 0.5 0.0
[2,] 1.0 0.5
দেখতে দুর্দান্ত, তবে স্কেলযোগ্য নয়! আরও কয়েকটি প্রশ্নে spatstat::density.psp()
এই কাজের জন্য কার্যটি সুপারিশ করা হয়েছে been এই ফাংশনটি কার্নেলের ঘনত্বের পদ্ধতির ব্যবহার করে। আমি এটি বাস্তবায়ন করতে সক্ষম এবং এটি উপরোক্ত পদ্ধতির চেয়ে দ্রুত বলে মনে হচ্ছে তবে পরামিতিগুলি কীভাবে চয়ন করবেন বা ফলাফলগুলি কীভাবে ব্যাখ্যা করা যায় তা সম্পর্কে আমি অস্পষ্ট। উপরের উদাহরণটি এখানে ব্যবহার করে density.psp()
:
require(spatstat)
require(maptools)
# Convert SpatialLines to psp object using maptools library
pspSl <- as.psp(sl)
# Kernel density, sigma chosen more or less arbitrarily
d <- density(pspSl, sigma=0.01, eps=0.5)
# Convert to raster
rKernDensity <- raster(d)
# Values:
round(as.matrix(rKernDensity),3)
#### Results
[,1] [,2]
[1,] 0.100 0.0
[2,] 0.201 0.1
আমি ভেবেছিলাম যে এটির ক্ষেত্রে কার্নেল পদ্ধতির ঘনত্ব গণনা করা হয়েছিল প্রতি সেলের দৈর্ঘ্যের বিপরীতে, তাই আমি রূপান্তর করেছি:
# Convert from density to length per cell for comparison
rKernLength <- rKernDensity * res(rKernDensity)[1] * res(rKernDensity)[2]
round(as.matrix(rKernLength),3)
#### Results
[,1] [,2]
[1,] 0.025 0.000
[2,] 0.050 0.025
তবে, উভয় ক্ষেত্রেই, কার্নেল পদ্ধতির উপরের আরও সরাসরি পদ্ধতির সাথে সারিবদ্ধ হওয়ার কাছাকাছি আসে কি না?
সুতরাং, আমার প্রশ্নগুলি হ'ল:
- আমি কীভাবে
density.psp
ফাংশনটির আউটপুট ব্যাখ্যা করতে পারি ? ইউনিট কি? - ফলাফলগুলি আরও প্রত্যক্ষ, স্বজ্ঞাত পদ্ধতির সাথে সারিবদ্ধভাবে কীভাবে আমি
sigma
পরামিতিটি চয়ন করতে পারিdensity.psp
? - বোনাস: কার্নেল লাইনের ঘনত্ব আসলে কী করছে? পয়েন্টগুলির জন্য এই পদ্ধতিগুলি কীভাবে কাজ করে সে সম্পর্কে আমার কিছু ধারণা রয়েছে তবে কীভাবে এটি লাইনগুলিতে প্রসারিত হবে তা দেখুন না।