Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Geolokalisierung einer großen Anzahl von Beiträgen basierend auf IP-Adressen. (880.000 Zeilen)

Wir generieren einige IP-Adressen, geolokalisieren sie und zeichnen sie auf:

library(iptools)
library(rgeolocate)
library(tidyverse)

Generieren Sie eine Million (viel zu gleichmäßig verteilte) zufällige IPv4-Adressen:

ips <- ip_random(1000000)

Und geolokalisiere sie:

system.time(
  rgeolocate::maxmind(
    ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
  ) -> xdf
)
##    user  system elapsed 
##   5.016   0.131   5.217 

5s für 1m IPv4s. 👍🏼

Aufgrund der Gleichförmigkeit werden die Blasen nun blöd klein sein, also runden wir sie nur für dieses Beispiel ein wenig auf:

xdf %>% 
  mutate(
    longitude = (longitude %/% 5) * 5,
    latitude = (latitude %/% 5) * 5
  ) %>%  
  count(longitude, latitude) -> pts

Und zeichnen Sie sie auf:

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")

Sie können sehen, was ich mit "zu einheitlich" meine. Aber Sie haben "echte" IPv4s, also sollten Sie gtg sein.

Erwägen Sie die Verwendung von scale_size_area() , aber erwägen Sie ehrlich gesagt, IPv4s überhaupt nicht auf einer Geokarte darzustellen. Ich recherchiere im Internet, um meinen Lebensunterhalt zu verdienen, und die Behauptungen über die Genauigkeit lassen zu wünschen übrig. Aus diesem Grund gehe ich selten unter die Zuordnung auf Länderebene (und wir zahlen für "echte" Daten).