1

ロンドンの OSM マップ データで構成された PostgreSQL データベースがあります。osm2psql を使用してこのデータをインポートしました。私はしたいと思います:

  • Planet_osm_line テーブルのすべての行を反復します
  • ラインを個々のライン セグメントに分割する
  • 各ライン セグメントの値を計算します (この例では、値を 0.5 に設定します)。
  • ライン セグメントを新しいエントリとして新しいテーブルに書き込みます。

以下の python コードはこれを達成しているように見えますが、1 つの問題があります。データベース全体の小さなセクションとしてのみアクセスしているようです。

import psycopg2

conn = psycopg2.connect("dbname=db user=username")
maincur = conn.cursor()
readcur = conn.cursor()
writecur = conn.cursor()

maincur.execute("DROP TABLE lines_red")
maincur.execute("CREATE TABLE lines_red (osm_id bigint, name text, way geometry, value float);")

maincur.execute("SELECT osm_id, ST_NPOINTS(way) FROM planet_osm_line")
    for record in maincur:
    pointlist = []
    for i in range(0,record[1]):
        readcur.execute("SELECT ST_ASTEXT(ST_POINTN(way, %s+1)) FROM planet_osm_line WHERE osm_id=%s;",(i,record[0]))
        output = readcur.fetchone()
        pointlist.append(output[0])
    for i in range(0,record[1]-1):  
        if pointlist[i+1] != None:
            value = 0.5
            writecur.execute("INSERT INTO lines_red (name, way, value) VALUES ('testname', ST_Makeline(%s, %s), %s);", (pointlist[i],pointlist[i+1],value))

conn.commit()
maincur.close()
readcur.close()
writecur.close()
conn.close()

以下の画像を説明するために、planet_osm_line テーブル全体を灰色で示し、クエリの結果を赤色で示しています。コードはplanet_osm_lineテーブル全体を横断する必要があるため、赤い線はマップ全体をカバーする必要があります。結果を表示するためにタイルミルを使用しています。

Planet_osm_line テーブル全体を反復しようとした結果

4

1 に答える 1

0

この場合の問題は、TileMill の使用にありました。

新しいレイヤーが作成されると、その範囲のデフォルト設定は、入力として使用されるデータベース テーブルに基づいて事前計算されます。これは、レイヤーが最初に作成されたデータセットのサイズになることを意味します。

この場合、コードのテストとしてデータのサブセットを繰り返し処理し、その結果に基づいて範囲を計算しました。データセット全体を反復処理すると、コードはデータベース全体を反復処理しましたが、以前に計算された制約内の結果のみを表示しました。

解決策は、新しいレイヤーを作成するか、レイヤーの範囲設定を「事前計算」ではなく「動的」に設定することです

于 2013-02-11T10:43:29.523 に答える