Выгрузить геометрию LineString в геометрию Point в Django (например, ST_DumpPoints())
Итоговый вопрос: Как я могу вывести геометрию LineString в геометрию Point в Django? Или сырой SQL единственный путь?
Хотите узнать подробности?
Скажем, у меня есть следующие модели, точный формат не важен.
line_paths: 1 row = 1 linestring
point_paths: 1 row = 1 point from 1 linestring in line_paths
##################################################
# LINE_PATHS TABLE
##################################################
class line_paths(models.Model):
line_path_id = models.AutoField(primary_key=True)
yyyymmdd = models.CharField(max_length=8)
season = models.ForeignKey('seasons')
line_path = models.LineStringField(dim=3)
objects = models.GeoManager()
location = models.CharField(choices=LOCATION,max_length=20)
def __unicode__(self):
return "%s-%d"%(self.location, self.line_path_id)
##################################################
# POINT_PATHS TABLE
##################################################
class point_paths(models.Model):
point_path_id = models.AutoField(primary_key=True)
season = models.ForeignKey('seasons')
line_path = models.ForeignKey('line_paths')
gps_time = models.FloatField()
roll = models.FloatField()
pitch = models.FloatField()
heading = models.FloatField()
point = models.PointField(dim=3)
objects = models.GeoManager()
location = models.CharField(choices=LOCATION,max_length=20)
def __unicode__(self):
return "%s-%d"%(self.location, self.point_path_id)
В представлении заполнения (заполнение базы данных) line_path вставляется в таблицу line_paths и в итоге выглядит примерно так (с учетом следующего запроса)
SELECT line_path_id,season_id,ST_AsText(line_path) FROM rds_line_paths;
Теперь я хочу взять LineString GEOM из этой таблицы (line_paths) и записать точки в новую таблицу (point_paths). В сыром SQL я сделал что-то вроде этого:
SELECT ST_AsText(geom) AS points FROM ST_DumpPoints((SELECT fl_line FROM greenland.line_paths WHERE ...));
Тогда я мог бы просто вставить точки в новую таблицу. Есть ли способ сделать это в рамках Django? (Не возвращаясь к сырому SQL)
1 ответ
Я считаю, что нашел свое решение. Так просто.
Смотрите документацию по Django
https://docs.djangoproject.com/en/1.3/ref/contrib/gis/geos/
Поскольку объект geom является pythonic, мне не нужно обращаться к модели / базе данных, чтобы получить дамп LineString. Скорее просто разбейте его на скоординированные точки и вставьте их.
Если у меня есть LineString:
geom = GEOSGeometry(geojson.dumps(path))
Координаты этой строки:
geom.coords
Это возвращает кортеж кортежей ((x,y),(x,y),...)