使用R在世界地图上绘制多个IP地址

时间:2014-08-13 17:26:15

标签: r ggplot2 geolocation

我已经从参与者中提取了160多个IP地址的列表,我希望在世界地图上绘制该调查。想知道是否有R包。我还在CSV列中有IP。

3 个答案:

答案 0 :(得分:3)

以下是使用www.freegeoip.net对IP地址进行地理编码的方法,以及ggplot来制作地图。

# some IP addresses - you have this already...
ips <- c(Louvre           ="213.139.122.103",
         British.Museum   ="195.224.71.221",
         Museo.del.Prado  ="213.27.146.137",
         Grand.Egyptian   ="163.121.93.15",
         Hermitage.Museum ="213.152.151.197",
         MBNA             ="200.218.240.120",
         Sydney.Museum    ="54.252.89.136",
         MOMA             ="63.117.124.131")

# you start here...
library(XML)
library(httr)
library(ggplot2)
get.geocode <- function(ip) {  # returns lat/long given an ip address
  url   <- "http://www.freegeoip.net"
  xml   <- content(GET(url,path=paste("xml",ip,sep="/")),type="text/xml")
  xpath <- c(lat="//Latitude",long="//Longitude")
  sapply(xpath,function(xp) as.numeric(xmlValue(xml[xp][[1]])))
}
locs <- data.frame(t(sapply(ips,get.geocode)))
library(ggplot2)
ggplot(locs, aes(x=long,y=lat))+ 
  borders("world", color="grey50", fill="grey90")+
  geom_point(color="red", size=3)+
  labs(x="",y="")+
  theme_bw() + theme(axis.text=element_blank(),axis.ticks=element_blank())+
  coord_fixed()

注意事项。 RDSTK包是Data Science Toolkit API的包装器。虽然我喜欢这个想法,但我发现DSK有点古怪。除此之外,它不一定能找到每个合法的IP地址。例如,当我使用上面的数据集运行另一个答案时,它只能找到8个IP中的4个。此外,他们的“批量”API,使用POST一次获取多个结果,并不一定与它的GET接口(每个http请求获取一个结果)的工作方式相同。请参阅this post

如果这是针对客户端的,我会使用其中一个商业Web服务(例如MaxMind)来对IP地址进行地理编码并从中进行工作。只有160个IP,几乎没有任何费用。

此外,borders(...)使用worldHires包中的mapdata数据集,正如您所看到的,这不是很好。我倾向于下载更好的数据集,例如world map on GADM

答案 1 :(得分:1)

以下是一种方法:

# grab example data
library(XML)
tab <- readHTMLTable("http://www.ip-adress.com/proxy_list/", which = 1)[-1, c(1, 3)]
names(tab) <- c("ip.address", "country")
tab$ip.address <- sub(":.*", "", tab$ip.address)

# ip to location
library(RDSTK)
loc <- ip2coordinates(ip = paste(tab$ip.address, collapse=", "))
df <- merge(x = tab, y = loc, by = "ip.address", all.x = TRUE)
na.omit(df) # print matches

# plot
library(rworldmap)
par(mar = rep(0, 4)) 
plot(getMap())
with(df, points(x = longitude, y = latitude, col = "red", pch = 19))

enter image description here

您可能必须安装软件包XMLRDSTKrworldmap

答案 2 :(得分:0)

您需要将工作分解为多个流程。

  1. 将IP映射到lat-long坐标。 参考Geocode an IP address? 或寻找提供此功能的API。

  2. 使用httr :: get或Rcurl将您的IP传递给API。 返回格式将采用JSON或XML(大多数情况),您需要 要解析为长期的RJSONIO或XML库

  3. 世界地图 您可以使用maps,rworldmap包(或ggmap ...)来创建地图。然后投射 你的lat-long使用你选择的任何方法(如点......)

  4. 你提出的问题比你想象的要复杂得多,你或许想问一下 在上述每个步骤中单独提问或搜索答案。