我有一个PostgreSQL数据库,由伦敦的OSM地图数据组成。我使用osm2psql导入了这些数据。我想:
下面的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来显示结果。
答案 0 :(得分:0)
本案的问题在于我使用了TileMill。
创建新图层时,其范围的默认设置是根据用作输入的数据库表预先计算。这意味着该图层将只是最初创建它的数据集的大小。
在这种情况下,我迭代了我的数据子集作为我的代码的测试,并根据结果计算范围。当我遍历整个数据集时,代码在整个数据库上迭代,但只在先前计算的约束中显示结果。
解决方案是创建一个新图层或将图层中的范围设置设置为“动态”而不是“预先计算”