如何通过迭代现有的OSM数据表在PostgreSQL中生成新表

时间:2013-02-10 13:16:42

标签: python postgresql psycopg2 openstreetmap tilemill

我有一个PostgreSQL数据库,由伦敦的OSM地图数据组成。我使用osm2psql导入了这些数据。我想:

  • 迭代planet_osm_line表中的每一行
  • 将线条划分为单独的线段
  • 计算每个线段的值(在此示例中将值设置为0.5)
  • 将线段作为新条目写入新表。

下面的python代码似乎实现了这个但有一个问题。它似乎只是访问整个数据库的一小部分。

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表。我正在使用tilemill来显示结果。

Result of trying to iterate over the entire planet_osm_line table

1 个答案:

答案 0 :(得分:0)

本案的问题在于我使用了TileMill。

创建新图层时,其范围的默认设置是根据用作输入的数据库表预先计算。这意味着该图层将只是最初创建它的数据集的大小。

在这种情况下,我迭代了我的数据子集作为我的代码的测试,并根据结果计算范围。当我遍历整个数据集时,代码在整个数据库上迭代,但只在先前计算的约束中显示结果。

解决方案是创建一个新图层或将图层中的范围设置设置为“动态”而不是“预先计算”