feat: show radius and center map
This commit is contained in:
		@@ -6,16 +6,24 @@
 | 
				
			|||||||
<script src="{% settings_value "MAP_TILE_SERVER" %}/assets/maplibre-gl/maplibre-gl.js"></script>
 | 
					<script src="{% settings_value "MAP_TILE_SERVER" %}/assets/maplibre-gl/maplibre-gl.js"></script>
 | 
				
			||||||
<link href="{% settings_value "MAP_TILE_SERVER" %}/assets/maplibre-gl/maplibre-gl.css" rel="stylesheet"/>
 | 
					<link href="{% settings_value "MAP_TILE_SERVER" %}/assets/maplibre-gl/maplibre-gl.css" rel="stylesheet"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- add Turf see https://maplibre.org/maplibre-gl-js/docs/examples/draw-a-radius/ -->
 | 
				
			||||||
 | 
					<script src="{% static 'fellchensammlung/js/turf.min.js' %}"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- add container for the map -->
 | 
					<!-- add container for the map -->
 | 
				
			||||||
<div id="map" style="width:100%;aspect-ratio:16/9"></div>
 | 
					<div id="map" style="width:100%;aspect-ratio:16/9"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- start map -->
 | 
					<!-- start map -->
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
 | 
					    {% if map_center %}
 | 
				
			||||||
 | 
					        var center = [{{ map_center.longitude }}, {{ map_center.latitude }}];
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					        var center = [10.49, 50.68];
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let map = new maplibregl.Map({
 | 
					    let map = new maplibregl.Map({
 | 
				
			||||||
        container: 'map',
 | 
					        container: 'map',
 | 
				
			||||||
        style: '{% static "fellchensammlung/map/styles/colorful.json" %}',
 | 
					        style: '{% static "fellchensammlung/map/styles/colorful.json" %}',
 | 
				
			||||||
        center: [10.49, 50.68],
 | 
					        center: center,
 | 
				
			||||||
        zoom: 5
 | 
					        zoom: 5
 | 
				
			||||||
    }).addControl(new maplibregl.NavigationControl());
 | 
					    }).addControl(new maplibregl.NavigationControl());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,4 +45,42 @@
 | 
				
			|||||||
                .addTo(map);
 | 
					                .addTo(map);
 | 
				
			||||||
        {% endif %}
 | 
					        {% endif %}
 | 
				
			||||||
    {% endfor %}
 | 
					    {% endfor %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    map.on('load', () => {
 | 
				
			||||||
 | 
					        const radius = {{ search_radius }}; // kilometer
 | 
				
			||||||
 | 
					        const options = {
 | 
				
			||||||
 | 
					            steps: 64,
 | 
				
			||||||
 | 
					            units: 'kilometers'
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        const circle = turf.circle(center, radius, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Add the circle as a GeoJSON source
 | 
				
			||||||
 | 
					        map.addSource('location-radius', {
 | 
				
			||||||
 | 
					            type: 'geojson',
 | 
				
			||||||
 | 
					            data: circle
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Add a fill layer with some transparency
 | 
				
			||||||
 | 
					        map.addLayer({
 | 
				
			||||||
 | 
					            id: 'location-radius',
 | 
				
			||||||
 | 
					            type: 'fill',
 | 
				
			||||||
 | 
					            source: 'location-radius',
 | 
				
			||||||
 | 
					            paint: {
 | 
				
			||||||
 | 
					                'fill-color': '#8CCFFF',
 | 
				
			||||||
 | 
					                'fill-opacity': 0.5
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Add a line layer to draw the circle outline
 | 
				
			||||||
 | 
					        map.addLayer({
 | 
				
			||||||
 | 
					            id: 'location-radius-outline',
 | 
				
			||||||
 | 
					            type: 'line',
 | 
				
			||||||
 | 
					            source: 'location-radius',
 | 
				
			||||||
 | 
					            paint: {
 | 
				
			||||||
 | 
					                'line-color': '#0094ff',
 | 
				
			||||||
 | 
					                'line-width': 3
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
from math import radians, sqrt, sin, cos, atan2
 | 
					from math import radians, sqrt, sin, cos, atan2
 | 
				
			||||||
@@ -6,6 +8,8 @@ from math import radians, sqrt, sin, cos, atan2
 | 
				
			|||||||
from notfellchen import __version__ as nf_version
 | 
					from notfellchen import __version__ as nf_version
 | 
				
			||||||
from notfellchen import settings
 | 
					from notfellchen import settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Position = namedtuple('Position', ['latitude', 'longitude'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def calculate_distance_between_coordinates(position1, position2):
 | 
					def calculate_distance_between_coordinates(position1, position2):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .geo import GeoAPI, LocationProxy
 | 
					from .geo import LocationProxy, Position
 | 
				
			||||||
from ..forms import AdoptionNoticeSearchForm
 | 
					from ..forms import AdoptionNoticeSearchForm
 | 
				
			||||||
from ..models import SearchSubscription, AdoptionNotice, AdoptionNoticeNotification, SexChoicesWithAll, Location
 | 
					from ..models import SearchSubscription, AdoptionNotice, AdoptionNoticeNotification, SexChoicesWithAll, Location
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,6 +69,13 @@ class Search:
 | 
				
			|||||||
        except ValueError:
 | 
					        except ValueError:
 | 
				
			||||||
            self.place_not_found = True
 | 
					            self.place_not_found = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def position(self):
 | 
				
			||||||
 | 
					        if self.area_search and not self.place_not_found:
 | 
				
			||||||
 | 
					            return Position(latitude=self.location.latitude, longitude=self.location.longitude)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def adoption_notice_fits_search(self, adoption_notice: AdoptionNotice):
 | 
					    def adoption_notice_fits_search(self, adoption_notice: AdoptionNotice):
 | 
				
			||||||
        # Make sure sex is set and sex is not set to all (then it can be disregarded)
 | 
					        # Make sure sex is set and sex is not set to all (then it can be disregarded)
 | 
				
			||||||
        if self.sex is not None and self.sex != SexChoicesWithAll.ALL:
 | 
					        if self.sex is not None and self.sex != SexChoicesWithAll.ALL:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -195,12 +195,15 @@ def search(request):
 | 
				
			|||||||
        subscribed_search = search.get_subscription_or_none(request.user)
 | 
					        subscribed_search = search.get_subscription_or_none(request.user)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        subscribed_search = None
 | 
					        subscribed_search = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    context = {"adoption_notices": search.get_adoption_notices(),
 | 
					    context = {"adoption_notices": search.get_adoption_notices(),
 | 
				
			||||||
               "search_form": search.search_form,
 | 
					               "search_form": search.search_form,
 | 
				
			||||||
               "place_not_found": search.place_not_found,
 | 
					               "place_not_found": search.place_not_found,
 | 
				
			||||||
               "subscribed_search": subscribed_search,
 | 
					               "subscribed_search": subscribed_search,
 | 
				
			||||||
               "searched": searched,
 | 
					               "searched": searched,
 | 
				
			||||||
               "adoption_notices_map": AdoptionNotice.get_active_ANs()}
 | 
					               "adoption_notices_map": AdoptionNotice.get_active_ANs(),
 | 
				
			||||||
 | 
					               "map_center": search.position,
 | 
				
			||||||
 | 
					               "search_radius": search.max_distance,}
 | 
				
			||||||
    return render(request, 'fellchensammlung/search.html', context=context)
 | 
					    return render(request, 'fellchensammlung/search.html', context=context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user