使用Django序列化程序在Leaflet映射上添加geoJSON数据时无效的对象

时间:2017-09-29 22:23:44

标签: django leaflet geojson geodjango

我正在使用Leaflet和Postgresql / PostGIS开发Django应用程序。当我尝试在发送GeoJSON Feature Collection对象的地图上添加MultiLineString图层时,会引发无效的对象错误。 起初我的views.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"
}
我读到的是&#34;老式的crs成员,不推荐&#34;。我是否要自定义序列化器的输出以便不提取上述行或者有更有效的方法来成功?

2 个答案:

答案 0 :(得分:1)

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

  • 我在Python词典中转换了geoJSON对象
  • 我删除了&#39; crs&#39;来自使用pop()方法
  • 的dicionary的密钥
  • 我再次将字典转换为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')

答案 1 :(得分:0)

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

  1. 坐标参考系统

所有GeoJSON坐标的坐标参考系统是
地理坐标参考系统,使用世界大地测量
1984年系统(WGS 84)[WGS84]数据,经度和纬度单位 十进制度数。这等效于坐标参考
开放地理空间联盟(OGC)URN识别的系统
urn:ogc:def:crs:OGC :: CRS84。可选的第三位置元素 是WGS 84参考上方或下方的高度(以米为单位)
椭球。在没有高程值的情况下,应用
对高度或深度敏感的人应该将位置解释为
当地的地面或海平面。

注意:使用替代坐标参考系统是
在[GJ2008]中指定,但已从此版本的
中删除 该规范,因为使用了不同的坐标参考
系统-尤其是以[GJ2008]中指定的方式-具有
事实证明存在互操作性问题。一般来说,GeoJSON
处理软件不能访问坐标
参考系统数据库或通过网络访问坐标
参考系统转换参数。但是,所有的地方
参与方有事先安排,可以选择协调
参考系统可以使用而没有数据风险
曲解。