首先,这是我的设置:
- Python 2.7.6
- 姜戈 1.6
- PostgreSQL 9.3.1
- 地理信息系统 2.1.1
我已将自然地球国家和州的数据集加载到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 个条目,这是怎么回事?我发出这个查询对吗?