如何使用和理解(R-)传单的crsClasses?

时间:2019-06-14 12:10:09

标签: r leaflet

在下面的输入后进行编辑,例如here :传单必须在“非gis专家可理解的”和“正确的gis处理”之间做出折衷。我现在所了解的是,传单的重点是易于处理,因此无法真正实现预测。

原始问题:我的目标是正确显示“真实”密度,即事件/ m ^ 2。目前,我正在为传单的投影而苦苦挣扎。我必须怎么做才能正确显示所有crsClasses?我的数据在这里生成均匀的随机点。

我想我想转换数据吗?

library(leaflet)
n <- 10000
z <- 2*runif(n) - 1
phi <- 2*pi*runif(n) - pi
x <- sin(phi)*sqrt(1 - z^2)
y <- cos(phi)*sqrt(1 - z^2)
theta <- acos(z)
# lat / lng
lat <- theta*180/pi - 90
lng <- phi*180/pi

# Working fine:
# plot3D::polygon3D(x, y, z)
rgl::plot3d(x, y, z)
# rgl::plot3d(sin(phi)*sin(theta), cos(phi)*sin(theta), cos(theta)) # the same...

# EPSG:3857, also known as "Google Mercator" or "Web Mercator", the first in the following list
crsClasses <- c("L.CRS.EPSG3857", "L.CRS.EPSG4326", "L.CRS.EPSG3395", "L.CRS.Simple", "L.Proj.CRS")
epsg3857 <- leafletCRS(crsClass = crsClasses[1])
leaflet(options = leafletOptions(
  crs = epsg3857, worldCopyJump = FALSE)) %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = lat,
                   lng = lng,
                   radius = 1, 
                   stroke = FALSE,
                   fillOpacity = 0.7)

使用crsClasses[1] ...看起来不错,但我不明白为什么它与worldCopyJump = FALSE相对应。

enter image description here

使用crsClasses[2] ...看起来很奇怪

enter image description here

crsClasses[3...6]看起来也很奇怪。很难为GIS新手找到好的教程

参考:

从IvanSanchez输入信息后的评论:以下策略正确吗?

  • 使用crsClass L.CRS.EPSG4326,地图已更改,但数据保持不变。因此,我也必须转换数据。 这意味着我必须使用new <- sp::spTransform(x, CRSobj, ...)。看起来像
    • 我必须弄清楚EPSG代码,在这里您已经告诉我了(您可能会猜到)它是EPSG:4326。是否有系统的方法来获得该结果?
    • 我需要将(lat,lng)转换为适当的对象。来自??spTransform:“ x ...要转换的对象”和“ CRSobj ...类CRS的对象”。帮助指向sp::CRS(projargs, doCheckCRSArgs=TRUE)。但是后来我被困住了...
    • 在addCircleMarkers()中调用新的经纬度。
  • 正如您所指出的,我应该寻找密度相等的区域投影
    • here中,我将按照他们的建议查找兰伯特方位角等面积(LAEA)。 从here中,我想我将EPSG:3575(??)用于欧洲,但是也许“ WGS 84 /北极LAEA欧洲”是错误的?
    • 我迷路了:...找到(或构建)该投影的底图。我认为这对地图和数据意味着什么?

您能否通过该丛林或至少针对上述情况之一提供指导?还是您有很好的参考资料来学习如何正确地做到这一点?

从Leaflet文档中:

  

crs ...使用的坐标参考系统。 如果不确定它的含义,请勿更改。

但是不幸的是,他们没有告诉您需要更改的位置。

1 个答案:

答案 0 :(得分:1)

  

我的目标是正确显示“真实”密度,即在events / m 2

然后,您应该使用equal-area projection

  

但是我不明白为什么它对应于worldCopyJump = FALSE.

worldCopyJump是一个交互选项,并且不是一个可视化选项。让我引用Leaflet的参考,重点是我的:

  

启用此选项后,地图会平移到世界的另一“副本”,并无缝跳转到原始世界,以便所有覆盖物(例如标记和矢量层)仍然可见。

换句话说:当用户平移地图时,该选项仅会影响地图的行为,以使地图的中心越过子午线。它没有任何其他作用。它不会像Leaflet.RepeatedMarkers那样复制数据的多个副本,而是像doesn't magically reposition your data so it looks nicer那样。

  

使用crsClasses[2] ...看起来很奇怪

您正在使用带有EPSG:4326坐标系的地图,但背景图块仍位于EPSG:3857中。如elsewhere所述,Leaflet不会重新投影栅格数据(与OpenLayers在某些特定情况下不同)。如果您更改地图的CRS,则也将负责更改地图的图块来源。

EPSG:4326是equirectangular projection的坐标系,基于CRS84 geoid

它的性质是地球的范围看起来像一个比率为2:1的矩形; Leaflet假设服务于EPSG:4326中的图块的图块服务器具有两个两个图块,其缩放级别为零。将其与Leaflet关于EPSG:3857 having just one square tile at zoom level zero的假设进行比较。


不要盲目更改CRS,不要指望一切正常。选择地图投影,找到其EPSG代码,然后为该投影找到(或构建)底图。