在 PostgreSQL 数据库中的 WKB POINT 字段中显示 Django 模板中的传单地图坐标

Display leaflet map coordinates in Django template from WKB POINT field in PostgreSQL database

提问人:E Wilson 提问时间:11/13/2023 更新时间:11/13/2023 访问量:33

问:

我是GEO的新手。我在存储位置的 PostgreSQL 数据库中有一个 WKB POINT 字段。我的 Django 模板上还有一个传单地图,添加了硬编码的 lat 和 long,它在我的前端显示了一个工作地图。

POINT 示例:0101000020E610000051954507C62C1FC0144708B9E6784840

有人可以建议我如何解码点字段并将纬度和经度插入到我的模板中,以便地图从数据库中更新到正确的位置吗?

如果您需要其他任何模型,请告诉我。任何帮助都表示赞赏。

模板.html

    <div style="padding-top: 280px">
    <h3 style="padding-bottom: 20px;">Location</h3>
     <script>
      function map_init_basic (map, options) {
        
          L.marker([11.5, 20.5]).addTo(map);
          map.panTo(new L.LatLng(11.737, 20.923));
        
      }
     </script>

{% leaflet_map "mymap" callback="window.map_init_basic" %}
Python Django PostgreSQL 传单

评论

0赞 IvanSanchez 11/13/2023
postgis.net/docs/ST_AsGeoJSON.html

答:

0赞 Maimoona Abid 11/13/2023 #1

如果你的数据存储在 PostgreSQL 数据库中,并且你有一个表示它的 Django 模型,你应该将纬度和经度传递给你的模板,并在你的视图中执行 WKB 解码。

你的 models.py 文件应包含此代码

from django.contrib.gis.db import models

    class YourModel(models.Model):
        location = models.PointField()

views.py 文件应包含此代码

from django.shortcuts import render
from django.contrib.gis.geos import GEOSGeometry

def your_view(request):
    # Assuming you have a queryset that retrieves the data from your database
    queryset = YourModel.objects.all()

    # Extracting latitude and longitude from the POINT field
    location_data = []
    for instance in queryset:
        # Decode WKB and extract coordinates
        point = GEOSGeometry(instance.location.wkb)
        lat, lon = point.y, point.x

        # Append latitude and longitude to the location_data list
        location_data.append({'lat': lat, 'lon': lon})

    context = {'location_data': location_data}
    return render(request, 'your_template.html', context)

现在,您可以通过更新 your_template.html 中的 JavaScript 代码来使用提取的纬度和经度。

这是模板.html文件的更新代码

<div style="padding-top: 280px">
    <h3 style="padding-bottom: 20px;">Location</h3>
    <script>
        function map_init_basic(map, options) {
            {% for location in location_data %}
                L.marker([{{ location.lat }}, {{ location.lon }}]).addTo(map);
            {% endfor %}
            
            // You may want to adjust the center based on your data
            map.panTo(new L.LatLng({{ location_data.0.lat }}, {{ location_data.0.lon }}));
        }
    </script>

    {% leaflet_map "mymap" callback="window.map_init_basic" %}
</div>

希望它能:)