有没有办法让psycopg2返回点作为python元组?

时间:2015-07-31 02:17:33

标签: python postgresql postgis psycopg2 postgresql-9.3

我想使用psycopg2从Postgres中检索一个PostGIS点列作为python元组。

这证明非常困难。我很困惑,psycopg2不会自动读取Postgres point types(将PostGIS点几何图形设置为python元组)。

例如,我希望以下代码中的row['latlng_tuple']是浮点数的python元组。

cursor.execute("SELECT \
    ( CAST (ST_X(latlng) AS double precision) \
    , CAST (ST_Y(latlng) AS double precision) \
    ) \
    AS latlng_tuple \
    FROM my_table;"

for row in cursor:
    print row['latlng_tuple']

相反,我发现上面的代码将row['latlng_tuple']作为字符串返回。这与the way that the psycopg2 documentation describes the conversion between Postgres and python types一致。

为什么会这样?有没有办法让psycopg2将点作为python元组返回,可能使用自定义转换器/适配器,如here所述?

或者,有一种简单的方法可以将PostGIS点几何返回为python元组吗?我试过ppygis并发现它不起作用。

1 个答案:

答案 0 :(得分:1)

问题中的SQL会返回composite record type (...),并将其转换为text。例如,使用原生double precision类型:

import psycopg2
import psycopg2.extras
conn = psycopg2.connect(...)
cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
cursor.execute("SELECT (1.0::double precision, 2.0::double precision) AS db_tuple;")
for row in cursor:
    print(repr(row['db_tuple']))  # '(1,2)'

因此,您无法在SQL中为Python构建元组。使用Python构建元组:

cursor.execute("SELECT 1.0::double precision AS x, 2.0::double precision AS y;")
for row in cursor:
    xy_tuple = (row['x'], row['y'])
    print(repr(xy_tuple ))  # (1.0, 2.0)

要从PostGIS获取其他软件的数据,请使用geometry accessoroutput functions。例如ST_X(geom)将点几何的 x -coordinate返回为double precision类型。

cursor.execute("SELECT ST_X(latlng) AS lng, ST_Y(latlng) AS lat FROM my_table;")
for row in cursor:
    latlng_tuple = (row['lat'], row['lng'])
    print(repr(latlng_tuple))

# (1.0, 2.0)
# (3.0, 4.0)

另外,不要将PostGIS的geometry(Point)类型与PostgreSQL的point类型混淆。他们是非常不同的。此外,像ppygis这样的软件包不需要从Python到PostGIS获取几何图形。