Django中如何将含经纬度的坐标列表调整为纬度在前、经度在后的格式
解决方案
你需要修改lat_lng属性的逻辑,遍历多层嵌套的坐标结构,反转每个坐标点内部的经纬度顺序,同时优化坐标传递的处理方式避免格式错误。
1. 修改models.py中的lat_lng属性
from django.contrib.gis.db import models from django.contrib.auth.models import User from django.contrib.gis.db.models import PointField, MultiPointField, MultiPolygonField class BurnedArea(models.Model): firedate = models.DateField() country = models.CharField(max_length=80) place_name = models.IntegerField() province = models.CharField(max_length=80) yearseason = models.FloatField() geom = MultiPolygonField(srid=4326) visible = models.BooleanField(default=False) @property def lat_lng(self): coords = getattr(self.geom, 'coords', []) reversed_coords = [] # MultiPolygon坐标结构为 多面体[多边形[环[坐标点]]],逐层遍历反转每个点的经纬度 for polygon in coords: reversed_polygon = [] for ring in polygon: reversed_ring = [[lat, lng] for lng, lat in ring] reversed_polygon.append(reversed_ring) reversed_coords.append(reversed_polygon) return reversed_coords def __str__(self): return str(self.place_name)
2. 修改views.py的坐标处理逻辑,修复语法错误
import json def viewer(request): resultba = [] areas = BurnedArea.objects.all() for ba in areas: # 用json序列化直接生成标准数组格式,不需要手动替换括号 pol2 = json.dumps(ba.lat_lng) resultba.append({'pol2': pol2}) context = { 'resultba': resultba } return render(request, 'app_web/viewer.html', context)
3. 优化viewer.html的调用逻辑
移除L.polygon参数中多余的外层括号,直接传入序列化后的坐标即可:
<section class="mapid" id="mapid" ></section> <script> {% for area in resultba %} L.polygon({{area.pol2}}, {color: 'blue'}).addTo(map); {% endfor %} </script>
修改完成后输出的坐标顺序就会和你期望的一致,多边形位置也会匹配实际地理位置。
内容的提问来源于stack exchange,提问作者Mohamed Hassani
相关产品推荐
相关产品推荐

