まず、私のセットアップは次のとおりです。
- パイソン 2.7.6
- ジャンゴ1.6
- PostgreSQL 9.3.1
- PostGIS 2.1.1
Natural Earth の国と州のデータセットを PostGIS にロードしました。私が使用しているDjangoモデルは次のとおりです。
class Location(models.Model):
name = models.CharField(max_length=255)
imported_from = models.CharField(max_length=255)
admin_level = models.CharField(max_length=255, blank=True)
geometry = models.MultiPolygonField(blank=True, default=None, null=True)
objects = models.GeoManager() #override the default manager with a GeoManager instance
parent = models.ForeignKey('self', blank=True, default=None, null=True)
def __unicode__(self):
return self.name
@staticmethod
def get_countries(continent):
return Location.objects.filter(parent=continent).order_by('name')
@staticmethod
def get_continents():
return Location.objects.filter(parent=None).order_by('name')
@staticmethod
def get_states(country):
return Location.objects.filter(parent=country).order_by('name')
これは一目瞭然ですが、注意すべき重要なことは、これにより場所の階層が可能になるということです (たとえば、テキサスは米国にあり、北米にあるなど)。
他の場所に接する一連の場所を取得する必要があります。ビューでこれを行う方法は次のとおりです。
touching_locations = {x for x in Location.objects.filter(geometry__touches=Location.objects.get(name='LOCATION_NAME').geometry).values_list('name', flat=True)}
このクエリは、一部の場所 (アンゴラなど) では問題なく動作しますが、他の場所 (米国など) では非常に遅くなります。にGiST インデックスを作成しましたが、期待した速度が得られませgeometry
ん。米国のクエリを実行すると、django-debug-toolbar はクエリ ( https://gist.github.com/gfairchild/7476754 ) が完了するまでになんと 106260.14 ミリ秒かかることを教えてくれますが、これは明らかに受け入れられません。
ロケーション テーブル全体には 4865 エントリしかないので、何が起こっているのでしょうか? このクエリを正しく発行していますか?