Benutzer-Werkzeuge

Webseiten-Werkzeuge


stuff:memberdensity

Density der LuXeria Mitglieder (2018)

Ein kleines Experiment um grafisch darzustellen, woher denn unsere LuXeria Mitglieder kommen. (Powershell, R)

Um die Daten grafisch darzustellen, benötigen wir in erster Linie die Koordinaten der einzelnen Mitglieder. Dies kann natürlich mühsam von Hand nachgeschaut werden. Jedoch hat Google Maps eine API mit der nach Adressen gesucht werden kann, und Koordinaten zurück liefert. (Die Geocode API) Mittels einen kleinen Script (ich habe Powershell verwendet), kann man zu allen Adressen die Latitude und Longitude in ein CSV abspeichern.

  $api = "google api key"
  $requrl = "https://maps.googleapis.com/maps/api/geocode/json?"
  # Adresse; PLZ
  $mitglieder = import-csv "C:\dev\mitglieder.CSV" -Delimiter ";"
  for($i = 1; $i -lt $mitglieder.Length; $i++){
      $reqstring = $requrl + "address=" + $mitglieder.adresse[$i] + "+" + $mitglieder.plz[$i] +   "+Switzerland" + "&key=" + $api
      $coords = Invoke-WebRequest $reqstring | convertFrom-json
      $latlon = $coords | select -expand results | select -expand geometry | select -expand location
      $latlon | export-csv c:\dev\latlon.csv -NoTypeInformation -append
  }

Nun sind die Daten ready um mit R bearbeitet zu werden! Ich habe folgende Packages verwendet: ggmap und ggplot2.

Mit einem kleinen Trick (Die Koordinaten als Normalverteilung und einer Standardabweichung der diese ein bisschen streut) können diese als Heatmap angezeigt werden, hier das Script dazu:

  library(ggmap)
  library(ggplot2)
  latlong <- read.csv("C:/dev/latlon.csv", sep="," )
  positions <- data.frame(lon=rnorm(20000, mean=latlong$lng, sd=0.05),
                          lat=rnorm(10000,mean=latlong$lat, sd=0.05))
  map <- get_map(location=c(lon=8.348644,
                            lat=47.071813), zoom=9, maptype='roadmap', color='bw')#Get the map from Google Maps
  ggmap(map, extent = "device") +
    geom_density2d(data = positions, aes(x = lon, y = lat), size = 0.3) + 
    stat_density2d(data = positions, 
                   aes(x = lon, y = lat, fill = ..level.., alpha = ..level..), size = 0.01, 
                   bins = 16, geom = "polygon") + scale_fill_gradient(low = "green", high = "red") + 
    scale_alpha(range = c(0, 0.3), guide = FALSE)
stuff/memberdensity.txt · Zuletzt geändert: 2018/02/06 16:29 von anni