Как создать наложение карты Нидерландов и формы его муниципалитетов - PullRequest
0 голосов
/ 25 февраля 2019

Чтобы я мог полностью изложить свой вопрос, пожалуйста, соблюдайте следующий код:

library(raster)
library(tibble)
library(dplyr)
library(ggplot2)
library(ggthemes)
library(ggmap)
library(broom)

download.data <- function(path, year, link){
  if (length(list.files(file.path(gem_path, year))) == 0){
    dir.create(file.path(path, year), recursive=TRUE)
    tmp <- tempfile()
    download.file(link, tmp)
    shp_files <- unzip(tmp)
    file.copy(shp_files, file.path(path, year))
    unlink(unique(dirname(shp_files)), recursive = TRUE)
  } else {
    warning("Files are already downloaded.")
  }
}

# Variables and paths used
gem_path <- file.path("Data", "Gemeente")
data17_link <- "https://www.cbs.nl/-/media/cbs/dossiers/nederland%20regionaal/wijk-en-buurtstatistieken/2018/shape%202017%20versie%2020.zip"
download.data(gem_path, "2017", data17_link)

#Loading the CBS data in.
gem17_raw <- shapefile(file.path(gem_path, "2017", "gem_2017"))

# Extracting only land areas and tidy up the dataset.
gem17 <- broom::tidy(subset(gem17_raw, gem17_raw$WATER == "NEE"))

ggplot(gem17) + 
  geom_polygon(aes(x=long, y=lat, group=group)) +
  theme_minimal() + coord_fixed()

# Manual input
nl_lat <- c(50.7, 53.65)
nl_lon <- c(3.25, 7.32)

terrain <- get_map(location = c(nl_lon[1], nl_lat[1], nl_lon[2], nl_lat[2]), maptype = "terrain", source = "osm", zoom = 8)
ggmap(terrain)

Этот фрагмент кода загружает файлы форм из CBS (Центральное бюро статистики Нидерландов), а также получаеткарта Нидерландов.Чего я хотел бы добиться, так это , чтобы границы муниципалитетов отображались на карте местности .На мой взгляд, это звучит достаточно просто, поэтому я хотел бы объединить обе карты.

Для этого у меня есть несколько проблем, с которыми я столкнулся.Моя стратегия такова:

  1. Убедитесь, что долгота и широта обеих карт одинаковы.
  2. Удалите заливки (чтобы мы получили только границы).
  3. Наложение обоих графиков.

Первая небольшая проблема, с которой я столкнулся, - это предупреждения: «Области определены для каждого полигона», но я уже использовал подход аккуратности, и все же он показывает предупреждения.

В подходе tidy я вижу следующее сообщение «В bind_rows_ (x, .id): привязка символа и вектора фактора, приведение к вектору символа».Но, к сожалению, по моему мнению, это не показывает, какую переменную я должен преобразовать в другой тип.Какую переменную следует привести, чтобы аккуратный подход работал без предупреждений?Поскольку я хотел бы закодировать это правильно.

Первая большая проблема, с которой я столкнулся, - это преобразования долготы и широты, заметьте, что долгота и широта не верны. Они, кажется, отклоняютсянемного от того, что должно быть.

Municipalities plot of the Netherlands

Итак, я изучаю сюжет:

gem17_raw@proj4string

и получаю следующую информацию:

CRS arguments:
 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel
+units=m +no_defs 

Итак, я проверяю, помогает ли преобразование, однако, это приводит к сильно искаженному графику, который я не могу исправить.Как я могу правильно отобразить этот график?(У меня нет конкретной проекции, которая мне бы хотелось, поэтому, возможно, с Меркатором все будет в порядке, но в настоящее время я не уверен, как выглядит мой график).

geom17_test <- spTransform(gem17_raw, CRS("+proj=longlat +datum=WGS84"))

ggplot(geom17_test) + 
  geom_polygon(aes(x=long, y=lat, group=group)) +
  theme_minimal()

Projection to the correct coordinates

Итак, решить первую задачу было бы: как правильно отобразить карту с правильными координатами широты и долготы?

Что касается второй точки, яневозможно удалить границы, так как установка fill=NA не будет работать (т.е.:

ggplot(gem17) + 
  geom_polygon(aes(x=long, y=lat, group=group, fill=NA)) +
  theme_minimal() + coord_fixed()

Поскольку я установил группу. Как я могу отображать только границы ?

Последняя часть будет объединять обе карты, но я застрял в первых двух пунктах.

...