我已经从参与者中提取了160多个IP地址的列表,我希望在世界地图上绘制该调查。想知道是否有R包。我还在CSV列中有IP。
答案 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))
您可能必须安装软件包XML
,RDSTK
和rworldmap
。
答案 2 :(得分:0)
您需要将工作分解为多个流程。
将IP映射到lat-long坐标。 参考Geocode an IP address? 或寻找提供此功能的API。
使用httr :: get或Rcurl将您的IP传递给API。 返回格式将采用JSON或XML(大多数情况),您需要 要解析为长期的RJSONIO或XML库
世界地图 您可以使用maps,rworldmap包(或ggmap ...)来创建地图。然后投射 你的lat-long使用你选择的任何方法(如点......)
你提出的问题比你想象的要复杂得多,你或许想问一下 在上述每个步骤中单独提问或搜索答案。