【问题标题】:What projections in r will fatten a city map?r 中的哪些投影会使城市地图变胖?
【发布时间】:2014-10-21 18:18:46
【问题描述】:

我正在尝试制作一些城市地图,我想对它们进行一些扭曲,以使最密集的部分(在本例中为曼哈顿)在最终地图上显得更宽一些。我很难在城市级别找到好的投影示例。

我只是想要一个能制作出更好看的纽约市地图的投影,但这可能过于主观,所以假设我想增肥曼哈顿。我在下面尝试过的可重现代码:

library(ggplot2)
library(maptools)

shpny.tf <- tempfile()

download.file(
    "http://www2.census.gov/geo/tiger/TIGER2010/COUNTY/2010/tl_2010_36_county10.zip" ,
    shpny.tf ,
    mode = 'wb'
)

shpny.uz <- unzip( shpny.tf , exdir = tempdir() )

ny.shp <- readShapePoly( shpny.uz[ grep( 'shp$' , shpny.uz ) ] )

# limit the shapefile to only the five boroughs
nyc.shp <- subset( ny.shp , as.numeric( as.character( COUNTYFP10 ) ) %in% c( 5 , 47 , 61 , 81 , 85 ) )

# prepare for plotting
nyc <- fortify( nyc.shp )

# make a plot
p <- qplot( data = nyc , x = long , y = lat )

# default plot
p

# these two seem like good candidates for fattening,
# but i'm not sure how to make them take up more space on the right and left side
p + coord_map("ortho", orientation=c(41, -74, -25))
p + coord_map("azequalarea",orientation=c(41,-74,-22))

# this one's okay but still not ideal
p + coord_map("lagrange")

# this one is named for new york yet i can't get it to do anything useful
p + coord_map("newyorker",r=10)

理想情况下,结果应该更接近这张纽约地铁地图中的比例。我知道只有投影不可能有这么大的失真,我只是好奇是否有任何投影可以使地图更接近那个理想形状。谢谢!

【问题讨论】:

  • 仅仅选择一个合适的投影并不是一个真正的特定编程问题,因此与本网站无关。也许可以尝试Cross Validated 获取一般可视化建议或Geographic Information Systems 获取有关图形信息系统的信息。
  • 您能否发布一个五区地图的链接或图片,看起来更像您想要的那样?
  • 在一周内设置了 10 次赏金之后,您甚至还拥有良好的声誉......
  • @DavidArenburg 哈哈我已经破产了,我承认 ;)
  • @miles2know 鉴于此 q 已收到三个答案 - 所有这些都推荐非投影解决方案 - 我认为你是对的:/

标签: r map ggplot2 shapefile map-projections


【解决方案1】:

我下载了 shapefile 并将其存储,因为不断下载 1M 文件的效果值得怀疑。由于我在命令行上使用curl 执行此操作,因此我已经在终端中,因此我使用ogr2ogr 预先提取了五个行政区:

$ ogr2ogr -f "ESRI Shapefile" \ 
          -where 'COUNTYFP10 IN ("005", "047", "061", "081", "085")' \ 
          boroughs.shp tl_2010_36_county10.shp

接下来,我使用readOGR 读取新的 shapefile 并设置一些必要的库:

library(rgdal)
library(maptools)
library(ggplot2)

boroughs.shp <- readOGR("tl_2010_36_county10/", "boroughs")

现在,我们将纽约和其他四个行政区分开:

nyc <- boroughs.shp[boroughs.shp$NAME10 == "New York",]
other_four <- boroughs.shp[boroughs.shp$NAME10 != "New York",]

继续阅读?elide,因为它可以让您缩放多边形并移动它们,您需要做的比我在这个例子中展示的更多。在这里,我将 nyc 缩放 1.1(任意),但其他人保持 1:1 的比例。由于elide 更改了 SpatialPolygonsDataFrames 的 CRS,因此我在这里采取了一些捷径。

nyc <- elide(nyc, scale=1.1)
other_four <- elide(other_four, scale=1)

接下来,我们重新组合它们:

boroughs.shp <- spRbind(nyc, other_four)

并为ggplot做必要的工作:

boroughs <- fortify(boroughs.shp, region="NAME10" )

我更喜欢geom_map,这为您提供了连续的多边形与您的点图:

gg <- ggplot(data=boroughs, aes(x=long, y=lat))
gg <- gg + geom_map(map=boroughs, aes(map_id=id, group=group), fill="white", color="black")
gg <- gg + coord_map()
gg

显然,这不是您想要的最终状态,但您现在拥有构建适当地图所需的工具(尽管我个人不喜欢扭曲的多边形地图)。

您可以read up more on making cartograms 获得最终效果,但需要更多的努力。 IMO,如果您想进行增肥/缩放以显示密度,则可以使用真正的制图。

编辑或者,也许只是满足于globular

gg_globular <- gg + coord_map("globular", orientation=c(41,-74,-22)) + ggtitle("globular")

【讨论】:

  • 谢谢!我花了一些时间在elide 上,但不清楚如何像这里的制图那样保持边界关系?如果你把曼哈顿放大两倍,拼图的各个部分就不再组合在一起了。实现this (defunct) package 可能是可能的,但只是重新投影似乎是一条巨大的捷径,因为我不太关心基于人口或计数的缩放
  • 我非常喜欢globular。曼哈顿岛仍然有点瘦,但这肯定是最好的选择:)谢谢!
【解决方案2】:

仍然是制图的脉络,您可以将 R 与跨平台 Java 程序 ScapeToad 结合使用。显然,这不像纯 R 解决方案那样理想,但它仍然是一个选项。

例如:

# Create a field that will be used to distort polygons. 
# In our case, the second polygon corresponds to New York County (i.e. Manhattan)
ny.shp$size <- c(1, 1.5, 1, 1, 1)

现在转到 ScapeGoat 并生成地图,使用 size 字段作为地图属性,然后导出为 .shp。

这会产生以下结果:

如果您需要准确的网格线,显然这种方法不太合适。

【讨论】:

  • 谢谢!但我确实需要网格线..而且我试图保持很多ggplot2 图层/叠加层同步。我是克里金法;)
  • @Anthony 很公平——我认为可能是这样。祝你好运 - 这是一个有趣的问题!
【解决方案3】:

使用您最熟悉的任何语言编写解决方案的伪代码。这种方法允许您对地图的不同部分应用不同程度的失真,同时保留公共边的拓扑。

我怀疑在这么小的地理区域内乱用不同的投影不太可能产生任何明显的失真。

无论如何,这就是我的处理方式。

  1. 转储每个多边形的点,以及 poly_id 和索引位置。
  2. 选择一个参考点。例如,最密集多边形的质心
  3. 计算每个多边形点(第 1 步)和参考点(第 3 步)之间的方位角和距离。
  4. 使用您想要的任何参数创建一个翻译函数。如果您想在特定平面上扭曲更多,它可能只是保持方位角恒定的距离函数或方位角的距离和正弦等。
  5. 计算每个多边形点的新 x,y
  6. 重新制作多边形。

我已经可以想到一个很棒的数据动画来展示形状随时间的变化。当我有时间时,我将编写解决方案并分享。高温

【讨论】:

  • 谢谢你,马克!我希望有一个仅限投影的解决方案,因为我正在处理很多层以及一个 krigged 的​​点网格。任何扭曲我正在使用的所有图层中的单个形状的东西都会使事情复杂化 10 倍。 ://
【解决方案4】:

http://kartoweb.itc.nl/geometrics/coordinate%20transformations/coordtrans.html

参考理论。 :-(((

我的建议是使用您当前的 CRS 进行所有分析。

然后我会通过矢量化包括栅格在内的每一层(例如转储像素质心)来扭曲您的结果。接下来,我将应用一个平移函数以相同的方式扭曲每个矢量对象的特征。 然后我会重新栅格化你的克里格点估计。

我为此选择的工具是使用 ST_translate 的 postgis。然后,我会将数据拉回到 R 中,以创建新的栅格表面以进行可视化。

【讨论】:

    【解决方案5】:
    # this is clearly insane
    p +
        geom_map(map=nyc, aes(map_id=id, group=group), fill="white", color="black") +
        coord_map( "globular" , orientation = c( 40.55 , -74.11 , -24 ) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 2016-10-25
      • 2015-07-13
      • 2020-02-09
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多