首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制地图时出错-‘此函数不能为经度/纬度数据提供正确的质心和距离。’

绘制地图时出错-‘此函数不能为经度/纬度数据提供正确的质心和距离。’
EN

Stack Overflow用户
提问于 2020-01-19 19:24:21
回答 1查看 701关注 0票数 1

我正在尝试使用maptools包中的wrld_simple数据来绘制一张涉及一些欧洲国家的地图,该地图基于欧洲国家2005年的人口:

代码语言:javascript
复制
countries = c('Austria', 'Belgium', 'Bulgaria', 'Cyprus', 'Czech Republic', 'Denmark', 'Estonia', 'Finland', 'France', 'Germany', 'Greece', 'Hungary', 'Iceland', 'Ireland', 'Italy', 'Latvia', 'Lithuania', 'Luxembourg', 'Malta', 'Netherlands', 'Norway', 'Poland', 'Portugal', 'Slovenia', 'Spain', 'Sweden', 'United Kingdom')

使用maptools包,我获得了wrld_simpl数据,并检索了这些特定国家的数据:

代码语言:javascript
复制
data(wrld_simpl)

mapsimple = wrld_simpl[wrld_simpl$NAME %in% countries]

plot(mapsimple)

到目前为止还不错,但是当我把它画出来的时候:

代码语言:javascript
复制
cartogram= cartogram(mapping1, "POP2005", itermax = 7)

Please use cartogram_cont() instead of cartogram().

Error: Using an unprojected map. This function does not give correct centroids and distances for longitude/latitude data:
Use "st_transform()" to transform coordinates to another projection.

我尝试使用cartogram_cont:

代码语言:javascript
复制
> cartogram= cartogram_cont(mapping1, "POP2005", itermax = 7)

Error: Using an unprojected map. This function does not give correct centroids and distances for longitude/latitude data:
Use "st_transform()" to transform coordinates to another projection.

我尝试将其转换为sf,然后执行st_transform(),但无济于事:

代码语言:javascript
复制
sfno = st_as_sf(mapping1)

sfnoproj = st_transform(sfno, coords = c("lon", "lat"), crs = "+proj=longlat +datum=WGS84", agr = "constant")

cartogram= cartogram_cont(sfnoproj, "POP2005", itermax = 7)

Error: Using an unprojected map. This function does not give correct centroids and distances for longitude/latitude data:

Use "st_transform()" to transform coordinates to another projection.

我假设我没有正确的投影值。我怎么知道如何设置得更好呢?如果我使用'POP2005‘以外的其他值,我该怎么做?地图中的“itermax”是什么意思(我不太理解给定的定义)

任何帮助都将不胜感激,因为我对此还很陌生。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-01-20 00:46:59

您的样本数据中存在一些不一致之处(mapsimple v.mapping1和缺少逗号),因此更新如下:

代码语言:javascript
复制
library(maptools)
library(sf)
library(ggplot2)

countries = c('Austria', 'Belgium', 'Bulgaria', 'Cyprus', 'Czech Republic', 'Denmark', 'Estonia', 'Finland', 'France', 'Germany', 'Greece', 'Hungary', 'Iceland', 'Ireland', 'Italy', 'Latvia', 'Lithuania', 'Luxembourg', 'Malta', 'Netherlands', 'Norway', 'Poland', 'Portugal', 'Slovenia', 'Spain', 'Sweden', 'United Kingdom')

data(wrld_simpl)

mapsimple = wrld_simpl[wrld_simpl$NAME %in% countries,]

如错误所示,您的数据是未预测的。它使用纬度/经度,这不适用于cartogram_cont()

代码语言:javascript
复制
sfno <- st_as_sf(mapsimple)
st_crs(sfno)

Coordinate Reference System:
  EPSG: 4326 
  proj4string: "+proj=longlat +datum=WGS84 +no_defs"

您的st_transform()sfno重新投影为相同的内容:EPSG4326:

代码语言:javascript
复制
sfnoproj <- st_transform(sfno, coords = c("lon", "lat"), 
                        crs = "+proj=longlat +datum=WGS84", 
                        agr = "constant")
st_crs(sfnoproj)

Coordinate Reference System:
  EPSG: 4326 
  proj4string: "+proj=longlat +datum=WGS84 +no_defs"

相反,应选择欧洲的投影坐标系,如23038

代码语言:javascript
复制
sfproj <- st_transform(sfno, crs = 23038)
st_crs(sfproj)

Coordinate Reference System:
  EPSG: 23038 
  proj4string: "+proj=utm +zone=38 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs"

然后,我们可以制作并绘制地图:

代码语言:javascript
复制
cartogram <- cartogram_cont(sfproj, "POP2005", itermax = 7)

ggplot() +
  geom_sf(data = cartogram, aes(fill = POP2005))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59809551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档