ロンドンの 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テーブル全体を横断する必要があるため、赤い線はマップ全体をカバーする必要があります。結果を表示するためにタイルミルを使用しています。