সাইকোপজি 2 ব্যবহার করে পোস্টগ্রিজ থেকে অজগরটিতে রাস্টার ডেটা ডাউনলোড করা


13

আমার একটি পোস্টগ্রিস টেবিলে রাস্টার ডেটা রয়েছে যা আমি একটি অদ্ভুত অ্যারে হিসাবে পাইথনে যেতে চাই। আমি ডিবিতে সংযোগ করতে সাইকোপজি 2 ব্যবহার করছি। আমি ডেটা ডাউনলোড করতে সক্ষম তবে এটি একটি স্ট্রিং (সম্ভবত সিরিয়ালযুক্ত বাইনারি) হিসাবে ফিরে আসে।

এই স্ট্রিংটি কীভাবে নিতে হবে এবং একটি নাম্পার অ্যারে রূপান্তর করতে হয় তা কি কেউ জানেন?

আমি রাস্টার ডাউনলোড করার জন্য অন্যান্য বিকল্পগুলি সন্ধান করেছি যেমন হেক্স ফাইল ডাউনলোড করতে এবং এক্সএক্সডি ব্যবহার করতে স্টেস্টিফ এবং এনকোড ব্যবহার করুন তবে এটি কার্যকর হয়নি। আমি ত্রুটিটি পেয়ে যাচ্ছি 'rt_raster_to_gdal: GDAL ড্রাইভার আউটপুট লোড করতে পারিনি' এবং চালকদের চালু করতে সক্ষম পরিবেশের ভেরিয়েবল সেট করার অনুমতি আমার নেই।

টিএল, ডিআর: রাস্টার ডেটা একটি অদ্ভুত অ্যারেতে (পাইথন ব্যবহার করে) আমদানি করতে চান।

উত্তর:


14

rt_raster_to_gdal: GDAL ড্রাইভার আউটপুট লোড করা যায়নি

ST_AsTIFF- র সাথে প্রথম ত্রুটি হিসাবে , আপনাকে আপনার জিডিএল ড্রাইভারগুলি সক্ষম করতে হবে, যা ডিফল্টরূপে পোস্টজিআইএস ২.১ এর জন্য সক্ষম নয়। এটি করার উপায়গুলিতে ম্যানুয়ালটি দেখুন । উদাহরণস্বরূপ, উইন্ডোজ কম্পিউটারে আমার সাথে একটি পরিবেশের পরিবর্তনশীল সেটআপ রয়েছে:

POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid

যা পোস্টজিআইএসের সাথে নিশ্চিত করা যায়:

SELECT short_name, long_name
FROM ST_GDALDrivers();

নম্পিকে পোস্টজিআইএস করুন

নম্পি অ্যারেতে পড়তে আপনি জিডিএল-এর জন্য ভার্চুয়াল মেমরি জিওটিআইএফএফ ফাইলটিতে আউটপুট রফতানি করতে পারেন। জিডিএল-তে ব্যবহৃত ভার্চুয়াল ফাইলগুলিতে ইঙ্গিতগুলির জন্য, এই ব্লগ পোস্টটি দেখুন

import os
import psycopg2
from osgeo import gdal

# Adjust this to connect to a PostGIS database
conn = psycopg2.connect(...)
curs = conn.cursor()

# Make a dummy table with raster data
curs.execute("""\
    SELECT ST_AsRaster(ST_Buffer(ST_Point(1, 5), 10), 10, 10, '8BUI', 1) AS rast
    INTO TEMP mytable;
""")

# Use a virtual memory file, which is named like this
vsipath = '/vsimem/from_postgis'

# Download raster data into Python as GeoTIFF, and make a virtual file for GDAL
curs.execute("SELECT ST_AsGDALRaster(rast, 'GTiff') FROM mytable;")
gdal.FileFromMemBuffer(vsipath, bytes(curs.fetchone()[0]))

# Read first band of raster with GDAL
ds = gdal.Open(vsipath)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

# Close and clean up virtual memory file
ds = band = None
gdal.Unlink(vsipath)

print(arr)  # this is a 2D numpy array

একটি রাস্টারযুক্ত বাফার পয়েন্ট দেখায়।

[[0 0 0 1 1 1 1 0 0 0]
 [0 1 1 1 1 1 1 1 1 0]
 [0 1 1 1 1 1 1 1 1 0]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [0 1 1 1 1 1 1 1 1 0]
 [0 1 1 1 1 1 1 1 1 0]
 [0 0 0 1 1 1 1 0 0 0]]

মনে রাখবেন যে আমি উদাহরণে একটি 'জিটিফ' ফর্ম্যাট ব্যবহার করেছি, তবে অন্যান্য ফর্ম্যাটগুলি আরও উপযুক্ত হতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে ধীরে ধীরে ইন্টারনেট সংযোগ জুড়ে স্থানান্তরিত হওয়া কোনও বড় রাস্টার থাকে তবে এটি সংকোচনের জন্য 'পিএনজি' ব্যবহার করে চেষ্টা করুন।


এটা খুব সহায়ক।
জন পাওয়েল

খুব উপকারী. ধন্যবাদ! আমি এখনও এই সমস্যাটিতে চলেছি যে: ERROR: rt_raster_to_gdal: GDAL ড্রাইভার আউটপুট লোড করতে পারেনি তবে আমি মনে করি যে এর জন্য আমার একটি কার্যকারিতা রয়েছে। আবার ধন্যবাদ!
মায়াঙ্ক আগরওয়াল

@ মায়াঙ্ক আগরওয়াল rt_raster_to_gdal ত্রুটির জন্য উত্তর আপডেট করেছে।
মাইক টি

6

আমি মনে করি যে প্রশ্নটি ছিল আপনি জিডিএল ড্রাইভারগুলি সক্ষম ব্যতীত পোস্টগ্রিস রাস্টার টেবিলগুলি থেকে পড়তে পারেন কিনা। পাইথন সব জিনিস হিসাবে, আপনি পারেন!

নিশ্চিত হয়ে নিন যে আপনি আপনার রাস্টার ফলাফলটি ডব্লুকেইনারি হিসাবে নির্বাচন করেছেন:

St_AsBinary (rast) নির্বাচন করুন ...

পাইথন চিত্রের ফর্ম্যাটে ডব্লিউ কেবাইনারি ডিক্রিফার করতে নীচের স্ক্রিপ্টটি ব্যবহার করুন। আমি ওপেনসিভি পছন্দ করি, কারণ এটি ইমেজ ব্যান্ডের স্বেচ্ছাসেবী সংখ্যা পরিচালনা করে তবে 1 বা 3 টি ব্যান্ড বেশি স্বাভাবিক হলে একজন পিআইএল / লো ব্যবহার করতে পারে।

আমি কেবল আপাতত বাইট চিত্রাবলী পরিচালনা করি তবে অন্যান্য ডেটাটাইপগুলিতে প্রসারিত করা অপেক্ষাকৃত তুচ্ছ।

আশা করি এটি কার্যকর হবে।

আমদানি কাঠামো
এনপি হিসাবে নাম্বার আমদানি করুন
সিভি 2 আমদানি করুন

# ডাব্লুকেবি শিরোনামটি ডাইফার করার কাজ
Def WkbHeader (কাঁচা):
    # দেখুন http://trac.osgeo.org/postgis/browser/trunk/raster/doc/RFC2- ওয়েলকান্টবাইনারি ফরম্যাট

    শিরোনাম = {}

    শিরোনাম ['শেষ কথা'] = স্ট্রাক্ট.উনপ্যাক ('বি', কাঁচা [0]) [0]
    শিরোনাম ['সংস্করণ'] = স্ট্রাক্ট.উনপ্যাক ('এইচ', কাঁচা [1: 3]) [0]
    শিরোনাম ['এনব্যান্ডস]] = স্ট্রাক্ট.উনপ্যাক (' এইচ ', কাঁচা [3: 5]) [0]
    শিরোলেখ ['স্কেলএক্স'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [5:13]) [0]
    শিরোনাম ['স্কেলওয়াই'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [১৩:२১]) [0]
    শিরোনাম ['আইপিএক্স'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [২১: ২৯]) [0]
    শিরোনাম ['আইপিওয়াই'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [২৯:৩7]) [0]
    শিরোনাম ['skewX'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [৩:45:৪৫]) [0]
    শিরোনাম ['skewY'] = স্ট্রাক্ট.উনপ্যাক ('ডি', কাঁচা [45:53]) [0]
    শিরোনাম ['srit'] = স্ট্রাক্ট.উনপ্যাক ('আমি', কাঁচা [৫:5:77]) [0]
    শিরোনাম ['প্রস্থ'] = স্ট্রাক্ট.উনপ্যাক ('এইচ', কাঁচা [57:59]) [0]
    শিরোলেখ ['উচ্চতা'] = স্ট্রাক্ট.উনপ্যাক ('এইচ', কাঁচা [59:61]) [0]

    রিটার্ন শিরোনাম

# ডাব্লুকেবি রাস্টার ডেটা ডাইফার করার কাজ 
Def wkbI छवि (কাঁচা):
    h = wkbHeader (কাঁচা)
    img = [] চিত্র ব্যান্ডগুলি সঞ্চয় করতে # অ্যারে
    অফসেট = 61 # হেডার কাঁচা দৈর্ঘ্য বাইটে
    আমি পরিসীমা জন্য (এইচ ['nbands']):
        এই ব্যান্ডটির জন্য পিক্সটাইপ নির্ধারণ করুন
        পিক্সটাইপ = স্ট্রাক্ট.নপ্যাক ('বি', কাঁচা [অফসেট]) [0] >> 4
        # আপাতত, আমরা কেবল স্বাক্ষরবিহীন বাইট পরিচালনা করি
        যদি পাইসটাইপ == 4:
            ব্যান্ড = এনপি.ফ্রম্বফার (কাঁচা, dtype = 'uint8', গণনা = এইচ ['প্রস্থ'] * এইচ ['উচ্চতা'], অফসেট = অফসেট + 1)
            img.append ((np.reshape (ব্যান্ড, ((এইচ ['উচ্চতা']], এইচ ['প্রস্থ']))))))
            অফসেট = অফসেট + ২ + এইচ ['প্রস্থ'] * এইচ ['উচ্চতা']
        # করণীয়: অন্যান্য ডেটা ধরণের হ্যান্ডেল করুন 

    রিটার্ন সিভি 2.মিটার (টিপল (img))


এটা খুব সহায়ক। আমি একটি কনডা পরিবেশে gdal নিয়ে প্রচুর সমস্যা পেয়েছি, তবে এই পদ্ধতিটি প্রথমবারের মতো কাজ করেছে, এবং কাঠামোটি কিছুটা আবিষ্কার করতে সক্ষম হতে পেরে ভাল লাগছে।
জন পাওয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.