-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #114 from arthur-schnitzler/274-plot-relations-geo…
…json-to-map 274 plot relations geojson to map
- Loading branch information
Showing
10 changed files
with
274 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
network/migrations/0003_edge_source_lat_edge_source_lng_edge_target_lat_and_more.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# Generated by Django 5.1.3 on 2024-12-09 12:18 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
("network", "0002_alter_edge_options_alter_edge_source_kind_and_more"), | ||
] | ||
|
||
operations = [ | ||
migrations.AddField( | ||
model_name="edge", | ||
name="source_lat", | ||
field=models.FloatField(blank=True, null=True, verbose_name="Breitengrad"), | ||
), | ||
migrations.AddField( | ||
model_name="edge", | ||
name="source_lng", | ||
field=models.FloatField(blank=True, null=True, verbose_name="Längengrad"), | ||
), | ||
migrations.AddField( | ||
model_name="edge", | ||
name="target_lat", | ||
field=models.FloatField(blank=True, null=True, verbose_name="Breitengrad"), | ||
), | ||
migrations.AddField( | ||
model_name="edge", | ||
name="target_lng", | ||
field=models.FloatField(blank=True, null=True, verbose_name="Längengrad"), | ||
), | ||
] |
41 changes: 41 additions & 0 deletions
41
network/migrations/0004_alter_edge_source_lat_alter_edge_source_lng_and_more.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# Generated by Django 5.1.3 on 2024-12-09 12:32 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
("network", "0003_edge_source_lat_edge_source_lng_edge_target_lat_and_more"), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterField( | ||
model_name="edge", | ||
name="source_lat", | ||
field=models.FloatField( | ||
blank=True, null=True, verbose_name="Breitengrad (Start)" | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="edge", | ||
name="source_lng", | ||
field=models.FloatField( | ||
blank=True, null=True, verbose_name="Längengrad (Start)" | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="edge", | ||
name="target_lat", | ||
field=models.FloatField( | ||
blank=True, null=True, verbose_name="Breitengrad (Ziel)" | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="edge", | ||
name="target_lng", | ||
field=models.FloatField( | ||
blank=True, null=True, verbose_name="Längengrad (Ziel)" | ||
), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
{% extends "base.html" %} | ||
{% load static %} | ||
{% block title %}Map{% endblock %} | ||
{% block scriptHeader %} | ||
{% endblock %} | ||
{% block content %} | ||
<style> | ||
#map { | ||
width: 100%; | ||
height: 700px; | ||
} | ||
</style> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.heat/0.2.0/leaflet-heat.js"></script> | ||
<div class="container-fluid pt-3"> | ||
<h1 class="display-3 text-center">Beziehungen zu Orten</h1> | ||
<div id="mapcontainer" class="p-4"> | ||
<div id="legend"></div> | ||
<div id="map"></div> | ||
</div> | ||
</div> | ||
<span id="url" class="visually-hidden" aria-hidden="true">{% url 'network:geojson' %}{% querystring %}</span> | ||
|
||
<script type="text/javascript"> | ||
const url = document.getElementById("url").textContent; | ||
console.log("fetching data") | ||
fetch(url) | ||
.then(response => { | ||
if (!response.ok) { | ||
throw new Error("Geojson response was not ok"); | ||
} | ||
return response.json(); | ||
}) | ||
.then(data => { | ||
var map = L.map('map') | ||
console.log(data["metadata"]) | ||
var OSMBaseLayer = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { | ||
maxZoom: 19, | ||
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' | ||
}).addTo(map); | ||
|
||
var CartoDB_PositronNoLabels = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png', { | ||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>', | ||
subdomains: 'abcd', | ||
maxZoom: 20 | ||
}); | ||
|
||
var CartoDB_DarkMatterNoLabels = L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png', { | ||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>', | ||
subdomains: 'abcd', | ||
maxZoom: 20 | ||
}); | ||
|
||
const markers = L.markerClusterGroup(); | ||
const geojsonLayer = L.geoJSON(data, { | ||
onEachFeature: function (feature, layer) { | ||
layer.bindPopup(feature.properties.label); | ||
}, | ||
pointToLayer: function (feature, latlng) { | ||
return L.marker(latlng); | ||
} | ||
}); | ||
markers.addTo(map); | ||
geojsonLayer.eachLayer(layer => markers.addLayer(layer)); | ||
|
||
var heatData = []; | ||
L.geoJSON(data, { | ||
onEachFeature: function (feature, layer) { | ||
if (feature.geometry.type === "Point") { | ||
var lat = feature.geometry.coordinates[1]; | ||
var lng = feature.geometry.coordinates[0]; | ||
heatData.push([lat, lng]); | ||
} | ||
} | ||
}); | ||
|
||
// Create the heatmap layer | ||
var heatmapLayer = L.heatLayer(heatData, { | ||
radius: 25, | ||
blur: 10, | ||
maxZoom: 17, | ||
max: 0.7, | ||
gradient: {0: 'white', 0.5: 'lime', 1: 'red'}, | ||
|
||
}); | ||
|
||
var baseMaps = { | ||
"Base Layer": OSMBaseLayer, | ||
"CartoDB hell": CartoDB_PositronNoLabels, | ||
"CartoDB dunkel": CartoDB_DarkMatterNoLabels | ||
}; | ||
|
||
const overlayMaps = { | ||
"Marker Cluster": markers, | ||
"Heatmap": heatmapLayer | ||
}; | ||
|
||
L.control.layers(baseMaps, overlayMaps, { collapsed: false }).addTo(map); | ||
map.fitBounds(geojsonLayer.getBounds()); | ||
}) | ||
.catch(error => { | ||
console.error("Something went wrong:", error); | ||
}); | ||
|
||
</script> | ||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,12 @@ | ||
from django.urls import path | ||
from network.views import EdgeListViews, network_data, NetworkView | ||
from network.views import EdgeListViews, network_data, NetworkView, edges_as_geojson, MapView | ||
|
||
|
||
app_name = "network" | ||
urlpatterns = [ | ||
path("edges/", EdgeListViews.as_view(), name="edges_browse"), | ||
path("csv/", network_data, name="data"), | ||
path("network-data/", network_data, name="data"), | ||
path("network/", NetworkView.as_view(), name="network"), | ||
path("geojson-data/", edges_as_geojson, name="geojson"), | ||
path("map/", MapView.as_view(), name="map"), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import pandas as pd | ||
|
||
|
||
def df_to_geojson_vect( | ||
df: pd.DataFrame, properties: list, lat="latitude", lon="longitude" | ||
) -> tuple: | ||
"""converts a dataframe into a geojson | ||
taken from https://blog.finxter.com/5-best-ways-to-convert-a-pandas-dataframe-to-geojson/ | ||
Args: | ||
df (pd.DataFrame): a pandas DataFrame | ||
properties (list): column keys which should be used as properties | ||
lat (str, optional): the name of the column holding the latitute. Defaults to 'latitude'. | ||
lon (str, optional): the anem of the column holding the longitute. Defaults to 'longitude'. | ||
Returns: | ||
tuple: (lat, long) | ||
""" | ||
features = df.apply( | ||
lambda row: { | ||
"type": "Feature", | ||
"geometry": { | ||
"type": "Point", | ||
"coordinates": [row[lon], row[lat]], | ||
}, | ||
"properties": {prop: row[prop] for prop in properties}, | ||
}, | ||
axis=1, | ||
).tolist() | ||
return {"type": "FeatureCollection", "features": features} | ||
|
||
|
||
def get_coords(row): | ||
if pd.isna(row["source_lat"]): | ||
return (row["target_lat"], row["target_lng"]) | ||
else: | ||
return row["source_lat"], row["source_lng"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,10 +19,12 @@ | |
<meta name="msapplication-TileColor" content="#da532c"> | ||
<meta name="msapplication-config" content="{% static 'img/browserconfig.xml' %}"> | ||
<meta name="theme-color" content="#ffffff"> | ||
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" | ||
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" /> | ||
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" | ||
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script> | ||
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" /> | ||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.Default.css" /> | ||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.css" /> | ||
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> | ||
<script src="https://unpkg.com/leaflet.markercluster/dist/leaflet.markercluster.js"></script> | ||
|
||
<script type="text/javascript"> | ||
var _paq = _paq || []; | ||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */ | ||
|