আর-তে জিআইএস মানচিত্রের জন্য স্বয়ংক্রিয় লেবেল বসানো


9

আমি আর-এ জিআইএস ম্যাপ তৈরি করছি sfপ্যাকেজটি (এবং সম্পর্কিত প্যাকেজগুলি) শেফফাইলে পড়ার জন্য, এবং ggplot2(এবং বন্ধুরা) প্লট করার জন্য। এটি দুর্দান্ত কাজ করে তবে আমি নদী ও রাস্তার মতো বৈশিষ্ট্যগুলির জন্য লেবেল প্লেসমেন্টগুলি (স্বয়ংক্রিয়ভাবে / প্রোগ্রাম্যাটিকভাবে) তৈরি করার কোনও উপায় খুঁজে পাচ্ছি না। এই বৈশিষ্ট্যগুলি সাধারণত লাইনস্ট্রিংস, অনিয়মিত আকারগুলির সাথে। উইকিমিডিয়া থেকে উদাহরণস্বরূপ সংযুক্ত চিত্র দেখুন।

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

ggrepelপ্যাকেজ একটি স্বয়ংক্রিয় ভাবে পয়েন্ট লেবেল জন্য ভাল কাজ করে, কিন্তু এই অন্য ভৌগলিক বৈশিষ্ট্য বিযুক্ত অক্ষাংশ / দ্রাঘিমাংশ পয়েন্ট নয় জন্য অনেক অর্থে দেখা যায় না।

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

কেউ কি এটি করার একটি উপায় জানেন?

এমডব্লিউই এখানে:

#MWE Linestring labeling

library(tidyverse)
library(sf)
library(ggrepel)
set.seed(120)

#pick a county from the built-in North Carolina dataset
BuncombeCounty <- st_read(system.file("shapes/", package="maptools"), "sids") %>% 
  filter(NAME == "Buncombe") 

#pick 4 random points in that county
pts_sf <- data.frame(
  x = seq(-82.3, -82.7, by=-0.1) %>% 
    sample(4),
  y = seq(35.5, 35.7, by=0.05) %>% 
    sample(4),
  placenames = c("A", "B", "C", "D")
) %>% 
  st_as_sf(coords = c("x","y")) 

#link those points into a linestring
linestring_sf <- pts_sf %>% 
  st_coordinates() %>%
  st_linestring()
  st_cast("LINESTRING") 

#plot them with labels, using geom_text_repel() from the `ggrepel` package
ggplot() +
  geom_sf(data = BuncombeCounty) +
  geom_sf(data = linestring_sf) +
  geom_label_repel(data = pts_sf,
                  stat = "sf_coordinates",
                  aes(geometry = geometry,
                      label = placenames),
                  nudge_y = 0.05,
                  label.r = 0, #don't round corners of label boxes
                  min.segment.length = 0,
                  segment.size = 0.4,
                  segment.color = "dodgerblue")

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


8
বাবা। না, কেবল নীতিমালার বাইরে নয়। আমি জানি না আপনি কীভাবে ষড়যন্ত্র করছেন বা আপনি কতদূর পেয়েছেন, বা আপনি যা উল্লেখ করেছেন তা অ-ভৌগলিক ডেটা সহ গ্রেগ্রেলে কাজ করেছে। আপনি বলছেন "এটি ভাল কাজ করে" তবে "এটি" কী, তা দেখাবেন না যা দেখতে ও গড়ে তুলতে সহায়ক হবে। এসডিএফ এবং স্পাডাটা শিপ নমুনা ডেটার মতো অন্যান্য স্থানিক প্যাকেজগুলি অন্তর্ভুক্ত করা সম্ভব হত, বা আপনি একটি ছোট ডামি লাইনস্ট্রিং অবজেক্ট তৈরি করতে পেরেছিলেন - তবে এই মুহূর্তে আমরা কেবল অনুমান করতে পারি যে এর মধ্যে কোনটি আপনার পরিস্থিতির জন্য সহায়তা করবে এবং এটি ঠিক খুব কার্যকর দীর্ঘমেয়াদী নয়
ক্যামিল

8
যদি আপনি একটি ন্যূনতম পুনরুত্পাদনযোগ্য উদাহরণ সরবরাহ না করেন তবে আপনি মূলত অন্যকে আপনার জন্য একটি তৈরি করতে বলছেন। অন্যথায় তারা সাধারণত খুব ভাল উত্তর দিতে পারে না। এক্ষেত্রে তার অর্থ হ'ল তাদের একটি শেফফাইল খুঁজে পাওয়া দরকার, আপনি কীভাবে ব্যবহার করছেন তা নির্ধারণ করুন ggrepel, মূলত আপনি ইতিমধ্যে যা কাজ করেছেন তা আবার করুন। এটি আপনাকে একটি দরকারী উত্তর দেয়ার সম্ভাবনা অনেক কম করে।
অ্যাক্সিমান

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

4
শীতল, এটি এখন একটি ভাল উদাহরণ এবং আপনি যদি আমাদের অনুমান করতে ছেড়ে চলে আসেন তবে আমি এটিকে সামনে আনতে পারি না। কোনও সরঞ্জামের উপস্থিতি আছে কিনা এর মত ধারণামূলক কিছু সন্ধান করা এসও-র জন্য অফ-টপিক হিসাবে বিবেচিত হয়; প্রশ্নগুলি যখন তারা কোনও নির্দিষ্ট সমস্যা বা প্রকল্পের সাথে যুক্ত থাকে তখন আরও ভাল। স্পষ্ট করে বলার জন্য, লেবেলগুলি কি লক্ষ্যের অন্তর্নির্মিত অংশের সাথে কোণযুক্ত রয়েছে, বা কেবল সেগুলি বৈশিষ্ট্যের নিকটে রাখার জন্য?
ক্যামিল

8
@ ক্যামিল প্রথম: আমি আমার প্রথম জবাবের জন্য সত্যই ক্ষমা চাইছি। আমি এসওতে পোস্ট করতে সংকোচিত হয়েছি কারণ এটি মোটামুটি পূর্ণ, এবং সে জন্য নিজেকে আঁকড়ে ধরতে, আমি নিজেই একজন হয়ে উঠি। আমি সে সম্পর্কে ভয়ানক বোধ করছি এবং আমি সত্যিই দুঃখিত। হাতে থাকা প্রশ্নের মতো: লেবেলগুলি কোণে লাগানোর দরকার নেই; বিস্তৃত প্রসঙ্গে (মূলত রাস্তা এবং নদী), লাইনস্ট্রিংগুলি অনিয়মিত, এবং সম্ভবত লেবেলটি কেবল রেখার সাথে কোথাও হওয়া দরকার, তবে (গুরুত্বপূর্ণভাবে) লাইনটির সমান্তরাল।
ইনভার্টডনা

উত্তর:


8

আমি মনে করি আমার কাছে এমন কিছু আছে যা আপনার জন্য কার্যকর হতে পারে। আমি আপনার উদাহরণটিকে কিছুটা বাস্তবসম্মত কিছুতে পরিবর্তন করার স্বাধীনতা নিয়েছি: প্রতিটি ১০০ পয়েন্ট দীর্ঘ, স্মৃতিযুক্ত এলোমেলো পদক্ষেপের সাথে তৈরি কয়েকটি এলোমেলো "নদী":

library(tidyverse)
library(sf)
library(ggrepel)

BuncombeCounty <- st_read(system.file("shapes/", package = "maptools"), "sids") %>% 
                  filter(NAME == "Buncombe")
set.seed(120)

x1 <- seq(-82.795, -82.285, length.out = 100)
y1 <- cumsum(runif(100, -.01, .01))
y1 <- predict(loess(y1 ~ x1, span = 0.1)) + 35.6

x2 <- x1 + 0.02
y2 <- cumsum(runif(100, -.01, .01))
y2 <- predict(loess(y2 ~ x2, span = 0.1)) + 35.57

river_1 <- data.frame(x = x1, y = y1)     %>% 
           st_as_sf(coords = c("x", "y")) %>%
           st_coordinates()               %>%
           st_linestring()                %>%
           st_cast("LINESTRING") 

river_2 <- data.frame(x = x2, y = y2)     %>% 
           st_as_sf(coords = c("x", "y")) %>%
           st_coordinates()               %>%
           st_linestring()                %>%
           st_cast("LINESTRING") 

আপনার উদাহরণ অনুসারে আমরা এগুলি প্লট করতে পারি:

riverplot  <- ggplot() +
              geom_sf(data = BuncombeCounty) +
              geom_sf(data = river_1, colour = "blue", size = 2) +
              geom_sf(data = river_2, colour = "blue", size = 2)

riverplot

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

আমার সমাধানটি মূলত লাইনস্ট্রিংগুলি থেকে পয়েন্টগুলি বের করা এবং সেগুলি লেবেল করা। আপনার প্রশ্নের উপরের ছবি ভালো লেগেছে, আপনি linestring দৈর্ঘ্য বরাবর প্রতিটি লেবেল একাধিক কপি চাইতে পারেন, তাই যদি আপনি চান এন লেবেল আপনি শুধু নিষ্কর্ষ এন সমানভাবে-ব্যবধানে পয়েন্ট।

অবশ্যই, আপনি উভয় নদী একই সাথে লেবেল সংঘাতগুলি ছাড়াই লেবেল করতে সক্ষম হতে চান, সুতরাং আপনাকে নামী তালিকা হিসাবে একাধিক ভৌগলিক বৈশিষ্ট্যগুলি পাস করতে সক্ষম হতে হবে।

এখানে একটি ফাংশন যা সমস্ত কিছু করে:

linestring_labels <- function(linestrings, n)
{
  do.call(rbind, mapply(function(linestring, label)
  {
  n_points <- length(linestring)/2
  distance <- round(n_points / (n + 1))
  data.frame(x = linestring[1:n * distance],
             y = linestring[1:n * distance + n_points],
             label = rep(label, n))
  }, linestrings, names(linestrings), SIMPLIFY = FALSE)) %>%
  st_as_sf(coords = c("x","y"))
}

সুতরাং আমরা যদি অবজেক্টগুলিকে আমরা নামকরণের তালিকায় লেবেল করতে চাই তা এইভাবে রাখি:

river_list <- list("River 1" = river_1, "River 2" = river_2)

তারপরে আমরা এটি করতে পারি:

riverplot + 
   geom_label_repel(data = linestring_labels(river_list, 3),
                    stat = "sf_coordinates",
                    aes(geometry = geometry, label = label),
                    nudge_y = 0.05,
                    label.r = 0, #don't round corners of label boxes
                    min.segment.length = 0,
                    segment.size = 0.4,
                    segment.color = "dodgerblue")

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


2
sfheaders::sf_linestring(obj = data.frame(x = x1, y = y1))sfউত্পাদনের কোডটি কিছুটা সহজ করবে ।
প্রতীকটিউউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.