sql >> Database teknologi >  >> RDS >> Mysql

Geolokalisering af et stort antal indlæg baseret på IP-adresser. (880.000 rækker)

Vi genererer nogle IP-adresser, geolokaliserer dem og plotter dem:

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

Generer en million (alt for ensartet fordelt) tilfældige IPv4-adresser:

ips <- ip_random(1000000)

Og geolokaliser dem:

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

5s til 1m IPv4s. 👍🏼

Nu på grund af ensartetheden vil boblerne være dumme små, så bare for dette eksempel vil vi runde dem lidt op:

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

Og plot dem:

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

Du kan se, hvad jeg mener med "for ensartet". Men du har "rigtige" IPv4'er, så du burde være gtg.

Overvej at bruge scale_size_area() , men ærlig talt, overvej slet ikke at plotte IPv4'er på et geo-kort. Jeg laver research på internet-skala til livets ophold, og påstandene om nøjagtighed lader meget tilbage at ønske. Jeg går sjældent under tilskrivning på landeniveau af den grund (og vi betaler for "rigtige" data).




  1. ASPNETDB.mdf til MySQL

  2. Grundlæggende om SQL Server ALTER TABLE-erklæring

  3. MySQL tæller på hinanden følgende datoer for den aktuelle streak

  4. Mysql Time-typen giver et ArgumentError:argument uden for rækkevidde i Rails, hvis det er over 24 timer