我正在使用 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: '© <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 成员,不推荐”。我是否需要自定义序列化器的输出,以便不提取上述行,或者是否有更有效的方法来成功?
我按照以下步骤解决了上述问题:
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')
我遇到了同样的问题,我发现你可以而且应该完全删除 crs 行。 如RFC7946 中所述所有 GeoJSON 坐标均被视为 WGS 84。
- 坐标参考系
所有 GeoJSON 坐标的坐标参考系是 a
地理坐标参考系,使用世界大地测量
System 1984 (WGS 84) [WGS84] 基准,带有经度和纬度单位 十进制度数。 这相当于坐标参考
由开放地理空间联盟 (OGC) URN 确定的系统
瓮:ogc:def:crs:OGC :: CRS84。 可选的第三位置元素应 是高于或低于 WGS 84 参考值的高度(以米为单位)
椭球体。 在没有高程值的情况下,应用程序
对高度或深度敏感应该将位置解释为位于
当地地面或海平面。注意:使用替代坐标参考系是
[GJ2008]中指定,但已从该版本
中删除 由于使用不同的坐标参考而导致的规格
系统——特别是以[GJ2008]中指定的方式——有
事实证明存在互操作性问题。 一般来说,GeoJSON
处理软件预计无法访问坐标
参考系统数据库或通过网络访问坐标
参考系统变换参数。 然而,哪里都
相关各方有事先安排,可选择协调
可以使用参考系统,而不会有数据丢失的风险
被误解了。
希望这个 PR 很快就会合并到 Django,更新 GeoJSON 序列化器以省略“crs”属性!