কার্নেল ঘনত্ব ব্যবহার করে আরে রাস্তার ঘনত্ব গণনা করছেন? [বন্ধ]


13

আমার কাছে রাস্তার বড় আকারের (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

Imgur

দেখতে দুর্দান্ত, তবে স্কেলযোগ্য নয়! আরও কয়েকটি প্রশ্নে 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

তবে, উভয় ক্ষেত্রেই, কার্নেল পদ্ধতির উপরের আরও সরাসরি পদ্ধতির সাথে সারিবদ্ধ হওয়ার কাছাকাছি আসে কি না?

সুতরাং, আমার প্রশ্নগুলি হ'ল:

  1. আমি কীভাবে density.pspফাংশনটির আউটপুট ব্যাখ্যা করতে পারি ? ইউনিট কি?
  2. ফলাফলগুলি আরও প্রত্যক্ষ, স্বজ্ঞাত পদ্ধতির সাথে সারিবদ্ধভাবে কীভাবে আমি sigmaপরামিতিটি চয়ন করতে পারি density.psp?
  3. বোনাস: কার্নেল লাইনের ঘনত্ব আসলে কী করছে? পয়েন্টগুলির জন্য এই পদ্ধতিগুলি কীভাবে কাজ করে সে সম্পর্কে আমার কিছু ধারণা রয়েছে তবে কীভাবে এটি লাইনগুলিতে প্রসারিত হবে তা দেখুন না।

উত্তর:


8

আমি এই প্রশ্নটি আর-সিগ-জিও লিস্টজারসে পোস্ট করেছি এবং স্প্যাটস্যাটস লেখকদের একজন অ্যাড্রিয়ান বাড্ডেলির কাছ থেকে একটি সহায়ক উত্তর পেয়েছি । আমি উত্তরের জন্য এখানে তার প্রতিক্রিয়াটির আমার ব্যাখ্যা পোস্ট করব।

অ্যাড্রিয়ান নোট করেছেন যে ফাংশনটি spatstat::pixellate.psp()আমার কাজের সাথে আরও ভাল মিল। এই ফাংশনটি একটি লাইন সেগমেন্ট প্যাটার্নকে (বা SpatialLinesরূপান্তর সহ কোনও বস্তু) একটি পিক্সেল চিত্রতে (বা RasterLayerরূপান্তর সহ) রূপান্তরিত করে, যেখানে প্রতিটি কক্ষের মান সেই ঘরের মধ্য দিয়ে যাওয়া লাইন বিভাগগুলির দৈর্ঘ্য। ঠিক আমি যা খুঁজছি!

ফলাফলের চিত্রটির রেজোলিউশনটিকে epsপ্যারামিটার বা পরামিতি দিয়ে সংজ্ঞায়িত করা যেতে পারে dimyxযা মাত্রা (সারি এবং কলামগুলির সংখ্যা) নির্ধারণ করে।

require(sp)
require(raster)
require(maptools)
require(spatstat)

# 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))

# Convert SpatialLines to psp object using maptools library
pspSl <- as.psp(sl)
# Pixellate with resolution of 0.5, i.e. 2x2 pixels
px <- pixellate(pspSl, eps=0.5)
# This can be converted to raster as desired
rLength <- raster(px)
# Values:
round(as.matrix(rLength),3)

     [,1] [,2]
[1,]  0.5  0.0
[2,]  1.0  0.5

ফলাফলগুলি ঠিক যেমনটি পছন্দসই হয়।

অ্যাড্রিয়ান সম্পর্কে আমার প্রশ্নের উত্তর spatstat::density.psp()। তিনি ব্যাখ্যা করেন যে এই ফাংশন:

রেখার সাথে গাউসিয়ান কার্নেলের কনভোলশনটি গণনা করে। স্বজ্ঞাতভাবে, এর অর্থ এই যে density.pspলাইনগুলিকে দ্বিমাত্রিক স্থানে 'গন্ধযুক্ত' করে। এর density(L)অস্পষ্ট সংস্করণের মতো pixellate(L)। প্রকৃতপক্ষে যেখানে অন্য কোনও ফাংশন যেখানে একটি চিত্রকে ধোঁকা দেয় density(L)তার সাথে খুব মিল similar [প্যারামিটার] হ'ল গাউসীয় কার্নেলের ব্যান্ডউইথ। প্রদত্ত পিক্সেল ইউ এর মান, পিক্সেল ইউ এর চারপাশে ব্যাসার্ধ সিগমার বৃত্তের রেখার দৈর্ঘ্যের মোট পরিমাণের মতো কিছু, এটি ভিন্ন ভিন্ন বৃত্ত রেডিয়ির থেকে যেমন অবদানের একটি ভারি গড় except ইউনিটগুলি দৈর্ঘ্য ^ (- 1), প্রতি ইউনিট ক্ষেত্রের লাইন দৈর্ঘ্য। blur(pixellate(L))blurspatstatsigmadensity.psp(L)

এটি আমার কাছে কিছুটা অস্পষ্ট থেকে যায় যখন গসিয়ান কার্নেল density.psp()পদ্ধতির মধ্যে সরাসরি লাইন দৈর্ঘ্যের গণনা করার আরও স্বজ্ঞাত পদ্ধতির চেয়ে বেশি পছন্দ করা হবে pixellate()। আমি অনুমান করি যে বিশেষজ্ঞদের এটি ছেড়ে দিতে হবে।

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