[postgis-commits] svn - r3857 - spike/wktraster/scripts
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Thu Mar 12 10:56:42 PDT 2009
Author: mloskot
Date: 2009-03-12 10:56:41 -0700 (Thu, 12 Mar 2009)
New Revision: 3857
Added:
spike/wktraster/scripts/pyrtreader.py
Log:
scripts: Added a simple driver to read RASTER field data directly from a table. Tha main purpose of the RasterReader is to test and debug WKT Raster implementation. It is not supposed to be an efficient performance killer, by no means.
Added: spike/wktraster/scripts/pyrtreader.py
===================================================================
--- spike/wktraster/scripts/pyrtreader.py 2009-03-11 19:46:07 UTC (rev 3856)
+++ spike/wktraster/scripts/pyrtreader.py 2009-03-12 17:56:41 UTC (rev 3857)
@@ -0,0 +1,138 @@
+#! /usr/bin/env python
+#
+# $Id$
+#
+# A simple driver to read RASTER field data directly from PostGIS/WKTRaster.
+#
+# Copyright (C) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+###############################################################################
+#
+# Requirements: psycopg2
+#
+# WARNING: Tha main purpose of the RasterReader is to test and debug
+# WKT Raster implementation. It is not supposed to be an efficient
+# performance killer, by no means.
+#
+###############################################################################
+import psycopg2
+import sys
+
+###############################################################################
+# RASTER driver (read-only)
+
+class RasterError(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+ def __str__(self):
+ return self.msg
+
+class RasterReader(object):
+ """Reader of RASTER data stored in specified column and row (where) in a table"""
+
+ # Constructors
+
+ def __init__(self, connstr, table, column, where = ""):
+ self._connstr = connstr
+ self._conn = None
+ self._table = table
+ self._column = column
+ self._where = where
+ self._sizes = None
+ # Connect and read RASTER header
+ self._setup()
+
+ # Public properties
+
+ db = property(fget = lambda self: self._get_db())
+ table = property(fget = lambda self: self._get_table())
+ column = property(fget = lambda self: self._get_column())
+ width = property(fget = lambda self: self._get_width())
+ height = property(fget = lambda self: self._get_height())
+ num_bands = property(fget = lambda self: self._get_num_bands())
+
+ # Public methods
+
+ def get_value(self, band, x, y):
+ return self._query_value(band, x, y)
+
+ # Private methods
+
+ def _get_db(self):
+ n = filter(lambda db: db[:6] == 'dbname', self._connstr.split())[0].split('=')[1]
+ return n.strip('\'').strip()
+
+ def _get_table(self):
+ return self._table
+
+ def _get_column(self):
+ return self._column
+
+ def _get_width(self):
+ return self._query_raster_size(0)
+
+ def _get_height(self):
+ return self._query_raster_size(1)
+
+ def _get_num_bands(self):
+ return self._query_raster_size(2)
+
+ def _setup(self):
+ self._connect()
+
+ def _connect(self):
+ try:
+ if self._conn is None:
+ self._conn = psycopg2.connect(self._connstr)
+ except:
+ raise RasterError("Falied to connect to %s" % self._connstr)
+
+ def _query_single_row(self, sql):
+ assert self._conn is not None
+ try:
+ cur = self._conn.cursor()
+ cur.execute(sql)
+ except:
+ raise RasterError("Falied to execute query: %s" % sql)
+
+ row = cur.fetchone()
+ if row is None:
+ raise RasterError("No tupes returned for query: %s" % sql)
+ return row
+
+ def _query_value(self, band, x, y):
+ sql = """SELECT rt_value(%s, %d, %d, %d) FROM %s""" % \
+ (self._column, band, x, y, self._table)
+ if len(self._where) > 0:
+ sql += """ WHERE %s""" % self._where
+ row = self._query_single_row(sql)
+ if row is None:
+ raise RasterError("Value of pixel %dx%d of band %d is none" %(x, y, band))
+ return row[0]
+
+ def _query_raster_size(self, dim, force = False):
+ if self._sizes is None or force is True:
+ sql = """SELECT rt_width(%s), rt_height(%s), rt_numbands(%s) FROM %s""" % \
+ (self._column, self._column, self._column, self._table)
+ if len(self._where) > 0:
+ sql += """ WHERE %s""" % self._where
+ self._sizes = self._query_single_row(sql)
+
+ if self._sizes is None:
+ raise RasterError("Falied to query %dx%d of band %d is none" %(x, y, band))
+ return self._sizes[dim]
+
More information about the postgis-commits
mailing list