एसएफ ऑब्जेक्ट के बहुभुज को सरल बनाएं


14

मैं sfअंतराल और slivers की शुरुआत के बिना एक बहुभुज को कैसे सरल करूं ?

एक आकृति के साथ, उदाहरण के लिए, मैं उपयोग करूंगा rmapshaper::ms_simplify():

library("pryr")
library("rgdal")
library("rmapshaper")

download.file("https://borders.ukdataservice.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip",
              destfile = "regions.zip")
unzip("regions.zip")
regions <- readOGR(".", "england_gor_2011")
object_size(regions)
# ~13MB

regions <- ms_simplify(regions)
object_size(regions)
# < 1MB

मैंने कोशिश की है sf::st_cast(), जो मैन पेजों से, राज्यों:

एक अन्य प्रकार के लिए ज्यामिति कास्ट करें: या तो सरलीकृत करें, या स्पष्ट रूप से डालें

तथा:

तर्क के लिए: चरित्र; लक्ष्य प्रकार, यदि अनुपस्थित है, तो सरलीकरण की कोशिश की जाती है; जब x प्रकार sfg (यानी, एक एकल ज्यामिति) होता है, तो निर्दिष्ट करने की आवश्यकता होती है।

जब मैंने toलापता होने के रूप में छोड़ दिया तो यह उम्मीद के मुताबिक काम नहीं किया (मुझे पता था कि यह सच होना बहुत अच्छा था!)।

library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB

regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB

वर्तमान में मैं फ़ाइल को खोल रहा हूं rgdal::readOGR(), इसे सरल कर रहा हूं , इसे सहेज रहा हूं , फिर इसे फिर से लोड कर रहा हूं sf

क्या कोई बेहतर तरीका है?


rgeos::gSimplify()

rgeos::gSimplify()निम्नलिखित तर्कों के साथ निर्दिष्ट किए जाने पर @sk का सुझाव टोपोलॉजिकल-अवगत सरलीकरण (अर्थात सरलीकृत किए बिना सरल बनाता है) कर सकता है:

library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)

gSimplify@dataहालाँकि, फ्रेम को संरक्षित नहीं करता है , इसलिए हमें इसे फिर से बनाना चाहिए:

regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)

और इसका परिणाम वास्तव में एक छोटे फ़ाइल आकार में होता है ( tolइसे छोटा करने के लिए तर्क को छोटा किया जा सकता है) और मैंने इसकी पुष्टि की कि क्यूजीआईएस में इसकी जांच करके कोई स्लिवर्स नहीं बनाया गया है।

object_size(regions_gSimplify)
# ~8MB

इसलिए यद्यपि यह मेरे लिए एक वैध विकल्प है, फिर rmapshaper::ms_simplify()भी यह समस्या है, अर्थात इसके साथ काम नहीं करता है sf:

regions_sf <- sf::read_sf("england_gor_2011.shp")
object_size(regions_sf)

regions_gSimplify <- gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05)
# Error in gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05) : 
# no slot of name "proj4string" for this object of class "sf"

@obrl_soil का उत्तर भी लागू किया जा सकता है gSimplify(), बस के स्थान पर इसका उपयोग करें ms_simplify()


1
क्या आपके पास डगलस-प्यूकर एल्गोरिथ्म तक कोई पहुंच है? यह जीआईएस दुनिया में सुविधाओं के सरलीकरण के लिए व्यापक रूप से जाना जाता है। stackoverflow.com/questions/17217413/… और r-bloggers.com/simplifying-spatial-polygons-in-r
sk

1
क्या ऐसा नहीं st_simplifyमाना जाता है? (इसका उपयोग नहीं किया, अभी तक)
lbusett

2
ओह, मैंने ध्यान नहीं दिया st_simplify, इसे इंगित करने के लिए धन्यवाद। मैं उस एल्गोरिथ्म को पसंद करता rmapshaper::ms_simplifyहूं, जो मैंने अब तक किए गए अन्य सभी से अधिक के लिए डिफॉल्ट करता है, लेकिन मेरे पास नए विकल्प के साथ एक नाटक होगा (अपडेट: जो कि सावधानी से आगे बढ़ता है, preserveTopology = TRUEनिश्चित रूप से अभी तक ठीक से काम नहीं करता है)
obrl_soil

1
जानकार अच्छा लगा। इस पर बग रिपोर्ट खोलने के बारे में क्या?
लब्बेट

1
@obrl_soil यह मेरे द्वारा प्रश्न ( regions) में उपयोग किए गए बहुभुजों पर लगभग 1000 तक सहिष्णुता के लिए काम करता है, लेकिन इसके अलावा यह अब टोपोलॉजी को संरक्षित नहीं करता है। चूंकि यह एक निश्चित बिंदु पर टूट जाता है, मैं कहता हूं कि इसका उद्देश्य व्यवहार नहीं है
फिल

जवाबों:


16

आप एसएफ ऑब्जेक्ट को सपा के लिए डाल सकते हैं, ऐसे पैकेज के लिए जो अभी तक एसएफ का समर्थन नहीं करते हैं - मैं इसे रास्टर / बहुभुज इंटरैक्शन के लिए एक उचित सा करता हूं। तो आप कर सकते हैं:

simplepolys <- rmapshaper::ms_simplify(input = as(sfobj, 'Spatial')) %>%
  st_as_sf()

1
इस तकनीक - एक स्थानिक वस्तु के रूप में कास्टिंग, सरलीकरण, फिर एक sfवस्तु के रूप में फिर से कास्टिंग - पूरी तरह से काम किया, और के साथ rmapshaper::ms_simplify()या इस्तेमाल किया जा सकता है rgeos::gSimplify()। सलाह के लिये धन्यवाद!
फिल

कूल कूल, बस इस बात से अवगत रहें कि इंटरलॉकिंग पॉलीगोन की टोपोलॉजी केवल rmapshaper के दृष्टिकोण के साथ संरक्षित है। यदि आपका इनपुट डेटा सभी अलग-थलग है, तो नॉन-इंटरलॉकिंग बहुभुज, आप सुरक्षित रूप से उपलब्ध सरलीकरण में से किसी का भी उपयोग कर सकते हैं।
obrl_soil

मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं क्योंकि sf::st_simplify()लेखन के समय उच्च सहिष्णुता में अधिक विहित मजबूत नहीं है, हालांकि स्पष्ट रूप से यह बदल सकता है।
फिल

8
मैं वर्तमान sfमें rmapshaper में ऑब्जेक्ट्स के लिए समर्थन पर काम कर रहा हूं । विकास संस्करण में वस्तुओं के ms_simplifyलिए उपलब्ध है sf। मैं पुराने जांचकर्ताओं अच्छा लगेगा - यदि आप इसे बाहर की कोशिश करना चाहते हैं, तो आप के साथ स्थापित कर सकते हैंdevtools::install_github("ateucher/rmapshaper", ref = "sf")
andyteucher

6
rmapshaperसंस्करण के रूप में 0.3.0, कॉल की as( , "Spatial")आवश्यकता नहीं है।
ल्यूक1018
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.