Python | 使用 Folium 实现的 Django 地图应用程序

今天,发现了一个非常有趣的Python地图应用程序

程序使用 Django 框架和 folium 库,可以简单快速的实现,只要插入数据就可以找到任何地方,并得到其所在地址。

实现过程

前提

  1. 已安装配置Python环境

  2. 安装并构建app项目

pip install django 
pip install folium 
django-admin startproject maps_project 

实现过程

  1. setting.py‘INSTALLED_APPS’ 中app的名称
INSTALLED_APPS = [ 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
django.contrib.messages', 
'django.contrib.staticfiles', 
'maps', 
]
  1. models.py中创建使用的对象模型
 from django import forms
 from django.forms import ModelForm

 from .models import *

 class CoordinatesForm(forms.ModelForm):
      lat = models.CharField(max_length=20)
      lon = models.CharField(max_length=20)

class Meta:
    model = Coordenadas
    fields = '__all__'
  1. admin.py 中注册模型
from django.contrib import admin 
from .models import * 
admin.site.register(Coordenadas)
  1. 创建 forms.py,使用djangoModelForm特性来实现表单处理
 from django import forms
 from django.forms import ModelForm

 from .models import *

 class CoordinatesForm(forms.ModelForm):
      lat = models.CharField(max_length=20)
      lon = models.CharField(max_length=20)

class Meta:
    model = Coordenadas
    fields = '__all__'

  1. 实现相关请求的处理 view.py
from django.shortcuts import render, redirect
from .models import Coordenadas
from .forms import *
import folium


def coordinates_form(request):
   coordinates = Coordenadas.objects.all()
   form = CoordinatesForm()

   if request.method == 'POST':
      form = CoordinatesForm(request.POST)
       if form.is_valid():
           form.save()
       return redirect("maps")
      context = {
        'coordinates': coordinates,
        'form' : form,
       }
  return render(request, 'maps/maps_form.html', context)

def maps(request):
   coordenadas = list(Coordenadas.objects.values_list('lat','lon'))[-1]

   map = folium.Map(coordenadas)
   folium.Marker(coordenadas).add_to(map)
   folium.raster_layers.TileLayer('Stamen Terrain').add_to(map)
   folium.raster_layers.TileLayer('Stamen Toner').add_to(map)
   folium.raster_layers.TileLayer('Stamen Watercolor').add_to(map)
   folium.LayerControl().add_to(map)


   map = map._repr_html_()
   context = {
      'map': map,

    }
  return render(request, 'maps/maps.html', context)
  1. 配置 urls.py,导入相关视图
 from django.contrib import admin
 from django.urls import path
 from . import views

 urlpatterns = [
     path('',views.coordinates_form, name = 'coordinates-form'),
     path('map', views.maps, name = 'maps'),
  ]
  1. 页面展示代码 maps.html
      <!DOCTYPE html>
      <html lang="en">
      {% block content %}
      <head>
          <meta charset="UTF-8">
          <title>Map</title>
       </head>
       <body>
           <div> {{ map | safe }}</div>

        </body>
        </html>

       {% endblock %}

8.表单页面 map_form.html

{% extends 'maps/base.html' %}

{% block content %}
<div class="header-bar">
        <a href="{% url 'maps' %}">&#8592; Map</a>

</div>

<div class="card-body">
    <form method= "POST" action ="">
         {% csrf_token %}
         {{form.as_p}}
         <input class="button" type="submit" value="submit">
    </form>


</div>

{% endblock %}

9.启动项目

python manage.py startapp maps

然后打开浏览器172.0.0.1:8000 即可访问

实现效果

image.png

image.png

了解更详细内容,请移步:medium.com/@carlosmarc…