sql >> Databasteknik >  >> RDS >> Mysql

Geolokalisera ett stort antal inlägg baserat på IP-adresser. (880 000 rader)

Vi kommer att generera några IP-adresser, geolokalisera tem och plotta dem:

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

Generera en miljon (alldeles för enhetligt fördelade) slumpmässiga IPv4-adresser:

ips <- ip_random(1000000)

Och geolokalisera dem:

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. 👍🏼

Nu på grund av enhetligheten kommer bubblorna att vara dumma små, så bara för det här exemplet kommer vi att avrunda dem lite:

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

Och rita 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 vad jag menar med "för enhetlig". Men du har "riktiga" IPv4:er, så du borde vara gtg.

Överväg att använda scale_size_area() , men ärligt talat, överväg att inte plotta IPv4s på en geokarta alls. Jag gör internet-skala forskning för en levande och noggrannhet påståenden lämnar mycket övrigt att önska. Jag går sällan under tillskrivning på landsnivå av den anledningen (och vi betalar för "riktiga" data).




  1. När ska man LÅSA TABELLER i MySQL (MyISAM-tabeller)?

  2. Hur man aktiverar en CHECK-begränsning i SQL Server (T-SQL-exempel)

  3. ignorerar mysql fulltext stoppord i frågan

  4. Hur kan jag få MySQL att skriva utfiler som en annan användare?