Я пытаюсь создать буфер вокруг строки, используя Turf, GeoDjango и Django Rest Framework GIS ;Все данные отображаются с помощью MapBox. Я использую газон через CDN: <script src='https://npmcdn.com/@turf/turf/turf.min.js'></script>
Это модель :
from django.contrib.gis.db import models
class LineBuffer(models.Model):
geom = models.LineStringField()
def __int__(self):
return self.pk
Это сериализатор :
from rest_framework_gis.serializers import GeoFeatureModelSerializer
from buffer.models import LineBuffer
class LineBufferSerializer(GeoFeatureModelSerializer):
class Meta:
model = LineBuffer
geo_field = "geom"
fields = ("pk", "geom")
Это представление :
@api_view(["GET"])
def linebuffer_api_view(request):
if request.method == "GET":
features = LineBuffer.objects.all()
serializer = LineBufferSerializer(features, many=True)
return Response(serializer.data)
И это настройки карты :
var map = new mapboxgl.Map({
container: 'map',
accessToken: mapboxgl.accessToken,
style: 'mapbox://styles/mapbox/streets-v9',
center: [14.267038, 40.850431],
zoom: 10,
});
map.on('load', function() {
// GeoJSON from API
var data_source = "{% url 'linebuffer_api' %}";
// Generate source
map.addSource('line_source', {
type: 'geojson',
data: data_source,
});
// Render GeoJSON
map.addLayer({
'id': 'tower',
'type': 'line',
'source': 'line_source',
'layout': {
'line-join': 'round',
'line-cap': 'round'
},
'paint': {
'line-color': '#487bb6',
'line-width': 4
}
});
// Create the buffer
var mybuffer = turf.buffer(
data_source,
200,
{units: 'meters'}
);
// Buffer render
map.addLayer({
'id': 'buffer',
'type': 'fill',
'source': {
'type': 'geojson',
'data': mybuffer
},
'paint': {
'fill-color': '#fff',
'fill-opacity': 0.50,
'fill-outline-color': '#f30'
}
});
};
Я вижу правильномои строки, но я не вижу буфер, потому что в консоли я вижу эту ошибку:
Uncaught Ошибка: неизвестный тип геометрии
at S (turf.min.js:1)
at j (turf.min.js:1)
at bo (turf.min.js:1)
at Object.t.buffer (turf.min.js:1)
at r.<anonymous> ((index):175)
at r.St.fire (evented.js:115)
at r._render (map.js:1976)
at map.js:2047
Как я могу решить?
Кажется, что Turf не может управлять сериализованным GeoJSON, потому что у меня есть другая модель, и без использования DRF я могу видеть буфер вокруг каждой отдельной точки. Это модель :
class PointBuffer(models.Model):
geom = models.PointField()
def __int__(self):
return self.pk
@property
def coordinates(self):
return str(self.geom.x) + ', ' + str(self.geom.y)
Это десериализованная GeoJSON :
var data_source = {
"type": "FeatureCollection",
"features": [{% for d in geometry %}
{
"type": "Feature",
"properties": {
"pk": "{{ d.pk }}"
},
"geometry": {
"type": "Point",
"coordinates": [{{ d.coordinates }}]
}
{% if forloop.last %}} {% else %}}, {% endif %}{% endfor %}
]
}
С этим решением я вижу буфер, ноесли я использую API также для PointBuffer
, я вижу ту же ошибку, что и LineBuffer
.