Нужна производительность на postGIS с GeoDjango - PullRequest
6 голосов
/ 23 августа 2010

Я впервые использую GeoDjango с postGIS. После установки и некоторых тестов, когда все работает нормально, меня беспокоит производительность запросов, когда строки таблицы будут расти.

Я сохраняю в геометрических точках долготы и широты, полученные из геокодирования Google (WGS84 или SRID 4326). Моя проблема в том, что дистанционные операции очень распространены в моем приложении. Мне часто нужно приближаться к точкам с ориентира. Геометрия математики очень сложна, поэтому, даже если у меня есть пространственный индекс, в будущем, вероятно, потребуется слишком много времени, если в ближайшей области будет более 1000 точек.

Так есть ли способ проецировать этот тип геометрии, чтобы быстрее выполнять дистанционные операции? кто-нибудь знает библиотеку Django, которая может отображать карту Google, содержащую некоторые из этих точек?

Какие-нибудь советы по ускорению пространственных запросов в GeoDjango?

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Если вы можете поместить свою рабочую область в картографическую проекцию, это всегда будет быстрее, поскольку для таких задач, как расчеты расстояния, требуется меньше математических вызовов. Однако, если у вас есть действительно глобальные данные, смиритесь с этим: используйте географию. Если у вас есть только данные по континентальной части США, используйте что-то вроде EPSG: 2163 http://spatialreference.org/ref/epsg/2163/

Чем больше ограничено рабочее пространство, тем более точные результаты вы можете получить в проекции карты. Посмотрите прогнозы плоскости штата для получения точных и строго ограниченных прогнозов для регионов США. Или прогнозы UTM для более крупных субнациональных регионов.

3 голосов
/ 27 августа 2010

Я исследую эту тему. Насколько я обнаружил, координаты, которые вы получаете из библиотеки геопы, имеют формат SRID 4326, поэтому вы можете без проблем сохранять их в виде поля геометрии. Это будет пример модели GeoDjango с использованием геометрии:

class Landmark(models.Model):
   point = models.PointField(spatial_index = True,
                           srid = 4326,
                           geography = True)

   objects = models.GeoManager()

Кстати, будьте очень осторожны, передавая широту и долготу в PointField, именно в этом порядке. geopy возвращает координаты широты / долготы, поэтому вам нужно будет повернуть их вспять.

Для преобразования точек в одной системе координат в другую мы можем использовать GEOS с GeoDjango. В этом примере я преобразую точку в 4326 в знаменитую проекцию Google 900913:

from django.contrib.gis.geos import Point
punto = Point(40,-3)
punto.set_srid(900913)
punto.transform(4326)
punto.wkt
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)'

Таким образом, мы можем хранить координаты в проекционных системах, которые будут иметь более высокую производительность по математике. Для отображения точек на карте Google в интерфейсе администратора сайта. Мы можем использовать эту замечательную статью .

Я решил продолжить с типами географии, и я буду преобразовывать их в будущем, если мне нужно будет улучшить производительность.

0 голосов
/ 23 августа 2010

Обычно GeoDjango создает и использует пространственные индексы для геометрических столбцов, где это необходимо.

Для приложения, работающего в основном с расстояниями между точками, может подойти Географический тип (представленный в PostGIS 1.5 и поддерживаемый GeoDjango). GeoDjango говорит, что это дает «намного лучшую производительность для удаленных запросов WGS84» [ссылка] .

...