Извлечь координаты из LineStringField - PullRequest
1 голос
/ 08 ноября 2019

У меня есть простая модель из GeoDjango для линейного вектора:

    from django.contrib.gis.db import models
    class LineBuffer(models.Model):
        geom = models.LineStringField()

        def __int__(self):
            return self.pk

        @property
        def coordinates(self):
            return str(self.geom.x) + ', ' + str(self.geom.y)

Мне нужно создать буфер с помощью Turf.js;результаты будут обработаны с помощью MapBox.

С этим видом я создаю свою карту:

def line_mapbox_turf_buffer(request):
    geometry = LineBuffer.objects.all()
    context = {
        'geometry': geometry,
    }
    template = 'buffer/reading/line_mapbox_turf_buffer.html'
    return render(request, template, context)

Я пытаюсь сгенерировать GeoJSON

var data_source = {
    "type": "FeatureCollection",
    "features": [{% for d in geometry %}
        {
        "type": "Feature",
        "properties": {
            "pk": "{{ d.pk }}"
        },
        "geometry": {
            "type": "LineString",
            "coordinates": [{{ d.coordinates }}]
        }
        {% if forloop.last %}} {% else %}}, {% endif %}{% endfor %}
    ]
}

Но я вижу это:

{
            "type": "Feature",
            "properties": {
                "pk": "1"
            },
            "geometry": {
                "type": "LineString",
                "coordinates": [
          [14.364295, 14.3662612, 14.3681209, 14.3702697, 14.3730481, 14.3742791, 14.3763224], 
          [40.8086793, 40.8101317, 40.8118721, 40.8139257, 40.8165981, 40.8177693, 40.8206666]
          ]
            }
            }

Вместо этого:

{
      "type": "Feature",
      "properties": {
        "pk": "1"
      },
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [14.364295,40.8086793],
          [14.3662612,40.8101317],
          [14.3681209,40.8118721],
          [14.3702697,40.8139257],
          [14.3730481,40.8165981],
          [14.3742791,40.8177693],
          [14.3763224,40.8206666]
        ]
      }
    }

Я считаю, что моей проблемой является свойство coordinates. Как я могу правильно извлечь координаты линейного вектора?

1 Ответ

0 голосов
/ 11 ноября 2019

Хорошо выполняя простое вскрытие сообщения об ошибке, мы ясно видим, что ответ свойства coordinates необходимо реорганизовать в соответствии с вашими потребностями.

Я бы предложил использовать свойство geom.coordsчтобы получить доступ к координатам LineString и манипулировать ими.
Координаты Джанго LineString будут выглядеть так: ((x_0, y_0), (x_1, y_1), ...), поэтому совершенно ясно, что нам нужно сделать:

@property
def coordinates(self):
    return [list(coord_pair) for coords_pair in self.geom.coords]

ишаблон, нам нужно пропустить приведение list, когда мы используем свойство coordinates:

var data_source = {
    "type": "FeatureCollection",
    "features": [{% for d in geometry %}
        {
        "type": "Feature",
        "properties": {
            "pk": "{{ d.pk }}"
        },
        "geometry": {
            "type": "LineString",
            "coordinates": {{ d.coordinates }}
        }
        {% if forloop.last %}} {% else %}}, {% endif %}{% endfor %}
    ]
}

Выполнение вашей собственной сериализации в этом конкретном случае не дает никаких преимуществ, которые я вижу, и япредложил бы вообще провести рефакторинг вашего процесса, чтобы использовать GeoJson Serializer :

from django.core.serializers import serialize

def line_mapbox_turf_buffer(request):
    context = {
        'geometry': serialize(
            'geojson', 
            LineBuffer.objects.all(),
            geometry_field='geom',
        )
    }
    template = 'buffer/reading/line_mapbox_turf_buffer.html'
    return render(request, template, context)

и в шаблоне просто получить доступ к контекстному полю geometry:

var data_source = {{ geometry }}
...