Psycopg ppygis выберите запрос

Я пытаюсь настроить базовую рабочую установку postgis с помощью пакета python ppygis.

>>> import psycopg2
>>> import ppygis
>>> connection = psycopg2.connect(database='spre', user='postgres')
>>> cursor = connection.cursor()
>>> cursor.execute('CREATE TABLE test (geometry GEOMETRY)')
>>> cursor.execute('INSERT INTO test VALUES(%s)', (ppygis.Point(1.0, 2.0),))
>>> cursor.execute('SELECT * from test')
>>> point = cursor.fetchone()[0]
>>> print point
0101000000000000000000F03F0000000000000040
>>>

Я должен был получить объект Python с отдельными координатами X и Y. Что-то вроде

>>> Point(X: 1.0, Y: 2.0)

Что я делаю неправильно?

1 ответ

Решение

Вы не делаете ничего плохого. Следуя тем же шагам, что и в базовом примере PPyGIS, я получаю тот же EWKB с шестнадцатеричным кодом, как показано в вопросе (010100...), что обычно ожидается. Возможно, это работало с более старой версией PPyGIS / Psycopg? Это не сегодня.

Похоже, что пакет не регистрируется должным образом как адаптер для типов PostGIS, поэтому я советую не использовать пакет. Кроме того, вам не нужны дополнительные пакеты для использования PostGIS от Psycopg2.


Вот обычный подход для чтения / записи без каких-либо дополнительных пакетов:

# Assuming PostGIS 2.x, use a typmod
cursor.execute('CREATE TEMP TABLE test (geom geometry(PointZ,4326));')
# Longyearbyen, 78.22°N 15.65°E, altitude 10 m
cursor.execute('''\
    INSERT INTO test (geom)
    VALUES(ST_SetSRID(ST_MakePoint(%s, %s, %s), 4326));
''', (15.65, 78.22, 10.0))
cursor.execute('''\
    SELECT ST_Y(geom) AS latitude, ST_X(geom) AS longitude, ST_Z(geom) AS altitude
    FROM test;
''')
print(cursor.fetchone())  # (78.22, 15.65, 10.0)
cursor.execute('SELECT ST_AsText(geom) FROM test;')
print(cursor.fetchone()[0])  # POINT Z (15.65 78.22 10)
cursor.execute('SELECT ST_AsLatLonText(geom) FROM test;')
print(cursor.fetchone()[0])  # 78°13'12.000"N 15°39'0.000"E

Если вы хотите, чтобы геометрический объект на стороне клиента выполнял больше работы с реальной геометрией, рассмотрите возможность использования Shapely, который можно связать с помощью данных WKB:

from shapely.wkb import loads
cursor.execute('SELECT geom FROM test;')
pt = loads(cursor.fetchone()[0], hex=True)
print(pt)  # POINT Z (15.65 78.22 10)
Другие вопросы по тегам