PostGis Polygon в листовки с использованием Django - PullRequest
0 голосов
/ 14 апреля 2019

Моя проблема в том, что я понятия не имею, как я могу визуализировать многоугольник, хранящийся в PostGIS, в карту листовки, используя django.

В шаблоне, который я использую для построения точек:

  <script type="text/javascript">

      function map_init(map, options) {
        {% for each_model in loca %}

          var lon =   {{each_model.location.x}}
          var lat =   {{each_model.location.y}}


          map.setView([lat, lon], 2);

          L.marker([lat, lon]).bindPopup("{{each_model.name}}").addTo(map)

          {% endfor %}
          // get point lat and lon

          // zoom to point & add it to map
        ;
      }

  </script>

models.py

from __future__ import unicode_literals

from django.contrib.gis.db import models
from django.contrib.gis.geos import Point


class Shop(models.Model):
    name = models.CharField(max_length=100)
    location = models.PointField()
    address = models.CharField(max_length=100)
    city = models.PolygonField()

, если я напечатаю {{loca.city}}, он напечатает объект GEOS следующим образом:

SRID=4326;POLYGON ((2.988282590688516 6............))

любая идея, как можноЯ строю полигоны, пока я рисую точки?

ОБНОВЛЕНИЕ II:

Распечатка того, что производит модель при использовании Shop.object.all ()

<QuerySet [<Shop: Shop object (1)>, <Shop: Shop object (2)>, <Shop: Shop object (3)>, <Shop: Shop object (4)>]>

таблица базы данных выглядитэто сохранение многоугольников и точек (x, y) enter image description here

Я думал об использовании запроса вручную (в представлении), но он не работал (cursor.execute ("SELECTST_AsText (city) FROM trial2_shop;)

Используя этот код:

{% for each_model in loca %}

{{each_model.name}} <br>

{% endfor %}

, получается следующее:

HELLO 
PARIS 
France 
abc 

и затем используется этот:

{% for each_model in loca %}

{{each_model.city}} <br>

{% endfor %}

вывод таков:

SRID=4326;POLYGON ((2.988282590688516 6.287501448673132, -2.724608033516236 4.362344411133384, -5.624998658112493 4.800392361058798, -9.316404907598319 4.62520548641869, -7.29492053288002 -2.927082610924476, 8.701173214893267 -0.8189537900473602, 9.667970089758358 3.573231060257538, 5.537110715333732 4.362344411133384, 2.988282590688516 6.287501448673132)) 
SRID=4326;POLYGON ((2.379232127237539 48.99532183070828, 1.835408885125764 48.778601581576, 2.489095408472194 48.61544474629894, 2.780233103744227 48.87985458449839, 2.379232127237539 48.99532183070828)) 
SRID=4326;POLYGON ((4.921880363732911 48.86996904931716, 13.00781786260736 44.28238994198036, -8.08593213445636 32.47943349940858, -25.31249463205829 49.55890707900826, 5.364418038408538e-06 58.4058966101036, -8.789057134358529 49.10068218084409, 4.921880363732911 48.86996904931716)) 
SRID=4326;POLYGON ((10.10742321469805 59.8969527006269, 16.34765758882955 60.31310053764656, 15.02929821401315 57.87662999493084, 12.39257946438035 57.92333496310473, 10.10742321469805 59.8969527006269))

, поэтому я уверен, что то, что хранится, является полигонами, но проблема заключается в нанесении его на карту в шаблоне карты при извлечении ...

1 Ответ

0 голосов
/ 16 апреля 2019

Вам необходимо использовать документацию многоугольника внутри шаблона.
Для этого вам понадобятся 2 вещи:

  1. Списокa Координаты полигона :

    lst_coords = [[point.x, point.y] for point in shop_object.city]
    

    Это приведет к созданию списка списков / пар координат.

  2. Вставьте список координат в многоугольник листовки:

    L.polygon(lst_coords, {color: 'red'}).addTo(map);
    

Теперь давайте применим вышеизложенное в вашем примере:

  1. Добавьте property в вашу модель, чтобы получить список координат (это только для удобства):

    class Shop(models.Model):
        name = models.CharField(max_length=100)
        location = models.PointField()
        address = models.CharField(max_length=100)
        city = models.PolygonField()
    
        @property
        def city_coords_list(self):
             return [[point.x, point.y] for point in self.city]
    
  2. Интегрируйте вышеперечисленное вшаблон:

    <script type="text/javascript">
    
      function map_init(map, options) {
        {% for each_model in loca %}
    
          L.polygon(
            {{ each_model.city_coords_list }}, {color: 'red'}
          ).bindPopup({{ each_model.name }}).addTo(map)
    
      {% endfor %}
      // Find a way to fit the map accordignly (search the docs)
      ;
    }
    

...