0

概要の質問: Django で LineString geom を Point geom にダンプするにはどうすればよいですか? それとも、生の 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;

クエリ結果

次に、このテーブル (line_paths) から LineString GEOM を取得し、ポイントを新しいテーブル (point_paths) にダンプします。生のSQLでは、次のようなことをしました:

SELECT ST_AsText(geom) AS points FROM ST_DumpPoints((SELECT fl_line FROM greenland.line_paths WHERE ...));

次に、ポイントを新しいテーブルに挿入するだけです。Django フレームワーク内でこれを行う方法はありますか? (未加工の SQL にフォールバックしない)

4

1 に答える 1

0

私は自分の解決策を見つけたと信じています。とてもシンプルです。

Django のドキュメントを参照してください

https://docs.djangoproject.com/en/1.3/ref/contrib/gis/geos/#geometries-are-pythonic

geom オブジェクトは pythonic であるため、モデル/データベースにアクセスして LineString をダンプする必要はありません。むしろ、調整されたポイントに分割して、それらを一括挿入します。

LineString がある場合:

geom = GEOSGeometry(geojson.dumps(path))

その LineString の座標は次のとおりです。

geom.coords

これはタプルのタプルを返します ((x,y),(x,y),...)

于 2013-05-29T15:08:18.103 に答える