[Django] Django로 지도 만들기
Maps with Django (2): GeoDjango, PostGIS, Leaflet를 참고해서 작성된 게시글이다.
위에 블로그에너무 정리가 잘 되어 있어서 그저 잘 따라하기만 하면 지도를 만들어 낼수 있었다. 이번에 인턴하는 회사가 지도 기반으로 맵을 만드는 회사여서 지도를 다룰 일이 많았기에 전에 한번 django에서는 어떻게 지도를 만들어내는지 경험해 보았다. 우선은 지도를 만들기 위해서 여러 라이브러리가 필요했다. 실습에 쓰일 라이브러리들을 소개해보겠다.
🍃 Leaflet
Leaflet은 웹 매핑 응용프로그램을 구축하는데 사용되는 오픈 소스 Javascript 라이브러리이다. 자세한 설명과 사용법은 Leaflet 웹사이트를 참조한다.
🌐 Geodjango
GeoDjango는 django project의 일종으로 위치 데이터를 다룰 수 있게 해준다. 위치 데이터는 보통 구글맵을 이용한 좌표 데이터를 의미한다고 봐도 된다. 그 외에도 3d나 2d 좌표를 이용한 계산 등의 기능도 가능케 한다. 자세한 설명은 GeoDjango 공식문서를 참고한다.
🗄 Postgis
PostGIS는 객체 관계형 데이터베이스 시스템인 PostgreSQL의 확장 프로그램으로, 데이터베이스에 GIS(지리정보 시스템) 객체를 저장할 수 있게 해준다. PostGIS는 GiST 기반 R-Tree 공간 인덱스를 지원하며, GIS 객체의 분석 및 공간 처리를 위한 기능을 포함하고 있다. 자세한 내용은 공식문서를 참고한다.
앱 생성
우선 프로젝트를 하나 생성해준다음 원하는 앱을 만들어준다.
>django startproject dis_map
>django startapp markers
그 후 INSTALLED_APPS에 생성한 앱 이름을 추가해준다.
dis_map/dis_map/settings.py
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"markers",
]
빈 지도 만들기
앞에 단계를 완료 했으면 이제 아무것도 표시되어있지 않은 빈 지도를 만들어 보겠다.
우선 views.py에 지도를 위한 TemplateView를 만들어준다.
dis_map/markers/views.py
from django.views.generic.base import TemplateView
class MarkersMapView(TemplateView):
"""Markers map view."""
template_name = "map.html"
지도를 만들어 주기 위해서 위에서 말한 map.html 템플릿을 dis_map 안에서 만들어주어야 한다. 이때 템플릿은 한곳에 모아줄 것이기 때문에 dis_map안에서 templates 파일을 만들어준다.
mkdir templates
dis_map/markers/templates/map.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Markers Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
</body>
</html>
마지막으로 지도를 보기 위해 url설정을 해주어야 한다.
dis_map/markers/urls.py
from django.urls import path
from markers.views import MarkersMapView
app_name = "markers"
urlpatterns = [
path("map/", MarkersMapView.as_view()),
]
상위 url에서 markers/urls.py를 바라보도록 설정해주어야 한다.
dis_map/dis_map/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("markers/", include("markers.urls")),
]
이제 서버를 돌리고 http://127.0.0.1:8000/markers/map/ 으로 들어가 보면 빈 지도가 보일것이다.
python manage.py runserver
Leaflet 사용해서 지도 만들기
우선 map 템플릿을 수정해주어야 한다.
dis_map/markers/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/leaflet/dist/leaflet.css" />
<script src="https:///unpkg.com/leaflet/dist/leaflet.js"></script>
</head>
<body>
<div id="map"></div>
<script src="{% static 'map.js' %}"></script>
</body>
</html>
그후 css와 js도 만들어야 하기 때문에 dis_map 내에 static이라는 디렉토리를 생성해준다.
mkdir static
그 후 map.css를 만들어준다. 지도를 보여주기 위한 최소한 css만 넣었다.
dis_map/markers/static/map.css
html,
body {
height: 100%;
margin: 0;
}
#map {
height: 100%;
width: 100%;
}
마지막으로 map.js를 만들어준다.
dis_map/markers/static/map.js
const copy = "© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors";
const url = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
const osm = L.tileLayer(url, { attribution: copy });
const map = L.map("map", { layers: [osm] });
map.fitWorld(); # 이 부분이 전체 나라들을 보여주는 map view를 설정하고 최대 확대/축소 수준도 설정해준다.
정의된 변수들을 통해 OpenStreetMap 레이어를 설정하고 이를 '지도'에 연결한다.
이후에 서버를 실행하면 빈 지도가 보여진다.
python manage.py runserver
Author And Source
이 문제에 관하여([Django] Django로 지도 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chaeri93/Django-Django로-지도-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)