টপোলজি ধারণা গ্রহণ করা: ইনপুট জিওম 1টি অবৈধ যা আর-এ আত্ম-ছেদ করার কারণে?


24

'টপোলজি এক্সপ্লেশন: ইনপুট জিওম 1 অবৈধ' স্ব-ছেদ ত্রুটি যা অবৈধ বহুভুজ জ্যামিতি থেকে উদ্ভূত হয়েছে তা ব্যাপকভাবে আলোচিত হয়েছে। তবে আমি ওয়েবে এমন কোনও সুবিধাজনক সমাধান খুঁজে পাইনি যা সম্পূর্ণরূপে আর কার্যকারিতার উপর নির্ভর করে।

উদাহরণস্বরূপ, আমি এখানেmap("state", ...) জোশ ওব্রায়নের চমৎকার উত্তর অনুসরণ করার ফলাফল থেকে একটি 'স্প্যাটিয়ালপলিজন' অবজেক্ট তৈরি করতে সক্ষম হয়েছি ।

library(maps)
library(maptools)

map_states = map("state", fill = TRUE, plot = FALSE)

IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))

plot(spydf_states)

রাজ্যের

এই ব্যাপকভাবে প্রয়োগ করা ডেটাসেটের সমস্যাটি এখন স্ব-ছেদটি নীচে দেওয়া পয়েন্টে ঘটে।

rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Self-intersection at or near point -122.22023214285259 38.060546477866055

দুর্ভাগ্যক্রমে, এই সমস্যাটি 'স্পাইডফ_স্টেটস' এর আরও কোনও ব্যবহার প্রতিরোধ করে, যেমন কল করার সময় rgeos::gIntersection। আমি কীভাবে এই সমস্যার সমাধান করব?


1
আপনি যদি এই বিন্দুটির চারদিকে জুম করেন: plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))আপনি দেখতে পাবেন এটি সম্পর্কে কোনও "আপাতদৃষ্টিতে" নেই - একটি স্ব-ছেদ রয়েছে।
স্পেসডম্যান

উত্তর:


39

শূন্য-প্রস্থের বাফার ব্যবহার করে আর-এ অনেক টপোলজি সমস্যা পরিষ্কার করা হয়।

spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

তবে অপরিকল্পিত ল্যাট-লম্বা স্থানাঙ্কের সাথে কাজ করা rgeosসতর্কতা ছুঁড়ে দেওয়ার কারণ হতে পারে ।

এখানে একটি বর্ধিত উদাহরণ যা প্রথমে একটি অ্যালবার্স প্রক্ষেপণটিকে প্রত্যাখ্যান করে:

library(sp)
library(rgeos)

load("~/Dropbox/spydf_states.RData")

# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states, 
                            CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))

# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)

# this is a well known R / GEOS hack (usually combined with the above) to 
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)

## [1] 0

plot(spydf_states)

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


4
gBuffer"হ্যাক" কাজ করে কেন কোনও অতিরিক্ত মন্তব্য / পড়া ?
মাইকেলচিরিকো

আপনি কি জিএস্প্লিফাইটি ব্যবহার করতে চান কারণ এটি ডেটা.ফ্রেমে ভেসে যায় এবং এসপিডিএফকে স্থানিক বহুভুজের বস্তুতে রূপান্তরিত করে?
wnursal

5
আপনি যদি ব্যবহার করেন তবে sfআপনি এটিও ব্যবহার করতে পারেনsf::st_buffer(x, dist = 0)
ফিলি

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