পাইথন ব্যবহার করে পোস্টজিআইএসে একটি পয়েন্ট .োকান


11

পাইথন ব্যবহার করে কোনও পোস্টজিআইএস ডাটাবেসে পয়েন্ট sertোকানোর সঠিক উপায় কী?

উত্তর:


21

প্রথমে সাইকোপজি ২ প্যাকেজটি ইনস্টল করুন , পোস্টগ্রিজ এসকিউএল এর জন্য পাইথোনিক ইন্টারফেস।

তারপরে, ব্যবহার করুন 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

আরও জটিল জ্যামিতির জন্য, যেমন লাইনস্ট্রিং এবং পলিগন জ্যামিতিগুলির জন্য, আপনি এগুলি শ্যাপলির সাহায্যে পরিচালনা করতে পারেন, তারপরে এগুলি হাইকো-এনকোডড ডাব্লুবিবি হিসাবে সাইকোপজি 2 এর মাধ্যমে পাস করুন। নোট করুন যে আকারের সাথে 1.3 বা তার পরে wkb_hexসম্পত্তি সহ 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যা পয়েন্ট জ্যামিতির জন্য দুর্দান্ত। যাইহোক, আরও জটিল জ্যামিতির প্রকারগুলি সাধারণত আকারের সাথে সহজতর হবে।
মাইক টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.