2015-03-09 4 views
0

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

>>> 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) 

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

+0

То, что вы вернулись это хорошо знают двоичную (ВКБ) представление точки. Попробуйте выполнить cursor.execute ('SELECT ST_X (geometry) из test'), чтобы увидеть разницу или cursor.execute ('SELECT ST_AsText (geometry) from test') –

ответ

2

Вы ничего не делаете неправильно. После the same steps as the PPyGIS basic example, я получаю то же самое hex-encoded 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 

Если вы хотите геометрический объект на стороне клиента, чтобы сделать больше работы с реальной геометрией, рассмотреть возможность использования стройных, которые могут быть сопряжены с использованием ВКБ данных:

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) 
+0

Спасибо за ответ @Mike T. Одна вещь, можно использовать Shapely для 3D-точек? AFAIK, Shapely работает для 2D-очков. –

+0

Сортировка. Он называется «2,5-мерные», так как Z-размер обычно просто сохраняется, но иногда вычисляется для линейных функций привязки, но не для функций расстояния. Это действительно зависит от того, что вы можете делать. –

+0

okay .. спасибо. Я постараюсь попробовать. –