Mysql
 sql >> Base de données >  >> RDS >> Mysql

Géolocalisation d'un grand nombre de messages en fonction des adresses IP. (880 000 lignes)

Nous allons générer des adresses IP, les géolocaliser et les tracer :

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

Générez un million d'adresses IPv4 aléatoires (trop uniformément réparties) :

ips <- ip_random(1000000)

Et, géolocalisez-les :

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

5s pour 1m IPv4s. 👍🏼

Maintenant, en raison de l'uniformité, les bulles seront stupides, donc juste pour cet exemple, nous allons les arrondir un peu :

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

Et tracez-les :

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

Vous pouvez voir ce que je veux dire par "trop ​​uniforme". Mais, vous avez de "vrais" IPv4, vous devriez donc être gtg.

Envisagez d'utiliser scale_size_area() , mais, honnêtement, envisagez de ne pas tracer du tout les IPv4 sur une carte géographique. Je fais des recherches sur Internet pour gagner ma vie et les revendications d'exactitude laissent beaucoup à désirer. Je vais rarement en dessous de l'attribution au niveau du pays pour cette raison (et nous payons pour des données "réelles").