Sf অবজেক্টের বহুভুজকে সরল করুন


14

sfফাঁক এবং স্লাইভারগুলি না জানিয়ে আমি কীভাবে বহুভুজকে সরল করব ?

একটি শেফফাইল সহ, উদাহরণস্বরূপ, আমি ব্যবহার করব 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()ম্যান পেজ থেকে আমি যা চেষ্টা করেছি :

অন্য ধরণের জ্যামিতি নিক্ষেপ করুন: হয় সরল করুন, বা স্পষ্টভাবে কাস্ট করুন

এবং:

to argument: চরিত্র; লক্ষ্য প্রকার, যদি অনুপস্থিত থাকে, সরলীকরণের চেষ্টা করা হয়েছে; 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()নীচের যুক্তিগুলির সাথে নির্দিষ্ট করে @ এসএসএসের পরামর্শ টপোলজিক্যালি-সচেতন সরলিকরণগুলি (যেমন স্লাইভার তৈরি না করে সরলকরণ) করতে পারে:

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_simplifypreserveTopology = TRUE
অবধি চেষ্টা করা অন্য সমস্তগুলির

1
জানা ভাল. এই সম্পর্কে একটি বাগ রিপোর্ট খোলার কি?
lbusett

1
@obrl_soil এটি প্রশ্নে আমি ব্যবহার করা বহুভুজগুলিতে প্রায় 1000 পর্যন্ত সহনশীলতার জন্য কাজ করে ( regions) তবে এর বাইরে এটি টপোলজিকে আর সংরক্ষণ করে না। এটি নির্দিষ্ট সময়ে ভাঙ্গার সাথে সাথে আমি বলব যে এটি উদ্দেশ্যমূলক আচরণ নয়
ফিল

উত্তর:


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()লেখার সময় উচ্চতর সহনশীলতায় আরও প্রচলিত দৃ rob় নয়, যদিও স্পষ্টতই এটি পরিবর্তন হতে পারে।
ফিল

8
আমি বর্তমানে rmapshapersf মধ্যে অবজেক্টের জন্য সমর্থন উপর কাজ করছি । বিকাশ সংস্করণে অবজেক্টের জন্য উপলব্ধ । আমি প্রারম্ভিক ms_simplifysfdevtools::install_github("ateucher/rmapshaper", ref = "sf")
পরীক্ষাগুলি পছন্দ করি

6
এর মতো rmapshaperসংস্করণ 0.3.0, এর কল as( , "Spatial")আর প্রয়োজন নেই।
লুক 1018
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.