আর এতিম গর্ত ঠিক করা


18

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

পলিগনকমেন্ট (পি) তৈরিতে ত্রুটি: rgeos_PolyCreateComment: অনাথ গর্ত, সূচক 17 এ গর্তের জন্য বহুভুজ সম্বলিত সন্ধান করতে পারে না

আমি এই লিঙ্কে ড্রপবক্সে একটি পুনরুত্পাদনযোগ্য উদাহরণ আপলোড করেছি ।

সমস্যাটি পুনরায় তৈরি করার কোডটি এখানে:

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

রিটার্নস:

পলিগনকমেন্ট (পি) তৈরিতে ত্রুটি: rgeos_PolyCreateComment: অনাথ গর্ত, সূচক 17 এ গর্তের জন্য বহুভুজ সম্বলিত সন্ধান করতে পারে না

এখানে এবং এখানে প্রস্তাবিত ঠিক করার চেষ্টা করা হচ্ছে :

slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)

এটি একই ত্রুটিটি দেয় যা ইউনিয়ন প্রচেষ্টা থেকে আসে তবে বিভিন্ন সূচী নম্বর সহ:

rgeos_PolyCreateComment: অনাথ গর্ত, সূচক 30 এ গর্তের জন্য বহুভুজযুক্তটি খুঁজে পাচ্ছে না

রজার বিভান্ডের সহায়ক টিউটোরিয়ালটিতে প্রস্তাবিত ঠিক করার চেষ্টা করা

fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)

উপরের মতো 30 সূচীতে একই ত্রুটি ফিরে আসে।

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

দেখা যাচ্ছে যে সময়ে সময়ে এই কোডটি কাজ করা সত্ত্বেও লোকেরা সমস্যা বজায় রাখে। কেউ কি আর এর মধ্যে সমাধান খুঁজে পেয়েছে?

আমি আর্কজিআইএসে "রিপোর জ্যামিতি" সরঞ্জামটি সম্পাদন করেছি, এবং এটি সমস্যাটি সংশোধন করেছে, তবে মনে হচ্ছে আর-তে কোনও ঠিক করা উচিত seems


আপনার ডেটা ছাড়া সমস্যাটি কোথায় তা বলা শক্ত।

@ প্যাসাল, আমি সবেমাত্র একটি ড্রপবক্স লিঙ্কটি আপলোড করেছি যাতে 10 মিমি জিপযুক্ত এবং 16 এমবি আনজিপ করা স্লিমড ডাউন শেপফিল রয়েছে যা সমস্যাটি পুনরুত্পাদন করবে। আসল 1.5 গিগাবাইট হিসাবে ডেটা কীভাবে সরবরাহ করা যায় তা আমি নিশ্চিত ছিলাম না, তবে সমস্যাটিকে একটি ছোট ফাইলে সংকীর্ণ করতে আর্কজিআইএস ব্যবহার করতে সক্ষম হয়েছি। ব্যবস্থাপনযোগ্য আকারের পুনঃজননযোগ্য উদাহরণগুলি তৈরি এবং ভাগ করার জন্য কি কোনও ভাল প্রোটোকল রয়েছে?
লুক ম্যাকোলে

আর এর সাথে বিভিন্ন পদ্ধতির চেষ্টা করা কার্যকর হয়নি। জ্যামিতিগুলি পরীক্ষা করার সময় কিগিস হিমশীতল।

উত্তর:


25

আমি সংযুক্ত ডেটাতে জ্যামিতির সমস্যাগুলি বিশ্লেষণ করেছি এবং দেখে মনে হচ্ছে এটি কেবলমাত্র নয় orphaned holesতবে রয়েছে geometry validity issues। এটি সত্য যে orphaned holeকোনওরকম জ্যামিতির বৈধতা ইস্যু, তবে রায়গোসগুলি এটিকে একইভাবে পরিচালনা করে না, অনাথ গর্তগুলির জন্য, একটি সাধারণ সতর্কতার পরিবর্তে একটি ত্রুটি উত্থাপিত হয়। আপনি ইঙ্গিত হিসাবে, তারা বহুভুজ গর্ত পরীক্ষা করার ইঙ্গিত, কিন্তু অনাথ গর্ত স্থির করার জন্য প্রয়োগ করা যখন এটি সর্বদা সফল হয় না।

সুতরাং চল:

  1. আপনার ডেটা পরিষ্কার করুন (যা আপনি ইউনিয়নের মতো জিওপ্রসেসিং করতে চাইলে প্রয়োজনীয়)

  2. আপনার ইউনিয়ন প্রক্রিয়া সহ পরিষ্কার ডেটা ব্যবহার করুন

১. জ্যামিতি ফিক্সিং জ্যামিতিগুলিকে আর এর মধ্যে পরিষ্কার করা কখনও কখনও চ্যালেঞ্জ হতে পারে, তাই আমি একটি পরীক্ষামূলক আর প্যাকেজ তৈরি করার চেষ্টা করেছি ( https://github.com/eblondel/cleangeo দেখুন ) যা spঅবজেক্টগুলি পরিষ্কার করার সুবিধার্থে (বর্তমানে সীমাবদ্ধ সীমাবদ্ধ) বহুভুজ আকার)। আপনি এই সাথে প্যাকেজটি ইনস্টল করতে পারেন:

require(devtools)
install_github("eblondel/cleangeo")
require(cleangeo)

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

#get a report of geometry validity & issues for a sp spatial object
report <- clgeo_CollectionReport(sp)
summary <- clgeo_SummaryReport(report)
issues <- report[report$valid == FALSE,]

এটির সাহায্যে আপনি দেখতে পাবেন যে আপনার ডেটাতে 2 ধরণের সমস্যা রয়েছে: orphaned holesএবং geometry validity issues। উভয়ই (এবং কেবল অনাথ গর্তই নয়) unionপ্রক্রিয়াটি ব্যর্থ হওয়ার সম্ভাবনা রয়েছে, তাই সম্ভব হলে অটোমেটিক পদ্ধতিতে ডেটা আগে পরিষ্কার করা উচিত। দ্রুত প্রজননের জন্য, নীচের প্রথম নমুনা কোডটি কেবল সন্দেহজনক হিসাবে ট্যাগ করা বৈশিষ্ট্যগুলির উপসেট গ্রহণ করে (মূল তথ্যটিতে সূচক = 9002 সহ সর্বশেষতমটি ব্যতীত - এটিতে আমার নোটটি নীচে দেখুন)

#get suspicious features (indexes)
nv <- clgeo_SuspiciousFeatures(report)
mysp <- sp[nv[-14],]

#try to clean data
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

যদি clgeo_Cleanকাজটি ভালভাবে করে তবে আপনার এখন সমস্ত জ্যামিতি বৈধ হওয়া উচিত। আপনি এটি সম্পূর্ণ ডেটাसेटটিতে প্রয়োগ করতে পারেন (বৈশিষ্ট্য সূচক = 9002 ব্যতীত)

#try to clean data
mysp <- sp[-9002,]
mysp.clean <- clgeo_Clean(mysp, print.log = TRUE)

#check if they are still errors
report.clean <- clgeo_CollectionReport(mysp.clean)
summary.clean <- clgeo_SummaryReport(report.clean)

২. ইউনিয়ন প্রক্রিয়া এখন, আসুন দেখুন unionএই ডেটাসেটে কাজ করে:

#Attempting a UnionSpatialPolygons based on the COUNTY field
mysp.df <- as(mysp, "data.frame")
countycol <- mysp.df$COUNTY
mysp.diss <- unionSpatialPolygons(mysp.clean, countycol)

নোট: আগের মত বললেন, আমি একটি বৈশিষ্ট্য (সূচক = 9002) .By এটা ষড়যন্ত্র অপসারণ করেছি: plot(sp[9002,]), আপনি যে এই বৈশিষ্ট্যটি খুব (খুব) জটিল দেখতে হবে। আমি এটিকে কেবল নমুনা থেকে বাদ দিয়েছি কারণ ছিদ্রগুলি পরীক্ষা করতে খুব বেশি সময় লাগছিল। এখনই দেখা যাক যদি ডেটা পড়ার জন্য readShapePoly(থেকে maptools) ব্যবহার করে একই সমস্যা দেখা দেয় ...

৩. পড়ার ডেটা পড়ার জন্য শেডপোলি বনাম রিড ওজিআর (আপডেট) এ স্যুইচ করুন

readOGRশেফফিলগুলি পড়ার জন্য উপলব্ধ একমাত্র ফাংশন নয়। এছাড়াও আপনি ব্যবহার করতে পারেন readShapePolyথেকে maptoolsপ্যাকেজ, প্রথম এক চেয়ে সাধারণত আরো performant:

require(maptools)
mysp <- readShapePoly("ReproducibleExample.shp")

দ্রুত চালানো ছাড়াও:

  • আপনি যদি উপরোক্ত কোডটি ভিত্তিক ব্যবহার করেন clgeo_CollectionReportতবে এতিম গর্তের কোনও সমস্যা নেই, তবে জ্যামিতির সমস্যা রয়েছে।

  • জ্যামিতিটিও পরিষ্কারভাবে clgeo_Cleanচালানো ভালভাবে চালায় এবং এখন এটি বৈশিষ্ট্য সূচী 9002 এর সাথে আটকে যায় না

  • এবং ... ইউনিয়ন প্রক্রিয়া কাজ করে।

প্লটের ফলাফল নীচে দেখুন:

#plot the result
plot(mysp, border= "lightgray")
plot(mysp.diss, border="red", add = TRUE)

ইউনিয়ন ফলাফল

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


ধন্যবাদ ইবলন্ডেল! আমি এই চেষ্টা হবে। প্যাকেজ বিকাশের জন্য ধন্যবাদ!
লুক ম্যাকোলে

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

কি দারুন. খুব চিত্তাকর্ষক প্যাকেজ। সেটা অবশ্যই অনেক কাজ হয়ে গেছে।
নোটোগ্রাফগুলি

3
আপনার মতামতের জন্য @ নোগ্রাফদের ধন্যবাদ এই সমস্যাটি পোস্ট করার সময় আমি স্ক্র্যাচ থেকে এই প্যাকেজটি তৈরি করেছি, কারণ জ্যামিতিগুলি পরিষ্কার করা সবসময় সহজ কাজ নয়। আপনি যদি গিথুব এ থাকেন তবে আমি আপনার 'তারকা' :-) কে স্বাগত জানাব, ভবিষ্যতে প্যাকেজটি আরও উন্নত করতে চাই এবং সম্ভবত এটি CRAN এ প্রকাশ করব।
eblondel

7
কেবল আপনাকে জানাতেই ক্লিনজিও CRAN ( cran.r-project.org/package=cleangeo ) এ প্রকাশিত হয়েছে , যে সমস্ত লোকেরা এটি ব্যবহার করে, গিথুবে বর্ধিতকরণের অনুরোধ বা বাগগুলি নির্দ্বিধায় জানাতে নির্দ্বিধায়
eblondel

1

আরে আমার জন্য কাজ করে এমন একটি সুবিধাজনক সমাধান হ'ল শূন্য-প্রস্থের বাফার প্রয়োগ করা :

#loading required packages
require(sp)    
require(rgdal)
require(maptools)
require(rgeos)

#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")

#project your data (I'm using California Albers here) and apply a zero-width buffer
example <- spTransform(example, CRS("+init=epsg:3310"))
example <- gBuffer(example, byid = T, width = 0)

#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)

ইউনিয়নস্পটিয়ালপলিগনস এই ডেটা সেটটির সাথে কিছুটা সময় নেয় তবে মনে হয় ঠিক ঠিক কাজ করে।

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