अजगर का उपयोग करके PostGIS में एक बिंदु डालें


11

पायथन का उपयोग करके पोस्टगिस डेटाबेस में प्वाइंट डालने का सही तरीका क्या है?

जवाबों:


21

सबसे पहले, स्थापित psycopg2 पैकेज, PostgreSQL के लिए एक pythonic इंटरफ़ेस।

फिर, उपयोग करें ST_MakePoint:

>>> import psycopg2
>>> conn = psycopg2.connect(dbname=..., port=..., user=...,
                            password=..., host=...)
>>> cur = conn.cursor()
>>> x, y, z, = 32, 34, 0
>>> cur.execute("SELECT ST_SetSRID(ST_MakePoint(%s, %s, %s),4326);", (x, y, z))
>>> cur.fetchall()
[('01010000A0E6100000000000000000404000000000000041400000000000000000',)]

ST_AsText मूल्यों को मान्य करने के लिए इस्तेमाल किया जा सकता है:

>>> cur.execute("SELECT ST_AsText(ST_SetSRID(ST_MakePoint(%s, %s, %s),4326));", (x, y, z))
>>> cur.fetchall()
[('POINT Z (32 34 0)',)]

टिप्पणियाँ

  • जो (lat, lon)है (y, x), उसे याद रखो (x, y)
  • एसक्यूएल इंजेक्शन को रोकने के लिए हमेशा स्ट्रिंग जोड़तोड़ के बजाय मापदंडों का उपयोग करें । इस उदाहरण में हमने (x, y, z)अंत में ट्यूप किया ताकि psycopg2प्रतिस्थापन को संभाल सकें ।

20

अधिक जटिल ज्यामिति के लिए, जैसे कि लाइनस्ट्रिंग और बहुभुज ज्यामितीय, आप उन्हें Shapely से संभाल सकते हैं, फिर उन्हें psxopg2 के माध्यम से हेक्स-एन्कोडेड WKB के रूप में पास कर सकते हैं। ध्यान दें कि wkb_hexसंपत्ति के साथ 3 डी ज्यामिति के निर्यात को संभालने के लिए शापली 1.3 या बाद में आवश्यक है ।

import psycopg2
from shapely.geometry import LineString
from shapely import wkb

conn = psycopg2.connect('...')
curs = conn.cursor()

# Make a Shapely geometry
ls = LineString([(2.2, 4.4, 10.2), (3.3, 5.5, 8.4)])
ls.wkt  # LINESTRING Z (2.2 4.4 10.2, 3.3 5.5 8.4)
ls.wkb_hex  # 0102000080020000009A999999999901409A999999999911406666666666662440666666...

# Send it to PostGIS
curs.execute('CREATE TEMP TABLE my_lines(geom geometry, name text)')
curs.execute(
    'INSERT INTO my_lines(geom, name)'
    'VALUES (ST_SetSRID(%(geom)s::geometry, %(srid)s), %(name)s)',
    {'geom': ls.wkb_hex, 'srid': 4326, 'name': 'First Line'})

conn.commit()  # save data

# Fetch the data from PostGIS, reading hex-encoded WKB into a Shapely geometry
curs.execute('SELECT name, geom FROM my_lines')
for name, geom_wkb in curs:
    geom = wkb.loads(geom_wkb, hex=True)
    print('{0}: {1}'.format(name, geom.wkt))
# First Line: LINESTRING Z (2.2 4.4 10.2, 3.3 5.5 8.4)

आगे ध्यान दें कि समान को ज्यामिति के डब्ल्यूकेटी को भेजकर पूरा किया जा सकता है, हालांकि चूंकि इसे पाठ में परिवर्तित किया जाता है, यह हानिपूर्ण है और सटीक के एंगस्ट्रॉम को कम कर सकता है। हेक्स-एन्कोडेड डब्ल्यूकेबी के रूप में ज्यामितीय स्थानांतरित करना दोषरहित है, और प्रत्येक समन्वय की सटीक सटीकता को संरक्षित करता है।


बहुत बड़िया धन्यवाद! मुझे आश्चर्य है कि अगर इन दोनों दृष्टिकोणों के बीच एक प्रदर्शन अंतर है।
एडम मटन

के साथ एक 10% प्रदर्शन लाभ निर्माण बिंदु है ST_MakePoint, जो बिंदु ज्यामितीयों के लिए बहुत अच्छा है। हालांकि, अधिक जटिल ज्यामिति प्रकार का निर्माण आमतौर पर शेपली के साथ सरल होगा।
माइक टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.