Невозможно сделать буфер с использованием Turf - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь создать буфер вокруг строки, используя 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.

...