2016-08-04 29 views
1

Ich habe ein Datenfeld, bestehend aus IP-Adressen und entsprechenden Werten. Ich möchte diese IP-Adressen (umgewandelt in Geospatialkoordinaten) und entsprechende Werte als eine Blasenkarte visualisieren.Wie kann ich IPs in Adressen konvertieren und diese Adressen dann nach Stadt gruppieren?

Das Problem ist, dass einige dieser IP-Adressen in der gleichen Stadt sind. Dies bedeutet, dass ich mehrere Blasen in fast genau der gleichen Fläche habe, die ich eher in einer einzigen Blase kombiniert sehe.

Bisher, was ich habe versucht, die IP-Adressen konvertiert -> Lat und Long (ip2coordinates von RDSTK) -> Adressen (mit coordinates2politics von RDSTK) und dann CartoDB Verwendung dieser Städtenamen zu konvertieren um sie dort zu Koordinaten und Plotten .

Ich habe coordinates <- lapply(ips$field_1, ip2coordinates) ausgeführt, aber anstatt einen Datenrahmen zurückgeben, gibt es eine lange (und nutzlos) Liste.

Was ist eine alternative Art zu tun, was ich versuche zu tun?

+0

Wie wäre es mit 'Koordinaten <- data.frame (sapply (ips $ field_1, ip2coordinates))'? – aichao

+0

Es scheint, dass ich meine API-Call-Grenze erreicht habe: 'Fehler in der Funktion (Typ, msg, asError = TRUE): Leere Antwort vom Server' –

Antwort

2

Keine Notwendigkeit für die klobige 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

Oder ist ihnen:

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

Sie könnte auch Kreis nach Regionen (Land, Staat usw.) und zeichne dann die Kreise in den Zentren jeder Regio n.

+0

Ich werde es in ein paar Stunden ausprobieren, aber es sieht perfekt aus! Vielen Dank! –

+0

@hrbmstr '> ip_geo <- maxmind (ips," GeoLite2-City.mmdb ", c (" country_name "," city_name "," Längengrad "," latitude "))' führt zu 'Error: nicht kompatibel mit STRSXP ' –

+0

Es sind meine eigenen IP-Adressen. Sie sind in der Tat Faktoren, aber ich habe Probleme, sie zu konvertieren. Ich versuchte 'i <- sapply (grouped_ips $., Is.factor)' 'gruppierte_ips $. [I] <- lapply (grouped_ips $. [I], as.character)' wie von http empfohlen: // stackoverflow. com/a/2853231/5472184 aber es funktioniert nicht –