পললাইনের জন্য পয়েন্টের পয়েন্টগুলি খুঁজে পেতে অ্যালগরিদম


22

আমি অনুচ্ছেদের পয়েন্টগুলি, যেমন পয়েন্টগুলি যেখানে একটি লাইনের বক্ররেখা শুরু এবং শেষ হয় তা সন্ধান করার চেষ্টা করছি। আপনি যদি চিত্রটির দিকে লক্ষ্য করেন তবে সবুজ রেখাটি কোনও রাস্তা বা প্রবাহ হতে পারে এবং কালো বিন্দু এমন বিন্দু যেখানে বাঁকগুলি শুরু হয় এবং শেষ হয়। এখানে চিত্র বর্ণনা লিখুন

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


উত্স ডেটা লাইন বিভাগগুলি দিয়ে তৈরি একটি পললাইন এবং আপনি এটি বক্ররেখা দ্বারা প্রাক্কলিত করতে চান, বা এর ইতিমধ্যে তোরণ খণ্ডগুলি রয়েছে?
U2ros

বর্তমানে এটি লাইন বিভাগে তৈরি।
দেবদত্ত টেংশে

1
এই প্রশ্নের উদাহরণটি উল্লেখযোগ্যভাবে দেখায় যেমনটি esri.com/news/arcuser/0110/turning.html এ প্রকাশিত হয়েছে ।
হোবার

@ হুইবার: খুব চমত্কার পর্যবেক্ষণ। চিত্রটি তৈরি করতে আমি এটি ব্যবহার করেছি the
দেবদত্ত টেংশে

উত্তর:


15

যখন বক্ররেখার রেখাংশগুলি নিয়ে গঠিত হয়, তখন se বিভাগগুলির সমস্ত অভ্যন্তরীণ পয়েন্টগুলি হ্রাস পয়েন্ট হয়, যা আকর্ষণীয় নয়। পরিবর্তে, বক্ররেখাটি se বিভাগগুলির উল্লম্ব দ্বারা অনুমিত হিসাবে বিবেচনা করা উচিত । এই বিভাগগুলির মাধ্যমে দ্বি-পার্থক্যযুক্ত বক্ররেখার বিভাজন দিয়ে আমরা পরে বক্ররেখাটি গণনা করতে পারি। দৃ inf়ভাবে বলতে গেলে একটি প্রতিচ্ছবি বিন্দু হল এমন একটি স্থান যেখানে বক্রতা শূন্য।

উদাহরণে লম্বা প্রসারিত রয়েছে যেখানে বক্রতা প্রায় শূন্য। এটি পরামর্শ দেয় যে নির্দেশিত পয়েন্টগুলি নিম্ন বক্ররেখা অঞ্চলগুলির এই প্রসারিত প্রান্তগুলির আনুমানিক হওয়া উচিত।

একটি কার্যকর অ্যালগরিদম সুতরাং শিখরগুলি স্প্লিন করবে, মধ্যবর্তী পয়েন্টগুলির একটি ঘন সেট বরাবর বক্রাকার গণনা করবে, নিকটে-শূন্য বক্রতার পরিসীমা চিহ্নিত করবে (এটি "কাছাকাছি" এর অর্থ কীটির কিছু যুক্তিসঙ্গত প্রাক্কলন ব্যবহার করে) এবং এই ব্যাপ্তির শেষ প্রান্তগুলি চিহ্নিত করবে ।

Rএই ধারণাগুলি চিত্রিত করার জন্য এখানে কোডিংয়ের কোড রয়েছে। স্থানাঙ্কের ক্রম হিসাবে প্রকাশিত একটি লাইন স্ট্রিং দিয়ে শুরু করা যাক:

xy <- matrix(c(5,20, 3,18, 2,19, 1.5,16, 5.5,9, 4.5,8, 3.5,12, 2.5,11, 3.5,3, 
               2,3, 2,6, 0,6, 2.5,-4, 4,-5, 6.5,-2, 7.5,-2.5, 7.7,-3.5, 6.5,-8), ncol=2, byrow=TRUE)

স্প্লাইন এক্স এবং ওয়াই আলাদাভাবে স্থানাঙ্ক বক্ররেখা একটি parametrization অর্জন করা। (প্যারামিটারটি কল করা হবে time))

n <- dim(xy)[1]
fx <- splinefun(1:n, xy[,1], method="natural")
fy <- splinefun(1:n, xy[,2], method="natural")

ষড়যন্ত্র এবং গণনার জন্য স্প্লাইনগুলি বিভক্ত করুন :

time <- seq(1,n,length.out=511)
uv <- sapply(time, function(t) c(fx(t), fy(t)))

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

curvature <- function(t, fx, fy) {
  # t is an argument to spline functions fx and fy.
  xp <- fx(t,1); yp <- fy(t,1)            # First derivatives
  xpp <- fx(t,2); ypp <- fy(t,2)          # Second derivatives
  v <- sqrt(xp^2 + yp^2)                  # Speed
  (xp*ypp - yp*xpp) / v^3                 # (Signed) curvature
  # (Left turns have positive curvature; right turns, negative.)
}

kappa <- abs(curvature(time, fx, fy))     # Absolute curvature of the data

আমি বক্রাকারের পরিধি অনুযায়ী শূন্য বক্রতার জন্য একটি প্রান্তিক অনুমান করার প্রস্তাব দিই । এটি অন্তত একটি ভাল সূচনা পয়েন্ট; এটি বক্রের কচ্ছপ অনুসারে সামঞ্জস্য করা উচিত (এটি দীর্ঘতরাকের জন্য বৃদ্ধি করা)। এটি পরে বক্রতা অনুসারে প্লটগুলি রঙ করার জন্য ব্যবহৃত হবে।

curvature.zero <- 2*pi / max(range(xy[,1]), range(xy[,2])) # A small threshold
i.col <- 1 + floor(127 * curvature.zero/(curvature.zero + kappa)) 
palette(terrain.colors(max(i.col)))                        # Colors

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

plot(xy, asp=1, xlab="x",ylab="y", type="n")
tmp <- sapply(2:length(kappa), function(i) lines(rbind(uv[,i-1],uv[,i]), lwd=2, col=i.col[i]))
points(t(sapply(time[diff(kappa < curvature.zero/2) != 0], 
       function(t) c(fx(t), fy(t)))), pch=19, col="Black")
points(xy)

চক্রান্ত

খোলার পয়েন্টগুলি মূল সূক্ষ্মগুলি xyএবং কালো বিন্দুগুলি স্বয়ংক্রিয়ভাবে এই অ্যালগরিদমের সাথে চিহ্নিত হয়ে যায় lection কার্ভটি কার্ভের শেষ পয়েন্টগুলিতে নির্ভরযোগ্যভাবে গণনা করা যায় না, এই পয়েন্টগুলি বিশেষভাবে চিহ্নিত করা হয়নি।


সম্ভবত আমি যে পরিভাষাটি ব্যবহার করেছি তা ভুল ছিল। আপনি যা অনুমান করেছিলেন তা হ'ল আমি যা চেয়েছিলাম। আপনার উত্তরটি আশাব্যঞ্জক বলে মনে হচ্ছে এবং আমার শেপফিলটি প্রক্রিয়া করার জন্য আমাকে আর এর সাথে কাজ করতে হবে।
দেবদত্ত টেংশে

3

আপনি ডেনসাইফ সরঞ্জামটি ব্যবহার করতে পারেন । এই ক্ষেত্রে, আপনি কোণ দ্বারা ঘনকরণ করা চয়ন করেন, এরপরে, একটি সরলরেখায় সর্বাধিক কোণটি গৃহীত চয়ন করুন। তারপরে শিখরগুলিতে সরঞ্জাম স্প্লিট লাইনে ফলাফল রেখায় প্রয়োগ করুন । অবশেষে, ন্যূনতম রাস্তার দৈর্ঘ্যের চেয়ে আকৃতি_ দৈর্ঘ্যযুক্ত রেখাগুলি মুছুন।

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

এই ছবিতে আমরা তিনটি ধাপ দেখছি:

1- কোণ ব্যবহার করে লাইনটি ঘন করুন। আমি প্যারামিটার হিসাবে 10 ডিগ্রি ব্যবহার করেছি এবং আমরা স্প্লিটলাইন ব্যবহার করেছি। ছবিতে, বাঁকা রেখাটি প্রাথমিক পর্যায়ে রয়েছে।

arcpy.Densify_edit("line" , "ANGLE" , "","",10)
arcpy.SplitLine_management("line" , "line_split")

2- সেগমেন্টগুলি নির্বাচন করুন যেখানে আকৃতি_ দৈর্ঘ্য অপ্রয়োজনীয় নয়। যেমনটি আমরা টেবিলটিতে দেখছি, আমি সেই অপ্রয়োজনীয় দৈর্ঘ্যগুলি নির্বাচন করি নি। তারপরে, আমি তাদের একটি নতুন বৈশিষ্ট্য শ্রেণিতে নির্বাচন করি।

arcpy.Select_analysis("line_split" , "line_split_selected")

3- আমরা রেখার প্রান্তগুলিতে অবস্থিত শিখরগুলি বের করেছি, যা প্রতিফলন বিন্দু।

arcpy.FeatureVerticesToPoints_management("line_split_selected" , "line_split_pnt" , "DANGLE")

আপনার অন্যান্য উত্তর সম্পর্কে আমার একই মতামত এবং প্রশ্ন রয়েছে: এটি একটি দুর্দান্ত ধারণা, তবে একই সাথে এটি স্পষ্ট নয় যে এটি পছন্দসই ফলাফলটি বয়ে আনবে, বা কীভাবে প্রান্তিক কোণটি বেছে নেওয়া উচিত। আপনি কি আউটপুটটির একটি চিত্র সরবরাহ করতে পারেন যাতে পাঠকরা মূল্যায়ন করতে পারেন যে এই প্রস্তাবটি আসলে কী করে? সমাধানের অংশ হিসাবে ESRI সফ্টওয়্যারটি সুপারিশ করার সময় কাজের উদাহরণগুলি সরবরাহ করা বিশেষত গুরুত্বপূর্ণ, কারণ তাদের অ্যালগোরিদমগুলি সাধারণত নথিভুক্ত হয় না, তারা ঠিক কী করছে তা জানা অসম্ভব করে তোলে।
whuber

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

আমরা তাদের ধারণার নাম রাখতে পারব এবং উত্তরগুলি না
জিওজেক

1
আপনি কি আমাকে তাদের মন্তব্যে স্থানান্তরিত করতে চান? বিটিডাব্লু, আপনি যদি পরীক্ষার জন্য ডেটা চান, আপনি - প্রথমদিকে - আমার উত্তরটিতে পোস্ট করা স্থানাঙ্কগুলি ব্যবহার করতে পারেন, কারণ তারা প্রশ্নের বর্ণনার সাথে সম্পর্কিত। তবে কেন আপনি যে কোনও ভৌগলিক ডেটা ব্যবহার করেছেন তা ব্যবহার করবেন না?
whuber

2
হ্যাঁ সত্যিই এই সমাধানটি কেবল সোজা লাইনগুলি নিষ্কাশন করতে আরও ভাল কাজ করছে।
জিওজেক

1

আপনি জেনারালাইজ সরঞ্জামটি ব্যবহার করতে পারেন যা প্যারামিটার হিসাবে মূল লাইন থেকে সর্বাধিক অফসেট রয়েছে, তাই আপনি অফসেটটি চয়ন করতে পারেন যা আপনার ক্ষেত্রে উপযুক্ত।

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

যদি আমরা মূল রেখাকে "লাইন_কুর" এবং সাধারণকরণের একটি "লাইন_জেন" নামকরণ করি তবে আমরা "লাইন_কেন" দ্বারা "লাইন_জেন" ক্লিপ করতে পারি। ফলাফলটি "লাইন_কুর" এর সরল বিভাগে থাকবে। তারপরে আমরা স্কেল কোয়েরি দিয়ে মুছে ফেলা কিছু অতি স্বল্প বিভাগকে পরিষ্কার করতে পারি যা নূন্যতম রাস্তার দৈর্ঘ্যের চেয়ে বেশি আকারের দৈর্ঘ্য নির্বাচন করে।


এটি একটি দুর্দান্ত ধারণা। বাস্তবে এটি কতটা ভাল কাজ করবে তা পরিষ্কার নয়। আপনি সম্ভবত পাওয়া যায় যে প্রতিচ্ছবি পয়েন্টগুলি দেখিয়ে একটি উদাহরণ দেখাতে পারেন?
হোবার

আমি কোনও ছবি অন্তর্ভুক্ত করার জন্য একটি সম্পাদনা করেছি, ছবিটি ব্যাখ্যা করে যে কীভাবে এই সরঞ্জামটি সরল খণ্ডগুলি দিয়ে একটি রেখা তৈরি করতে পারে, তাই আমাদের পুরানো লাইনে একটি ক্লিপ তৈরি করতে হবে, কেবল পুরানো সরল রেখার অংশগুলি বের করতে হবে
জিওজেক

আপনার প্রশ্নের উত্তর দেওয়ার জন্য আমি কি উপলব্ধ তা স্পষ্ট নয়?
জিওজেক

দৃষ্টান্তে চিহ্নিত কোন প্রতিবিম্ব পয়েন্ট আমি দেখতে পাচ্ছি না। তারা ঠিক কোথায় হবে? এবং কীভাবে একজনকে সাধারণীকরণের জন্য সহনশীলতা বেছে নেওয়া উচিত?
হোবার

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