使用 Django 序列化程序在 Leaflet 地图上添加 geoJSON 数据时出现无效对象

问题描述 投票:0回答:3

我正在使用 Leaflet 和 Postgresql / PostGIS 开发 Django 应用程序。当我尝试在发送 GeoJSON 要素集合对象的地图上添加 MultiLineString 图层时,会引发无效对象错误。 一开始我的看法.py:

from geonode.geoloc.models import Transport
from django.template import RequestContext
from django.core.serializers import serialize

class LookupView(FormView):
    template_name = 'geoloc/lookupresults.html'
    form_class = LookupForm

    def get(self, request):
        return render_to_response('geoloc/lookup.html',      RequestContext(request))

def form_valid(self, form):
    # Get data
    latitude = form.cleaned_data['latitude']
    longitude = form.cleaned_data['longitude']

    # Look up roads
    roads =  Transport.objects.all()[0:5]

    roads_json = serialize('geojson', roads,
               fields=('geom',))

    # Render the template
    return self.render_to_response({
                              'roads_json': roads_json
                             }, content_type = 'json')

表格有效时我的模板:

{% extends "geoloc/geoloc_base.html" %}
{% block content %}
{% load leaflet_tags %}
{% leaflet_js %}
{% leaflet_css %}

<div id="mapid" style="width: 600px; height: 400px;"></div>
<script>
  var geojsonFeature = "{{ roads_json }}";
  var mymap = L.map('mapid').setView([51.505, -0.09], 13);
  L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
  attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
  var myroads = L.geoJSON().addTo(mymap);
  myroads.addData(geojsonFeature);


 </script>
{% endblock %}

当我在 http://geojsonlint.com/ 测试 geoJSON 对象(Django 序列化程序发送)时,我意识到该对象因以下几行而无效:

 "crs": {
"type": "name",
"properties": {
  "name": "EPSG:4326"
}

据我所知,这是“老式的 crs 成员,不推荐”。我是否需要自定义序列化器的输出,以便不提取上述行,或者是否有更有效的方法来成功?

django leaflet geojson geodjango
3个回答
2
投票

我按照以下步骤解决了上述问题:

  • 我在Python字典中转换了geoJSON对象
  • 我使用 pop() 方法从字典中删除了 'crs' 键
  • 我再次将字典转换为geoJSON对象

views.py中修改后的代码:

roads =  Transport.objects.all()[0:5]

roads_json = serialize('geojson', roads,
           fields=('geom',))

new_roads_json = json.loads(roads_json)
new_roads_json.pop('crs', None)
new_roads_json = json.dumps(new_roads_json)

# Render the template
return self.render_to_response({
                     'new_roads_json': new_roads_json
                      }, content_type = 'json')

0
投票

我遇到了同样的问题,我发现你可以而且应该完全删除 crs 行。 如RFC7946 中所述所有 GeoJSON 坐标均被视为 WGS 84。

  1. 坐标参考系

所有 GeoJSON 坐标的坐标参考系是 a
地理坐标参考系,使用世界大地测量
System 1984 (WGS 84) [WGS84] 基准,带有经度和纬度单位 十进制度数。 这相当于坐标参考
由开放地理空间联盟 (OGC) URN 确定的系统
瓮:ogc:def:crs:OGC :: CRS84。 可选的第三位置元素应 是高于或低于 WGS 84 参考值的高度(以米为单位)
椭球体。 在没有高程值的情况下,应用程序
对高度或深度敏感应该将位置解释为位于
当地地面或海平面。

注意:使用替代坐标参考系是
[GJ2008]中指定,但已从该版本
中删除 由于使用不同的坐标参考而导致的规格
系统——特别是以[GJ2008]中指定的方式——有
事实证明存在互操作性问题。 一般来说,GeoJSON
处理软件预计无法访问坐标
参考系统数据库或通过网络访问坐标
参考系统变换参数。 然而,哪里都
相关各方有事先安排,可选择协调
可以使用参考系统,而不会有数据丢失的风险
被误解了。


0
投票

希望这个 PR 很快就会合并到 Django,更新 GeoJSON 序列化器以省略“crs”属性!

https://github.com/django/django/pull/18907

© www.soinside.com 2019 - 2024. All rights reserved.