۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نقشه برداری به طرز شگفت انگیزی آسان در R با مپ ویو

نقشه های تعاملی داده های GIS را با نکات ابزار، متن شناور و افسانه ها در یک خط کد کوتاه و ساده ایجاد کنید. به علاوه، امکانات اضافی مانند لغزنده های کنار هم و نقشه های متعدد را به صورت همگام دریافت کنید.

نقشه های تعاملی داده های GIS را با نکات ابزار، متن شناور و افسانه ها در یک خط کد کوتاه و ساده ایجاد کنید. به علاوه، امکانات اضافی مانند لغزنده های کنار هم و نقشه های متعدد را به صورت همگام دریافت کنید.

R گزینه های نقشه برداری عالی دارد. بروشور R بسته وجود دارد که وقتی می‌خواهم کاری انجام دهم از آن استفاده می‌کنم سفارشی سازی زیاد tmap وجود دارد ، که من آن را به دلیل تعادل خوب بین قدرت و سهولت استفاده دوست دارم. و اخیراً شروع به استفاده از mapview کرده‌ام.

دلیل وجودی mapview تجسم اکتشافی است – به طور خاص، نقشه‌های پیش‌فرض مفید با کد بسیار کم تولید می‌کند. کد کوچکی مانند:

mapview(mydata, zcol = "mycolumn")

یک تابع، دو آرگومان، انجام شد. این امر کاوش داده های مکانی یا ایجاد یک نمونه اولیه سریع را بسیار آسان می کند. Plus mapview چند گزینه نحوی جالب برای مشاهده چندین نقشه دارد.

نمای نقشه در عمل

برای این نسخه ی نمایشی، از شکل فایل ایالت های ایالات متحده و داده های مربوط به تغییرات جمعیت بر اساس ایالت در ۲۰ سال گذشته استفاده خواهم کرد. اگر می‌خواهید ادامه دهید، فایل فشرده داده را دانلود کنید:

طبق معمول، ابتدا کمی اطلاعات را آماده کنید. کد زیر چهار بسته را بارگیری می کند، یک فایل GIS را دانلود می کند که مرزهای چند ضلعی حالت را تعریف می کند، سپس به آن با جمعیت ایالت ها در سال های ۲۰۰۰، ۲۰۱۰ و ۲۰۲۰ می پیوندد.  

library(tigris)
library(mapview)
library(dplyr)
library(sf)
us_geo <- tigris::states(cb = TRUE, resolution = '20m')
pop_data <- readr::read_csv("state_population_data.csv")
all_data <- inner_join(us_geo, pop_data, by = c("GEOID" = "GEOID")) 

در حالی که داده‌های من آماده است، این خط کد تنها چیزی است که برای ایجاد یک نقشه تعاملی برای کاوش داده‌هایم، با درصد تغییر بین سال‌های ۲۰۱۰ و ۲۰۲۰ به آن نیاز دارم:

mapview(all_data, zcol = "PctChange10_20")

یک تصویر از نقشه پیش‌فرض در زیر نشان داده شده است، از جمله یک جدول پاپ‌آپ که در صورت کلیک کردن بر روی یک وضعیت ظاهر می‌شود و متنی که نشان می‌دهد اگر ماوس را بر روی یک وضعیت نگه دارید نشان داده می‌شود.

نقشه 48 ایالت مجاور ایالات متحده با تغییر جمعیت با جدول بازشو داده

نقشه نمای پیش فرض نقشه با یک خط کد کوچک تولید شده است.

توجه کنید چه چیزی نه در کدی که این نقشه را ایجاد کرده است. لازم نبود به هیچ وجه مشخص کنم که چند ضلعی ها را تجزیه و تحلیل می کنم یا اینکه نقشه ای با رنگ چندضلعی می خواهم. mapview() پیش فرض ها را بر اساس نوع فایل مکانی انتخاب کرد. کد mapview(all_data, zcol = "PctChange10_20") تنها چیزی است که برای ایجاد یک نقشه choropleth تعاملی نیاز دارید – شامل متن شناور و پنجره‌های بازشو.

پنجره پیش‌فرض شامل تمام فیلدهای داده‌های من است، و احتمالاً آن چیزی نیست که من می‌خواهم کاربر نهایی ببیند. با این حال، برای کاوش داده های من مفید است. و پاپ آپ قابل تنظیم است، که من کمی به آن خواهم رسید.

پایگاه داده بدون سرور چیست؟ محاسبه الاستیک برای ردیف داده

اگر مجموعه داده‌های شما نام ردیف ندارد، mapview() از شماره ردیف برای ردیف بالای جدول پاپ‌آپ استفاده می‌کند. می‌توانید با تابع row.names() پایه R، نام ردیف‌ها را به مجموعه داده‌های خود اضافه کنید تا عناوین جدول کاربرپسندتری داشته باشید.

به هر حال، اگر جدول شما به زیبایی قالب بندی شده در این نقشه به نظر نمی رسد، سعی کنید GDAL را در سیستم خود به روز کنید. من بسته rgdal را در سیستم خود به روز کردم و مشکل را حل کرد مشکل قالب بندی جدول.

ویژگی های بیشتر نقشه نمای

اگر در تصویر بالا به سمت چپ بالای نقشه با دقت نگاه کنید، باید متنی را مشاهده کنید که طول و عرض جغرافیایی مکانی که ماوس من در زمان ثبت تصویر در آن قرار داشت و همچنین بزرگنمایی نقشه جزوه را نشان می دهد. مرحله. هر دوی آنها با تعامل شما با نقشه تغییر می کنند.

این نقشه پیش‌فرض همچنین شامل مقیاس بر حسب کیلومتر و مایل در پایین سمت چپ است. و در پایین سمت راست، دکمه ای با نام مجموعه داده و ستون وجود دارد. اگر نقشه را به اطراف حرکت دهید یا بزرگنمایی یا کوچکنمایی کنید، کلیک روی آن دکمه شما را به نقطه شروع نقشه برمی گرداند.

نقاط را با نقشه نمایش تجسم کنید

افزودن نقاط به نقشه به اندازه چند ضلعی آسان است. برای امتیازها، از یک فایل CSV از پایتخت ایالت ها با طول و عرض جغرافیایی آنها استفاده خواهم کرد.

در کد زیر، من از بسته rio برای خواندن CSV استفاده می کنم، اما می توانید از گزینه دیگری مانند readr::read_csv() استفاده کنید. برای استفاده از داده‌های طول و عرض جغرافیایی برای کار GIS در R (نه فقط برای نقشه‌نما)، باید قاب داده را به یک شی مکانی تبدیل کنید. تابع st_as_sf() بسته sf این کار را انجام می دهد.

capitals <- rio::import("us-state-capitals.csv")
capitals_geo <- st_as_sf(capitals, coords = c("longitude", "latitude"),
crs = 4326)

st_as_sf() به عنوان آرگومان نیاز به قاب داده، بردار تعیین اینکه کدام ستون ها دارای اطلاعات طول و عرض جغرافیایی هستند، و سیستم مرجع مختصات مورد نظر شما، که در این مورد توسط بسیاری از کاشی های نقشه پس زمینه استفاده می شود، نیاز دارد. .

هنگامی که داده‌ها تبدیل شدند، می‌توانم از آن برای اضافه کردن یک لایه نقطه به نقشه خود با فراخوانی دیگر به mapview() استفاده کنم:

mapview(all_data, zcol="PctChange10_20") + 
mapview(capitals_geo)

من مجبور نبودم به mapview بگویم که capitals_geo حاوی نقاطی است یا اینکه کدام ستون ها داده های طول و عرض جغرافیایی را در خود جای می دهند. در واقع، هنگامی که اولین شی mapview خود را ایجاد کردم، می‌توانم بدون فراخوانی مجدد mapview() لایه‌هایی را به نقشه اضافه کنم. من فقط می توانم از نام شی نقطه استفاده کنم:

mapview(all_data, zcol = "PctChange10_20") + capitals_geo

نقشه اکنون به این شکل است:

React 19 بر اساس انتقال های غیر همگام ساخته شده است

نقشه ای که ایالت ها و حلقه های ایالات متحده را در محل پایتخت هر ایالت نشان می دهد

نقشه با چند ضلعی ها و نقاط.

تجسم های خودکار را فراخوانی کنید

همچنین می‌توانید از mapview بخواهید که به طور خودکار اشیاء مکانی را در جلسه R شما تجسم کند. تابع startWatching() بسته، نقشه ای از هر شیء sf را که پس از فراخوانی تابع به آن اضافه می کنید یا در جلسه R خود تغییر می دهید، ایجاد می کند. نحوه عملکرد آن را می توانید در ویدیوی تعبیه شده در بالای این مقاله مشاهده کنید.

نقشه های R را با نقشه نمایش سفارشی کنید

آگومان‌های mapview() برای سفارشی کردن گزینه‌های نقشه مانند color برای خطوط مرزی چندضلعی، col.regions وجود دارد. کد> برای رنگ‌های پر چند ضلعی، و alpha.regions برای کدورت.

اگر می خواهید نام لایه کاربرپسندتری داشته باشید، می توانید نام یک لایه را با آرگومان layer.name تغییر دهید. این روی افسانه، دکمه پایین سمت راست، و هنگام باز کردن دکمه لایه به سمت چپ بالا ظاهر می‌شود.

در این بلوک کد بعدی، رنگ های چند ضلعی و کدورت را با استفاده از پالت “Greens” از بسته RColorBrewer و کدورت ۱ تغییر می دهم تا چند ضلعی ها مات شوند. (توجه داشته باشید اگر می خواهید این کد را روی سیستم خود اجرا کنید، به بسته RColorBrewer نصب شده نیاز دارید.)

 mapview(all_data, zcol = "PctChange10_20", 
col.regions = RColorBrewer::brewer.pal(9, "Greens"),
alpha.regions = 1)

پالت سبزها حداکثر نه رنگ مجزا دارد. mapview اگر مانند اخطار زیر یک پالت با تعداد رنگ‌های مورد نیاز به آن ندهید، شکایت می‌کند، اما کار درون یابی را برای شما انجام می‌دهد.

Warning message: 
Found less unique colors (9) than unique zcol values (41)!
Interpolating color vector to match number of zcol values.

می توانید از یک پالت واگرا نیز در نقشه خود استفاده کنید، مانند پالت RdYlGn:

mapview(all_data, zcol = "PctChange10_20", 
col.regions = RColorBrewer::brewer.pal(11, "RdYlGn"), alpha.regions = 1)

نقشه ایالت های ایالات متحده بر اساس تغییر جمعیت به رنگ سبز، زرد و قرمز با پس زمینه سیاه

پس‌زمینه تاریک این نقشه به‌طور خودکار ظاهر می‌شود، زیرا mapview مشخص می‌کند که نقشه دارای رنگ‌های روشن زیادی است. می‌توانید آن رفتار نقشه پایه را با

خاموش کنید

mapviewOptions("basemaps.color.shuffle" = FALSE)

دو نقشه را با هم تجسم کنید

حالا به چند مورد از آن گزینه های نحو جالبی که در ابتدا ذکر کردم می پردازیم. در اینجا من دو نقشه ایجاد می کنم، یکی برای تغییر جمعیت ۲۰۱۰ تا ۲۰۲۰ و دیگری برای ۲۰۰۰ تا ۲۰۱۰:

map2020 <- mapview(all_data, zcol = "PctChange10_20", 
col.regions = RColorBrewer::brewer.pal(9, "Greens"), alpha.regions = 1,
layer.name = "Pct change 2010-2020"
)
map2010 <- mapview(all_data, zcol = "PctChange00_10",
col.regions = RColorBrewer::brewer.pal(9, "Greens"), alpha.regions = 1,
layer.name = "Pct change 2000-2010"
)

می‌توانید نقشه‌ها را در کنار هم قرار دهید و آنها را با بسته leafsync و تابع sync() هماهنگ کنید.

library(leafsync)
sync(map2010, map2020)

دو نقشه ایالات متحده در کنار هم

این دو نقشه با هم حرکت می‌کنند، بزرگ‌نمایی می‌کنند و حرکت می‌کنند.

یا، به لطف بسته leaflet.extras2 و | (لوله یونیکس، نه، می توانید دو نقشه را در یک لایه قرار دهید و یک نوار لغزنده کنار هم برای مقایسه این دو داشته باشید. R pipe) کاراکتر.

map2010 | map2020

نقشه را با یک نوار لغزنده در وسط که به جلو و عقب می لغزد تا نسخه چپ یا راست را نشان دهد.

لغزنده نقشه می تواند از چپ به راست حرکت کند تا نسخه چپ یا راست نقشه را نشان دهد.

نقش پایگاه داده در محاسبات لبه

افسانه‌ها، پنجره‌های بازشو یا شناور متن روی نقشه را نمی‌خواهید؟ این موارد را می توان با

خاموش کرد

mapview(all_data, zcol = "PctChange10_20", 
        legend = FALSE, label = FALSE, popup = FALSE)

همچنین می‌توانید با استفاده از پیش‌بینی سفارشی مجموعه داده، کاشی‌های نقشه پس‌زمینه را خاموش کنید. یکی از مواردی که مفید است این است که می‌خواهید نقشه ای از ایالات متحده را نشان دهید که آلاسکا و هاوایی را به‌جای مکان واقعی جغرافیایی، برای نمایش فشرده‌تر نشان دهد.

چهار خط اول کد زیر از بسته albersusa برای تولید یک فایل GIS با آلاسکا و هاوایی به عنوان ورودی استفاده می کند. اما نقشه نمای نقشه پیش‌فرض حاصل از این داده‌ها همچنان کاشی‌های پس‌زمینه پیش‌فرض را نشان می‌دهد که در نتیجه آلاسکا و هاوایی روی مکزیک پوشیده شده‌اند.

library(albersusa)
us_geo50 <- usa_sf("lcc") %>% mutate(GEOID = as.character(fips_state))
pop_data50 <- readr::read_csv("data/state_population_data50.csv")
all_data50 <- inner_join(us_geo50, pop_data50, by = c("GEOID" = "GEOID"))
mapview(all_data50, zcol = "PctChange10_20")

نقشه ایالات متحده با آلاسکا و هاوایی به عنوان ورودی، اما روی نقشه مکزیک ظاهر می شودmapview(all_data50, zcol = "PctChange10_20",
native.crs = TRUE)

نقشه ایالات متحده با آلاسکا و هاوایی به عنوان ورودی و بدون کاشی های نقشه پس زمینه.

استفاده از یک طرح‌نمای سفارشی می‌تواند نمایشگرهای انعطاف‌پذیرتری داشته باشد، مانند این نقشه ایالات متحده با آلاسکا و هاوایی به عنوان ورودی.

سفارشی سازی های R mapview بیشتر

می توانید نقاط شکست bin خود را با آرگومان at سفارشی کنید. در کد زیر، شکست‌ها را با استفاده از تابع seq() پایه R تنظیم می‌کنم که از -۴ به ۲۰ با افزایش ۲ می‌رود. رنگ‌های نقشه و افسانه شکست‌های جدید را نشان می‌دهند.

mapview(all_data, zcol = "PctChange10_20", 
at = seq(-4, 20, 2))

می‌توانید پنجره‌های بازشو خود را سفارشی کنید و متن را با استفاده از تکنیک‌های مشابه با بسته R. من مطمئن هستم که چندین راه برای انجام این کار وجود دارد، اما این روند معمول من است:

ابتدا، با استفاده از دستور کامل dataframe$column_name برای متغیرها، بردار رشته‌های کاراکتر را با کد HTML ایجاد کنید. من بسته چسب را برای این کار مفید می دانم، اگرچه می توانید paste() را نیز انجام دهید. به عنوان مثال:

mylabel <- glue::glue("{all_data$State} {all_data$PctChange10_20}%")

دوم، تابع HTML() بسته htmltools را روی بردار با lapply() اعمال کنید تا در نهایت به یک لیست برسید — زیرا به یک لیست نیاز دارید — مانند :

mypopup <- glue::glue("<strong>{all_data$State}</strong><br />
Change 2000-2010: {all_data$PctChange00_10}%<br />
Change 2010-2020: {all_data$PctChange10_20}%") %>%
lapply(htmltools::HTML)
mylabel <- glue::glue("{all_data$State} {all_data$PctChange10_20}%") %>%
lapply(htmltools::HTML)

لیست پاپ آپ من اکنون چیزی شبیه به این است:

head(mypopup, 3) 
[[۱]] <strong>Washington</strong><br />
Change 2000-2010: 14.1%<br />
Change 2010-2020: 14.6%
[[۲]] <strong>Puerto Rico</strong><br />
Change 2000-2010: -2.2%<br />
Change 2010-2020: -11.8%
[[۳]] <strong>South Dakota</strong><br />
Change 2000-2010: 7.9%<br />
Change 2010-2020: 8.9%