Django 지도(제1부분): GeoDjango, SpatiaLite, 전단지
28989 단어 djangopythontutorialjavascript
소개하다.
이 설명서에서는 Django(Python 기반 웹 프레임워크)를 사용하여 최소한의 웹 지도를 만드는 방법을 살펴봅니다. 기본 항목부터 몇 줄의 코드를 작성하고 최소한 다른 소프트웨어를 추가하는 방법입니다.
요구 사항
프로젝트 만들기
다음 명령을 사용하여 작업공간 디렉토리에 기본 항목을 작성해야 합니다.
$ django-admin startproject mymap
이렇게 하면 디렉토리mymap
가 다음과 같이 배치됩니다.mymap/
├── manage.py
└── mymap
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
Markers 응용 프로그램 만들기
응용 프로그램을 만들려면
manage.py
와 같은 디렉토리에 있는지 확인하고 다음 명령을 입력합니다.$ python manage.py startapp markers
이렇게 하면 디렉토리markers
가 다음과 같이 배치됩니다.markers/
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
Markers 응용 프로그램 활성화
설치된 적용 설정 수정
markers
에 INSTALLED_APPS
에 mymap/settings.py
추가INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"markers",
]
빈 웹 맵 추가
응용 프로그램에 빈 웹 페이지를 추가합니다.
템플릿 뷰 추가
TemplateView
에 views.py
을(를) 추가해야 합니다."""Markers view."""
from django.views.generic.base import TemplateView
class MarkersMapView(TemplateView):
"""Markers map view."""
template_name = "map.html"
맵 템플릿 추가
templates/
에 markers/
디렉토리를 추가해야 합니다.$ mkdir templates
및 map.html
의 markers/templates/
템플릿:{% load static %}
<!doctype html>
<html lang="en">
<head>
<title>Markers Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="{% static 'map.css' %}">
<link rel="stylesheet" type="text/css" href="https://unpkg.com/[email protected]/dist/leaflet.css">
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
</head>
<body>
<div id="map"></div>
<script src="{% static 'map.js' %}"></script>
</body>
</html>
javascript와 css 파일 추가
static/
에 markers/
디렉토리를 추가해야 합니다.$ mkdir static
map.css
에 markers/static/
스타일시트를 추가합니다.html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
map.js
에 markers/static/
스타일시트를 추가합니다.const attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
const map = L.map('map')
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: attribution }).addTo(map);
map.fitWorld();
새 URL 추가
urls.py
에 markers/
개의 파일을 추가합니다."""Markers urls."""
from django.urls import path
from .views import MarkersMapView
app_name = "markers"
urlpatterns = [
path("map/", MarkersMapView.as_view()),
]
urls.py
에서 수정mymap/
:"""mymap URL Configuration."""
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("markers/", include("markers.urls")),
]
테스트 네트워크 맵
현재 다음 명령을 실행하여 빈 웹 지도를 테스트할 수 있습니다.
$ python manage.py runserver
이제 서버가 실행되었으므로 웹 브라우저를 사용하여 액세스http://127.0.0.1:8000/markers/map/하십시오.'지도 표시' 페이지와 완전한 페이지 지도를 볼 수 있습니다.성공했어!빈 인터넷 지도 페이지
지리적 피쳐 추가
SpatiaLite 설치
설치
SQLite
공간 확장 SpatiaLite
:$ apt install libsqlite3-mod-spatialite
$ brew install spatialite-tools
데이터베이스 엔진 변경
DATABASES
에서 기본 엔진 수정 mymap/settings.py
DATABASES = {
"default": {
"ENGINE": "django.contrib.gis.db.backends.spatialite",
"NAME": BASE_DIR / "db.sqlite3",
}
}
잔고
설치된 적용 설정 수정
GeoDjango
에 INSTALLED_APPS
에 mymap/settings.py
추가INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.gis",
"markers",
]
태그 추가
지금 우리는 지도에 약간의 표시를 추가할 수 있다.
마커 모델 추가하기
우리는
Marker
에 markes/models.py
모델을 추가할 것이다."""Markers models."""
from django.contrib.gis.db.models import PointField
from django.db import models
class Marker(models.Model):
"""A marker with name and location."""
name = models.CharField(max_length=255)
location = PointField()
이제 새 모델에 대한 마이그레이션을 생성해야 합니다.$ python manage.py makemigrations
그런 다음 이 마이그레이션을 SQLite
데이터베이스에 적용합니다.$ python manage.py migrate
태그 관리자 활성화
새 태그를 삽입하려면
markes/admin.py
에 태그 관리자를 추가해야 합니다."""Markers admin."""
from django.contrib.gis import admin
from .models import Marker
@admin.register(Marker)
class MarkerAdmin(admin.OSMGeoAdmin):
"""Marker admin."""
list_display = ("name", "location")
테스트 관리자
로그인하여 테스트할 관리자 사용자를 만들어야 합니다.
$ python manage.py createsuperuser
이제 다음 명령을 실행하는 관리자를 테스트할 수 있습니다.$ python manage.py runserver
이제 서버가 실행되었으므로 웹 브라우저를 사용하여 액세스http://127.0.0.1:8000/admin/markers/marker/add/하십시오.맵의 작은 위젯이 있는 새 표시를 추가하는 '표시' 관리 페이지를 볼 수 있습니다.나는 최근에 등반한 산봉우리에 "몬테아마로 2793미터"라는 표시를 붙였다.🇮🇹"관리 페이지에 태그를 추가합니다.
네트워크 맵의 모든 태그 표시
뷰에 모든 태그 추가
우리는
serializer
의 GeoJSON
상하문에 MarkersMapView
의 모든 표시를 markes/views.py
로 추가할 수 있다."""Markers view."""
import json
from django.core.serializers import serialize
from django.views.generic.base import TemplateView
from .models import Marker
class MarkersMapView(TemplateView):
"""Markers map view."""
template_name = "map.html"
def get_context_data(self, **kwargs):
"""Return the view context data."""
context = super().get_context_data(**kwargs)
context["markers"] = json.loads(serialize("geojson", Marker.objects.all()))
return context
markes
사전의 context
키 값은 다음과 같습니다.{
"type": "FeatureCollection",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"features": [
{
"type": "Feature",
"properties": {
"name": "Monte Amaro 2793m \ud83c\uddee\ud83c\uddf9",
"pk": "1"
},
"geometry": {
"type": "Point",
"coordinates": [
14.08591836494682,
42.08632592463349
]
}
}
]
}
템플릿에 GeoJSON 삽입
json_script
내장 필터를 사용하면 Python dict와 모든 태그를 GeoJSON
inmarkers/templates/map.html
으로 안전하게 출력할 수 있습니다.{% load static %}
<!doctype html>
<html lang="en">
<head>
<title>Markers Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="{% static 'map.css' %}">
<link rel="stylesheet" type="text/css" href="https://unpkg.com/[email protected]/dist/leaflet.css">
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
</head>
<body>
{{ markers|json_script:"markers-data" }}
<div id="map"></div>
<script src="{% static 'map.js' %}"></script>
</body>
</html>
맵의 모든 태그 렌더링
우리는
GeoJSON
의 Leaflet
렌더링markers/static/map.js
과 네트워크 맵의 모든 태그를 사용할 수 있습니다.const attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
const map = L.map('map')
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: attribution }).addTo(map);
const markers = JSON.parse(document.getElementById('markers-data').textContent);
let feature = L.geoJSON(markers).bindPopup(function (layer) { return layer.feature.properties.name; }).addTo(map);
map.fitBounds(feature.getBounds(), { padding: [100, 100] });
채워진 맵 테스트
나는 지도에 그것들을 표시하기 위해 세계에서 가장 높은 점이나 가장 낮은 점의 다른 표시를 채웠다.
다음 명령을 실행하여 채워진 웹 맵을 테스트할 수 있습니다.
$ python manage.py runserver
이제 서버가 실행되었으므로 웹 브라우저를 사용하여 액세스http://127.0.0.1:8000/markers/map/하십시오.너는 완전한 지도와 모든 표시가 있는 '지도 표시' 페이지를 볼 수 있을 것이다.성공했어!지도에는 내가 세계에서 방문한 최고점이나 최저점의 표시가 있고 내가 최근에 등반한 산봉우리의 팝업 창이 열렸다.
지도에는 내가 세계에서 방문한 최고점이나 최저점의 표시가 있고 내가 최근에 등반한 산봉우리의 팝업 창이 열렸다.
호기심
내가 최근에 아마로 산 정상에 간 도보 여행에 대해 더 알고 싶다면, 내 비키 계정Round trip hike from Rifugio Pomilio to Monte Amaro 🔗에서 볼 수 있다.
결론
우리는 외부 서비스를 사용하지 않고 최소한의 소프트웨어를 사용하려는 전체 기능 지도의 예시를 보여 주었다.
이 지도는 SQLite와 Django 템플릿을 사용하는 간단한 항목에 몇 개의 점을 표시하기에 충분하다.
미래의 글에서 우리는 Django Rest 프레임워크, PostGIS 등을 어떻게 사용해서 이 지도를 더욱 선진적으로 만드는지 보게 될 것이다.더욱 동적인 방식으로 대량의 표기를 나타내다.
기대하세요.
바울
Resources
라이선스
본 논문 및 관련 프레젠테이션에 대한 지식 공유 서명 공유 라이센스(CC BY-SA) 게시
오리지널
내 블로그에 처음 게시된 내용:
https://www.paulox.net/2020/12/08/maps-with-django-part-1-geodjango-spatialite-and-leaflet/
Reference
이 문제에 관하여(Django 지도(제1부분): GeoDjango, SpatiaLite, 전단지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pauloxnet/maps-with-django-part-1-geodjango-spatialite-and-leaflet-2bn2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)