2016-08-04 4 views
1

У меня есть dataframe, состоящий из IP-адресов и соответствующих значений. Я хочу визуализировать эти IP-адреса (преобразованные в геопространственные координаты) и соответствующие значения в виде карты пузырьков.Как конвертировать IP-адреса в адреса, а затем группировать их по городам?

Проблема в том, что некоторые из этих IP-адресов находятся в одном городе. Это означает, что у меня есть несколько пузырьков почти в той же самой области, которую я предпочел бы видеть объединенным в один пузырь.

До сих пор, что я попытался это преобразование IP-адреса -> Lat и Long (ip2coordinates от RDSTK) -> адреса (с использованием coordinates2politics из RDSTK), а затем с помощью CartoDB, чтобы преобразовать эти названия городов в координаты и черчения их там ,

Я запустил coordinates <- lapply(ips$field_1, ip2coordinates), но вместо того, чтобы возвращать dataframe, он возвращает длинный (и бесполезный) список.

Какой альтернативный способ сделать то, что я пытаюсь сделать?

+0

Как насчет 'координат <- data.frame (sapply (ips $ field_1, ip2coordinates))'? – aichao

+0

Кажется, я достиг потолка API: 'Ошибка в функции (тип, msg, asError = TRUE): Пустой ответ с сервера –

ответ

2

Нет необходимости в неуклюжих DSTK:

library(iptools) 
library(rgeolocate) 
library(dplyr) 
library(ggplot2) 
library(ggalt) 

URL <- "http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz" 
fil <- basename(URL) 
if (!file.exists(fil)) download.file(URL, fil) 
R.utils::gunzip(fil, overwrite=TRUE) 

ips <- ip_random(10000) 
ip_geo <- maxmind(ips, "GeoLite2-City.mmdb", c("country_name", "city_name", "longitude", "latitude")) 

count(ip_geo, longitude, latitude, sort=TRUE) %>% 
    filter(!is.na(longitude)) -> for_circles 

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

gg <- ggplot() 
gg <- gg + geom_map(data=world_map, map=world_map, 
        aes(long, lat, map_id=region), 
        colour="#2b2b2b", size=0.15, fill=NA) 
gg <- gg + geom_point(data=for_circles, 
         aes(x=longitude, y=latitude, size=n), 
         shape=21, stroke=0.15, alpha=1.8/2, color="#b2182b") 
gg <- gg + scale_size_continuous(trans="log10") 
gg <- gg + coord_proj("+proj=wintri") 
gg <- gg + ggthemes::theme_map() 
gg 

enter image description here

Или, бен им:

pts <- hexbin(ip_geo$longitude, ip_geo$latitude, xbins=5) 
from_hex <- data_frame([email protected], [email protected], [email protected]) 

gg <- ggplot() 
gg <- gg + geom_map(data=world_map, map=world_map, 
        aes(long, lat, map_id=region), 
        colour="#2b2b2b", size=0.15, fill=NA) 
gg <- gg + geom_point(data=from_hex, aes(x, y, size=n), 
         shape=21, stroke=0.5, color="#b2182b", fill="#b2182b22") 
gg <- gg + scale_size_continuous(trans="sqrt") 
gg <- gg + coord_proj("+proj=wintri") 
gg <- gg + ggthemes::theme_map() 
gg 

enter image description here

Вы могли бы также округа по регионам (страна, государство , и т. д.), а затем нарисуйте круги в центрах каждого региона п.

+0

Я попробую его через пару часов, но он выглядит идеально! Благодаря! –

+0

@hrbmstr '> ip_geo <- maxmind (ips," GeoLite2-City.mmdb ", c (" country_name "," city_name "," longitude "," широта "))' приводит к ошибке: несовместимо с STRSXP ' –

+0

Это мои собственные IP-адреса. Они на самом деле являются факторами, но у меня проблемы с их преобразованием. Я попробовал 'i <- sapply (grouped_ips $., Is.factor)' 'grouped_ips $. [I] <- lapply (grouped_ips $. [I], as.character)', как рекомендовано http: // stackoverflow. com/a/2853231/5472184, но он не работает –