2

Ich suche eigentlich nach dem besten und einfachsten Weg, einen räumlichen Index mit 4 Tabellen zu machen, wo die Struktur der Daten bereits vorhanden ist.Geodjango/postgres ForeignKey-Beziehung wie ein räumlicher Index

Wie picture zeigen Sie es, Schicht sind überlagert und passen perfekt. Räumliche Operationen könnten die Aufgabe in der Abfrage erledigen, aber für ein Web-GIS mit starker Geoverarbeitung auf Geodjango ist es möglicherweise zu schwer für eine freundliche Verwendung. Das Hinzufügen der ForeignKey-Beziehung funktioniert möglicherweise schneller.

Struktur ist:

  • L1 haben viele L2
  • L2 haben viele L3
  • L3 haben viele L4

Die Namensgebung ist ungewöhnlich, alle ID und FID sind string, wie :

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

Durch diese Struktur wird eine Menge von Geoverarbeitung im laufenden Betrieb ausgeführt. Deshalb mag die Fremdschlüsselbeziehung die beste sein, um das zu tun. Schließlich ist es ein räumlicher Index, der mit dem Feld arbeitet. Aber wie geht das?

Kann ich beziehen L1 mit L2 als Regeln wie: wo L2_FK LIKE selected_L1_ID%“statt, wo L2_FK == selected_L1_ID%

Thank

Alex

Antwort

0

Wir verwendeten räumlich indexierten Daten? in dieser Form problemlos mit nur einem Modell/Tisch und django-mptt Begegnung:

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 

(während des Datenimports, wir manuell eine Union aller geoms der untergeordneten Knoten zum übergeordneten Knoten hinzugefügt haben)

Verwandte Themen