在上一个问题中,我提出了一个带有IP的“帖子”表,并且希望对其进行地理位置定位。 Geolocating a large number of posts based on IP Addresses. (880,000 rows)
答案显示了如何使用rgeolocate来实现这一目标,并且在学习R方面做了一些努力之后,我设法达到了相同的结果:
object_id
结果显示在这里:
此图根据数据准确显示了我期望的分组类型。所以成功的第一步!
当然,下一个逻辑步骤是增加分辨率并添加世界地图的叠加层。我一直无法实现这些目标。
使用此代码,我可以制作高分辨率的世界地图:
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")
结果显示在这里:
以某种方式我无法实现地图和正在绘制的数据的组合。似乎任何创建地图的尝试都需要我自己绘制地图,而任何向该点添加点的尝试都将失败。例如:
newmap <- getMap(resolution = "high")
plot(newmap)
错误:ggmap绘制了ggmap类的对象,请参见?get_map
我一直在尝试根据http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/的建议进行工作,但是该网站专注于欧洲地图,我想在世界地图上显示我的数据。
谢谢您的帮助。
答案 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")