Отношения Geodjango/postgres ForeignKey как пространственный индекс

Я на самом деле искал лучший и самый простой способ сделать пространственный индекс с 4 таблицами, где структура данных уже на месте.

Как показано на рисунке, слой наложен и идеально подходит. Пространственная операция могла бы выполнить работу в запросе, но для веб-ГИС с интенсивной геообработкой на геоджанго она может быть слишком тяжелой для дружественного использования. Таким образом, добавление отношения ForeignKey может работать быстрее.

Структура это:

  • L1 есть много L2
  • L2 есть много L3
  • L3 есть много L4

Именование является необычным, все ID и FID являются строковыми, как:

  • L1: A,B, C,... B as exemple
  • L2: B01, B02, B03,... B03 exemple
  • L3: B0301, B0302, B0303,... B0302 exemple
  • L4: B030201, B030202, B030203,...

Через эту структуру будет происходить много геообработки на лету. Вот почему отношение внешнего ключа, возможно, будет лучшим для этого. Наконец, это пространственный индекс, который работает с полем. Но как это сделать?

Могу ли я связать L1 с L2 как правила вроде: где L2_FK LIKE selected_L1_ID%"вместо где L2_FK == selected_L1_ID%?

Поблагодарить

Alex

1 ответ

Мы использовали пространственно индексированные данные в этой форме, не столкнувшись с проблемами, используя только одну модель / таблицу и django-mptt:

from django.contrib.gis.db import models
from django.utils.translation import ugettext_lazy as _
from mptt.models import MPTTModel, TreeForeignKey


class Region(MPTTModel):
    class Level:
        L1 = 1
        L2 = 2
        L3 = 3
        L4 = 4
        L5 = 5

        choices = (
            (L1, _("L1")),
            (L2, _("L2")),
            (L3, _("L3")),
            (L4, _("L4")),
            (L5, _("L5")),
        )

    parent = TreeForeignKey('self', null=True, blank=True,
                               related_name='children')
    layer = models.IntegerField(_('layer'), choices=Level.choices,
                                db_index=True)
    code = models.CharField(_("name"), db_index=True, max_length=100)
    geom = models.MultiPolygonField(_('polygon'))

    def __str__(self):
        return self.code

(Во время импорта данных мы вручную добавили объединение геомов всех дочерних узлов в родительский узел)

Другие вопросы по тегам