Commit dc8b342f authored by Jorge Arévalo's avatar Jorge Arévalo

- Added raster extension to new 'raster' directory.

- Modified PostGIS 'configure.ac' script to add support for new raster type (driven by '--with-raster' configure option.
- Added raster build options to 'GNUMakefile' script.
- PostGIS Python scripts moved to a 'python' subdirectory inside 'raster/scripts' directory.
- References to "WKT" deleted from source code.


git-svn-id: http://svn.osgeo.org/postgis/trunk@6019 b70326c6-7e19-0410-871a-916f4a2858ee
parent d2e7bc99
......@@ -123,9 +123,33 @@ config.status: configure
ChangeLog.svn:
svn2cl --authors=authors.svn -i -o ChangeLog.svn
rt-all:
@echo '------------------------------------------------------'
@echo 'Generating PostGIS Raster stuff'
@echo '------------------------------------------------------'
$(MAKE) -C raster all
rt-clean:
$(MAKE) -C raster clean
rt-distclean:
$(MAKE) -C raster distclean
rt-install:
$(MAKE) -C raster install
rt-check:
$(MAKE) -C raster check
rt-post-install-check:
$(MAKE) -C raster post-install-check
rt-sql:
$(MAKE) -C raster rtpostgis.sql
astyle:
./astyle.sh
commit:
$(MAKE) astyle && $(MAKE) clean && $(MAKE) check && svn commit
......
PostGIS WKT Raster - Seamless operations between vector and raster layers
-------------------------------------------------------------------------
http://www.postgis.org/support/wiki/index.php?WKTRasterHomePage
PostGIS Raster's goal is to implement the RASTER type as much as possible
like the GEOMETRY type is implemented in PostGIS and to offer a single
set of overlay SQL functions (like ST_Intersects) operating seamlessly
on vector and raster coverages.
raster/rt_core/ contains the primitives to deal with rasters in memory,
the function to serialize/deserialize both in-memory and on-disk
rasters, the functions to parse and output (hex)wkb.
You can see raster/rt_core/testapi.c and raster/rt_core/testwkb.c for
example usage.
raster/rt_pg/ contains postgresql-specific wrappers, and SQL code to define
the RASTER type.
raster/doc/ contains technical references and RFC documents.
REQUIREMENTS
------------
PostGIS Raster core lib depends on liblwgeom, as found in postgis
source package as of SVN 2009-01 (latest 1.3.5 release won't work).
PostgreSQL interface depends on PostgreSQL version 8.3.5.
BUILD
-----
To build PostGIS with raster support:
$ ./configure --with-raster
$ make
Note that the 'configure' script isn't there if you fetched
the code from the SVN repository. In that case running ./autogen.sh
should create it for you.
Under MinGW you might have to add "--with-pgconfig=/usr/local/pgsql/bin/pg_config" if
configure can't find your pgsql path.
PRE-INSTALL TEST
----------------
After a successful build, you can run:
$ make rt-check
It won't test postgresql interface, as that would require more setup
then a simple make check. See POST-INSTALL TESTING for more info on how
to test that part.
INSTALL
-------
You need to install the library to the postgresql library
directory. You do it by running:
$ sudo make rt-install
POST-INSTALL TEST
-----------------
You can run the post install tests against it:
$ make rt-post-install-check
USE
---
In order to enable your databases to use the raster
functionalities you have to feed them the enabler script:
$ psql -f raster/rt_pg/rtpostgis.sql $MYDB
Note that you must have loaded PostGIS in the database
in order for that to work (see PostGIS documentation
for how to do that).
1. PostGIS Raster Configuration
Run ./configure --help and check 3 options:
--enable-rtapi-debug
Defines POSTGIS_RASTER_API_DEBUG, turns on debugging of RASTER core API
--enable-rtpg-debug
Defines POSTGIS_RASTER_PG_DEBUG, turns on debugging of PostGIS RASTER activity
--enable-rtpgmem-debug
Defines POSTGIS_RASTER_PG_DEBUG_MEM, turns on debugging PostGIS RASTER memory activity.
Simply, overrides de-/allocators with custom calls to help tracking memory usage.
2. Execution
export PGHOST=$PWD/tmp
/usr/lib/postgresql/8.3/bin/postgres --single -k $PGHOST < test.sql
psql
This diff is collapsed.
......@@ -2,8 +2,8 @@
<chapter id="RT_reference">
<title>Raster Reference</title>
<para>The functions given below are the ones which a user of WKT Raster is
likely to need and which are currently available in WKT Raster. There are other functions which are required support
<para>The functions given below are the ones which a user of PostGIS Raster is
likely to need and which are currently available in PostGIS Raster. There are other functions which are required support
functions to the raster objects which are not of use to a general
user.</para>
<para><varname>raster</varname> is a new PostGIS type for storing and analyzing raster data. </para>
......@@ -196,7 +196,7 @@ VALUES (1,
(or not visible in the current search_path) or the specified SRID,
pixel types are invalid.</para>
<para><varname>gdal2wktraster.py</varname> loader uses this function to register raster tables</para>
<para><varname>gdal2raster.py</varname> loader uses this function to register raster tables</para>
<note>
<para>Views and derivatively created spatial tables will need to be registered in raster_columns manually,
......@@ -2317,7 +2317,7 @@ rid | rastbox
<refsection>
<title>Examples</title>
<para>Refer to <ulink url="http://trac.osgeo.org/postgis/wiki/WKTRaster/SpecificationWorking01">WKT Raster Specification</ulink>
<para>Refer to <ulink url="http://trac.osgeo.org/postgis/wiki/WKTRaster/SpecificationWorking01">PostGIS Raster Specification</ulink>
for a diagram of this.</para>
<informaltable>
<tgroup cols="1">
......
#!/bin/sh
# install - install a program, script, or datafile
scriptversion=2006-12-25.00
scriptversion=2009-04-28.21; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
......@@ -515,5 +515,6 @@ done
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
......@@ -6,10 +6,29 @@
/* A lexical scanner generated by flex */
#define yy_create_buffer lwg_parse_yy_create_buffer
#define yy_delete_buffer lwg_parse_yy_delete_buffer
#define yy_flex_debug lwg_parse_yy_flex_debug
#define yy_init_buffer lwg_parse_yy_init_buffer
#define yy_flush_buffer lwg_parse_yy_flush_buffer
#define yy_load_buffer_state lwg_parse_yy_load_buffer_state
#define yy_switch_to_buffer lwg_parse_yy_switch_to_buffer
#define yyin lwg_parse_yyin
#define yyleng lwg_parse_yyleng
#define yylex lwg_parse_yylex
#define yylineno lwg_parse_yylineno
#define yyout lwg_parse_yyout
#define yyrestart lwg_parse_yyrestart
#define yytext lwg_parse_yytext
#define yywrap lwg_parse_yywrap
#define yyalloc lwg_parse_yyalloc
#define yyrealloc lwg_parse_yyrealloc
#define yyfree lwg_parse_yyfree
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 33
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
......@@ -31,7 +50,7 @@
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
#if __STDC_VERSION__ >= 199901L
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
......@@ -54,7 +73,6 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
......@@ -85,6 +103,8 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
......@@ -94,11 +114,12 @@ typedef unsigned int flex_uint32_t;
#else /* ! __cplusplus */
#if __STDC__
/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* __STDC__ */
#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
......@@ -140,7 +161,15 @@ typedef unsigned int flex_uint32_t;
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
* Ditto for the __ia64__ case accordingly.
*/
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif
/* The state buf must be large enough to hold one state per character in the main buffer.
......@@ -178,14 +207,9 @@ extern FILE *lwg_parse_yyin, *lwg_parse_yyout;
#define unput(c) yyunput( c, (yytext_ptr) )
/* The following is because we cannot portably get our hands on size_t
* (without autoconf's help, which isn't available because we want
* flex-generated scanners to compile on their own).
*/
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef unsigned int yy_size_t;
typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
......@@ -3824,7 +3848,7 @@ static YY_BUFFER_STATE buf_state;
/* Macro to keep track of the current parse position */
#define UPDATE_YYLLOC() (lwg_parse_yylloc.last_column += lwg_parse_yyleng)
#line 3828 "lex.yy.c"
#line 3852 "lex.yy.c"
#define INITIAL 0
#define vals_ok 1
......@@ -3843,6 +3867,35 @@ static YY_BUFFER_STATE buf_state;
static int yy_init_globals (void );
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
int lwg_parse_yylex_destroy (void );
int lwg_parse_yyget_debug (void );
void lwg_parse_yyset_debug (int debug_flag );
YY_EXTRA_TYPE lwg_parse_yyget_extra (void );
void lwg_parse_yyset_extra (YY_EXTRA_TYPE user_defined );
FILE *lwg_parse_yyget_in (void );
void lwg_parse_yyset_in (FILE * in_str );
FILE *lwg_parse_yyget_out (void );
void lwg_parse_yyset_out (FILE * out_str );
int lwg_parse_yyget_leng (void );
char *lwg_parse_yyget_text (void );
int lwg_parse_yyget_lineno (void );
void lwg_parse_yyset_lineno (int line_number );
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
......@@ -3877,7 +3930,12 @@ static int input (void );
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif
/* Copy whatever the last rule matched to the standard output. */
......@@ -3885,7 +3943,7 @@ static int input (void );
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
#define ECHO (void) fwrite( lwg_parse_yytext, lwg_parse_yyleng, 1, lwg_parse_yyout )
#define ECHO do { if (fwrite( lwg_parse_yytext, lwg_parse_yyleng, 1, lwg_parse_yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
......@@ -3965,7 +4023,7 @@ YY_DECL
#line 29 "wktparse.lex"
#line 3969 "lex.yy.c"
#line 4027 "lex.yy.c"
if ( !(yy_init) )
{
......@@ -4257,7 +4315,7 @@ YY_RULE_SETUP
#line 78 "wktparse.lex"
ECHO;
YY_BREAK
#line 4261 "lex.yy.c"
#line 4319 "lex.yy.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(vals_ok):
yyterminate();
......@@ -4489,7 +4547,7 @@ static int yy_get_next_buffer (void)
/* Read in more data. */
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
(yy_n_chars), num_to_read );
(yy_n_chars), (size_t) num_to_read );
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
}
......@@ -4513,6 +4571,14 @@ static int yy_get_next_buffer (void)
else
ret_val = EOB_ACT_CONTINUE_SCAN;
if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
/* Extend the array by 50%, plus the number we really need. */
yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) lwg_parse_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
}
(yy_n_chars) += number_to_move;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
......@@ -4659,7 +4725,7 @@ static int yy_get_next_buffer (void)
case EOB_ACT_END_OF_FILE:
{
if ( lwg_parse_yywrap( ) )
return 0;
return EOF;
if ( ! (yy_did_buffer_switch_on_eof) )
YY_NEW_FILE;
......@@ -4923,7 +4989,9 @@ static void lwg_parse_yyensure_buffer_stack (void)
(yy_buffer_stack) = (struct yy_buffer_state**)lwg_parse_yyalloc
(num_to_alloc * sizeof(struct yy_buffer_state*)
);
if ( ! (yy_buffer_stack) )
YY_FATAL_ERROR( "out of dynamic memory in lwg_parse_yyensure_buffer_stack()" );
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
(yy_buffer_stack_max) = num_to_alloc;
......@@ -4941,6 +5009,8 @@ static void lwg_parse_yyensure_buffer_stack (void)
((yy_buffer_stack),
num_to_alloc * sizeof(struct yy_buffer_state*)
);
if ( ! (yy_buffer_stack) )
YY_FATAL_ERROR( "out of dynamic memory in lwg_parse_yyensure_buffer_stack()" );
/* zero only the new slots.*/
memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
......@@ -4985,7 +5055,7 @@ YY_BUFFER_STATE lwg_parse_yy_scan_buffer (char * base, yy_size_t size )
/** Setup the input buffer state to scan a string. The next call to lwg_parse_yylex() will
* scan from a @e copy of @a str.
* @param str a NUL-terminated string to scan
* @param yystr a NUL-terminated string to scan
*
* @return the newly allocated buffer state object.
* @note If you want to scan bytes that may contain NUL values, then use
......@@ -4999,8 +5069,8 @@ YY_BUFFER_STATE lwg_parse_yy_scan_string (yyconst char * yystr )
/** Setup the input buffer state to scan the given bytes. The next call to lwg_parse_yylex() will
* scan from a @e copy of @a bytes.
* @param bytes the byte buffer to scan
* @param len the number of bytes in the buffer pointed to by @a bytes.
* @param yybytes the byte buffer to scan
* @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
*
* @return the newly allocated buffer state object.
*/
......
This diff is collapsed.
/* A Bison parser, made by GNU Bison 2.3. */
/* Skeleton interface for Bison's Yacc-like parsers in C
/* A Bison parser, made by GNU Bison 2.4.1. */
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
/* Skeleton interface for Bison's Yacc-like parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
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 2, or (at your option)
any later version.
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 Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
......@@ -29,10 +28,11 @@
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
......@@ -126,17 +126,22 @@
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 22 "wktparse.y"
{
/* Line 1676 of yacc.c */
#line 22 "wktparse.y"
double value;
const char* wkb;
}
/* Line 1529 of yacc.c. */
#line 136 "y.tab.h"
YYSTYPE;
/* Line 1676 of yacc.c */
#line 141 "y.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE lwg_parse_yylval;
......@@ -155,3 +160,4 @@ typedef struct YYLTYPE
#endif
extern YYLTYPE lwg_parse_yylloc;
*.log
aclocal.m4
autom4te.cache
configure
config.status
ID
libtool
ltmain.sh
tags
wktraster_config.h
wktraster_config.h.in
set tabstop=4
set shiftwidth=4
set expandtab
This diff is collapsed.
- The BAM project, University Laval, sponsored project management kick-start.
- CadCorp (http://www.cadcorp.com/) sponsored WKB and datum format design
and implementation.
- The Michigan Tech Research Institute sponsored spatial operators
implementation.
- Refractions Research Inc. provided svn repository
- Pierre Racine designed the functionality
- Sandro Santilli wrote the in-memory api, build scripts and
postgresql connectors
- Deimos Space (http://www.deimos-space.com/UK/index.asp?lang=UK), under
"España Virtual" project (http://www.espanavirtual.org/?q=en)
sponsored the creation of several core and import/export functions
#############################################################################
# $Id: Makefile 3940 2009-03-30 09:30:43Z mloskot $
#
# Master makefile used to build WKT Raster
#
# Copyright (c) 2009 Sandro Santilli <strk@keybit.net>
#
# This is free software; you can redistribute and/or modify it under
# the terms of the GNU General Public Licence. See the COPYING file.
#
#############################################################################
all: @RT_CORE_LIB@ @RT_PG_LIB@ @RT_POSTGIS_SQL@
corelib:
$(MAKE) -C rt_core
pglib:
$(MAKE) -C rt_pg
rtpostgis.sql:
$(MAKE) -C rt_pg rtpostgis.sql
install: all
$(MAKE) -C rt_pg install
$(MAKE) -C scripts/python install
clean:
$(MAKE) -C rt_core $@
$(MAKE) -C rt_pg $@
$(MAKE) -C test $@
$(MAKE) -C scripts/python $@
distclean: clean
$(RM) -R autom4te.cache
$(RM) config.status
check:
$(MAKE) -C test $@
@echo
@echo "Consider also running make post-install-check after installation"
@echo
post-install-check:
$(MAKE) -C test $@
Sun Sep 26 23:10:45 CEST 2010
Extension added to PostGIS SVN version.
Mon Jan 26 18:58:35 CET 2009
First in-memory raster management api implemented,
initial work on postgresql interface.
# Version numbering central repository, to be included from various
# places during the build process
# See HOWTO_RELEASE file in SVN for definitions of those three.
POSTGIS_RASTER_MAJOR_VERSION=0
POSTGIS_RASTER_MINOR_VERSION=1
POSTGIS_RASTER_MICRO_VERSION=6d
RFC1: serialized format (storage) for RASTER type
------------------------------------------------------
$Author$
$Date$
$Revision$
------------------------------------------------------
The goals of the serialized version for RASTER type are:
- Small memory footprint on deserialization
This means that the amount of allocated memory
required for deserialization is minimal
- Fast access
Access to band data must be aligned, saving from
memory copies on full scan.
- Ease of format switch
On-disk format must be allowed to change
w/out need for dump-reload of the whole
database.
The first two goals boil down to forcing alignment of band
data in the serialized format itself, which in turn will
require variable padding based on pixeltype of each band.
For simplicity we will ensure that each band of the
raster starts at the 8-byte boundary and thus pad
previous structures in the stream accordingly.
The structure will then look like this:
[HEADER] [BAND0] [BAND1] [BAND2]
^aligned ^aligned ^aligned
The third goal can be accomplished by adding a version
number to the serialized format so that in case of changes
the deserializer can pick the correct parsing procedure
based on that.
The HEADER
----------
PostgreSQL forces a 4-byte size field a the start of
the detoasted datum, and ensure this start of structure
is aligned to 8-byte. We'll add version number right after it,
and then make sure the total size is a multiple of 8 bytes.
The following structure is composed by 8 slots of 8-bytes,
totaling 64 bytes:
struct rt_raster_serialized_t {
/*---[ 8 byte boundary ]---{ */
uint32_t size; /* required by postgresql: 4 bytes */
uint16_t version; /* format version (this is version 0): 2 bytes */
uint16_t numBands; /* Number of bands: 2 bytes */
/* }---[ 8 byte boundary ]---{ */
double scaleX; /* pixel width: 8 bytes */
/* }---[ 8 byte boundary ]---{ */
double scaleY; /* pixel height: 8 bytes */
/* }---[ 8 byte boundary ]---{ */
double ipX; /* insertion point X: 8 bytes */
/* }---[ 8 byte boundary ]---{ */
double ipY; /* insertion point Y: 8 bytes */
/* }---[ 8 byte boundary ]---{ */
double skewX; /* rotation about the X axis: 8 bytes */
/* }---[ 8 byte boundary ]---{ */
double skewY; /* rotation about the Y axis: 8 bytes */
/* }---[ 8 byte boundary ]--- */
int32_t srid; /* Spatial reference id: 4 bytes */
uint16_t width; /* pixel columns: 2 bytes */
uint16_t height; /* pixel rows: 2 bytes */
};
The BANDS
---------
Given the serialized raster header structure above, it
is guaranteed that a serialized band always start at 8-bytes
boundary, so it's simpler to compute padding required