用rgeolocate图覆盖R中的世界地图

时间:2018-11-07 17:30:12

标签: r ggmap

在上一个问题中,我提出了一个带有IP的“帖子”表,并且希望对其进行地理位置定位。 Geolocating a large number of posts based on IP Addresses. (880,000 rows)

答案显示了如何使用rgeolocate来实现这一目标,并且在学习R方面做了一些努力之后,我设法达到了相同的结果:

object_id

结果显示在这里:

plot of ips

此图根据数据准确显示了我期望的分组类型。所以成功的第一步!

当然,下一个逻辑步骤是增加分辨率并添加世界地图的叠加层。我一直无法实现这些目标。

使用此代码,我可以制作高分辨率的世界地图:

library(iptools)
library(rgeolocate)
library(tidyverse)
library(readxl)
library(rworldmap)
library(ggmap)
library(rworldxtra)
post <- read_excel("filepath/post.xlsx")
view(post)

## grab my ips and, format them

ips <- unlist(post[,3], use.names=FALSE)

#geolocte them
system.time(
rgeolocate::maxmind(
ips, "~/R/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
)

#user  system elapsed 
#6.04    0.02    6.05 

xdf %>% 
  count(longitude, latitude) -> pts

#And, plot them:
  ggplot(pts) +
  geom_point(
    aes(longitude, latitude, size = n), 
    shape=21, fill = "steelblue", color = "white", stroke=0.25
  ) +
  ggalt::coord_proj("+proj=wintri") +
  ggthemes::theme_map() +
  theme(legend.justification = "center") +
  theme(legend.position = "bottom")

结果显示在这里:

worldmap no points

以某种方式我无法实现地图和正在绘制的数据的组合。似乎任何创建地图的尝试都需要我自己绘制地图,而任何向该点添加点的尝试都将失败。例如:

newmap <- getMap(resolution = "high")
plot(newmap)
  

错误:ggmap绘制了ggmap类的对象,请参见?get_map

我一直在尝试根据http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/的建议进行工作,但是该网站专注于欧洲地图,我想在世界地图上显示我的数据。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

library(iptools)
library(rgeolocate)
library(tidyverse)

ips <- ip_random(1000000)

rgeolocate::maxmind(
  ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf

xdf %>% 
  mutate(
    longitude = (longitude %/% 5) * 5,
    latitude = (latitude %/% 5) * 5
  ) %>%  
  count(longitude, latitude) -> pts

wrld <- tbl_df(map_data("world"))
wrld <- filter(wrld, region != "Antarctica")

ggplot() +
  geom_map(
    map = wrld, data = wrld, aes(long, lat, map_id=region),
    color = "black", fill ="white", size=0.125
  ) +
  geom_point(
    data = pts, aes(longitude, latitude, size = n), 
    shape=21, fill = "steelblue", color = "white", stroke=0.25
  ) +
  scale_size(name = "# IPs", label=scales::comma) +
  ggalt::coord_proj("+proj=wintri") +
  ggthemes::theme_map() +
  theme(legend.justification = "center") +
  theme(legend.position = "bottom")

enter image description here