From e10df2567c0901938ffebfcfa4d7133cd6e457bb Mon Sep 17 00:00:00 2001 From: czentgr Date: Mon, 24 May 2021 15:41:36 -0700 Subject: [PATCH] Add spatial analytics demo --- spatial/README_spatial_samples.txt | 61 + spatial/bank/saBankDemoDDL.db2 | 98 ++ spatial/bank/saBankDemoREADME.txt | 260 ++++ spatial/bank/saBankDemoRefresh.db2 | 57 + spatial/bank/saBankDemoRunBankDemo | 1607 +++++++++++++++++++++++++ spatial/bank/saBankDemoSpatialSQL.db2 | 1424 ++++++++++++++++++++++ spatial/bank/saBankDemoTableData.db2 | 1097 +++++++++++++++++ spatial/bank/saBankDemoViewDDL.db2 | 213 ++++ spatial/data/cityLimits.dbf | Bin 0 -> 4672 bytes spatial/data/cityLimits.prj | 1 + spatial/data/cityLimits.shp | Bin 0 -> 92404 bytes spatial/data/cityLimits.shx | Bin 0 -> 556 bytes spatial/data/floodzones.dbf | Bin 0 -> 1162 bytes spatial/data/floodzones.prj | 1 + spatial/data/floodzones.shp | Bin 0 -> 5140 bytes spatial/data/floodzones.shx | Bin 0 -> 404 bytes spatial/data/offices.dbf | Bin 0 -> 1339 bytes spatial/data/offices.prj | 1 + spatial/data/offices.shp | Bin 0 -> 968 bytes spatial/data/offices.shx | Bin 0 -> 348 bytes spatial/data/regions.dbf | Bin 0 -> 337 bytes spatial/data/regions.prj | 1 + spatial/data/regions.shp | Bin 0 -> 12364 bytes spatial/data/regions.shx | Bin 0 -> 124 bytes spatial/data/salezones.dbf | Bin 0 -> 722 bytes spatial/data/salezones.prj | 1 + spatial/data/salezones.shp | Bin 0 -> 1672 bytes spatial/data/salezones.shx | Bin 0 -> 180 bytes spatial/data/sjCensusBlocks.dbf | Bin 0 -> 28046 bytes spatial/data/sjCensusBlocks.prj | 1 + spatial/data/sjCensusBlocks.shp | Bin 0 -> 81580 bytes spatial/data/sjCensusBlocks.shx | Bin 0 -> 2012 bytes spatial/data/sjMainStreets.dbf | Bin 0 -> 51434 bytes spatial/data/sjMainStreets.prj | 1 + spatial/data/sjMainStreets.shp | Bin 0 -> 71188 bytes spatial/data/sjMainStreets.shx | Bin 0 -> 4004 bytes spatial/data/sjZipCodes.dbf | Bin 0 -> 13250 bytes spatial/data/sjZipCodes.prj | 1 + spatial/data/sjZipCodes.shp | Bin 0 -> 76188 bytes spatial/data/sjZipCodes.shx | Bin 0 -> 484 bytes spatial/data/st_linestring.dbf | Bin 0 -> 111 bytes spatial/data/st_linestring.prj | 1 + spatial/data/st_linestring.shp | Bin 0 -> 940 bytes spatial/data/st_linestring.shx | Bin 0 -> 140 bytes spatial/data/st_multilinestring.dbf | Bin 0 -> 65 bytes spatial/data/st_multilinestring.prj | 1 + spatial/data/st_multilinestring.shp | Bin 0 -> 100 bytes spatial/data/st_multilinestring.shx | Bin 0 -> 100 bytes spatial/data/st_multipoint.dbf | Bin 0 -> 273 bytes spatial/data/st_multipoint.prj | 1 + spatial/data/st_multipoint.shp | Bin 0 -> 744 bytes spatial/data/st_multipoint.shx | Bin 0 -> 284 bytes spatial/data/st_multipolygon.dbf | Bin 0 -> 192 bytes spatial/data/st_multipolygon.prj | 1 + spatial/data/st_multipolygon.shp | Bin 0 -> 7640 bytes spatial/data/st_multipolygon.shx | Bin 0 -> 212 bytes spatial/data/st_point.dbf | Bin 0 -> 390 bytes spatial/data/st_point.prj | 1 + spatial/data/st_point.shp | Bin 0 -> 1108 bytes spatial/data/st_point.shx | Bin 0 -> 388 bytes spatial/data/st_polygon.dbf | Bin 0 -> 120 bytes spatial/data/st_polygon.prj | 1 + spatial/data/st_polygon.shp | Bin 0 -> 6680 bytes spatial/data/st_polygon.shx | Bin 0 -> 148 bytes 64 files changed, 4831 insertions(+) create mode 100644 spatial/README_spatial_samples.txt create mode 100644 spatial/bank/saBankDemoDDL.db2 create mode 100644 spatial/bank/saBankDemoREADME.txt create mode 100644 spatial/bank/saBankDemoRefresh.db2 create mode 100755 spatial/bank/saBankDemoRunBankDemo create mode 100644 spatial/bank/saBankDemoSpatialSQL.db2 create mode 100644 spatial/bank/saBankDemoTableData.db2 create mode 100644 spatial/bank/saBankDemoViewDDL.db2 create mode 100644 spatial/data/cityLimits.dbf create mode 100644 spatial/data/cityLimits.prj create mode 100644 spatial/data/cityLimits.shp create mode 100644 spatial/data/cityLimits.shx create mode 100644 spatial/data/floodzones.dbf create mode 100644 spatial/data/floodzones.prj create mode 100644 spatial/data/floodzones.shp create mode 100644 spatial/data/floodzones.shx create mode 100644 spatial/data/offices.dbf create mode 100644 spatial/data/offices.prj create mode 100644 spatial/data/offices.shp create mode 100644 spatial/data/offices.shx create mode 100644 spatial/data/regions.dbf create mode 100644 spatial/data/regions.prj create mode 100644 spatial/data/regions.shp create mode 100644 spatial/data/regions.shx create mode 100644 spatial/data/salezones.dbf create mode 100644 spatial/data/salezones.prj create mode 100644 spatial/data/salezones.shp create mode 100644 spatial/data/salezones.shx create mode 100644 spatial/data/sjCensusBlocks.dbf create mode 100644 spatial/data/sjCensusBlocks.prj create mode 100644 spatial/data/sjCensusBlocks.shp create mode 100644 spatial/data/sjCensusBlocks.shx create mode 100644 spatial/data/sjMainStreets.dbf create mode 100644 spatial/data/sjMainStreets.prj create mode 100644 spatial/data/sjMainStreets.shp create mode 100644 spatial/data/sjMainStreets.shx create mode 100644 spatial/data/sjZipCodes.dbf create mode 100644 spatial/data/sjZipCodes.prj create mode 100644 spatial/data/sjZipCodes.shp create mode 100644 spatial/data/sjZipCodes.shx create mode 100644 spatial/data/st_linestring.dbf create mode 100644 spatial/data/st_linestring.prj create mode 100644 spatial/data/st_linestring.shp create mode 100644 spatial/data/st_linestring.shx create mode 100644 spatial/data/st_multilinestring.dbf create mode 100644 spatial/data/st_multilinestring.prj create mode 100644 spatial/data/st_multilinestring.shp create mode 100644 spatial/data/st_multilinestring.shx create mode 100644 spatial/data/st_multipoint.dbf create mode 100644 spatial/data/st_multipoint.prj create mode 100644 spatial/data/st_multipoint.shp create mode 100644 spatial/data/st_multipoint.shx create mode 100644 spatial/data/st_multipolygon.dbf create mode 100644 spatial/data/st_multipolygon.prj create mode 100644 spatial/data/st_multipolygon.shp create mode 100644 spatial/data/st_multipolygon.shx create mode 100644 spatial/data/st_point.dbf create mode 100644 spatial/data/st_point.prj create mode 100644 spatial/data/st_point.shp create mode 100644 spatial/data/st_point.shx create mode 100644 spatial/data/st_polygon.dbf create mode 100644 spatial/data/st_polygon.prj create mode 100644 spatial/data/st_polygon.shp create mode 100644 spatial/data/st_polygon.shx diff --git a/spatial/README_spatial_samples.txt b/spatial/README_spatial_samples.txt new file mode 100644 index 0000000..5d09d10 --- /dev/null +++ b/spatial/README_spatial_samples.txt @@ -0,0 +1,61 @@ +README file for Db2 Spatial Analytics Samples + +* +* +* (C) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 2000, 2021. +* + ALL RIGHTS RESERVED. +* + + +File: samples/spatial/README_spatial_samples.txt + +The Db2 Spatial Analytics samples consist of one demo program. + - One sample is based on banking (branches, customers, employees). + This banking demo is written in SQL scripts run by the command-line + processor (CLP). +This file briefly introduces the demo and indicates where to look for +further information. + + += = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +The Banking Demo is implemented in SQL scripts that are run with the Db2 +command line processor. You can use the demo and scripts as a tutorial. +The scripts and README file "saBankDemoREADME.txt" are located in the +"bank" subdirectory (sqllib/extenders/samples/spatial/bank). +The following excerpt from that file gives an introduction to the demo: +***************************************************************************** + Banking Customer Analysis Sample + + This demo illustrates adding a spatial dimension to an existing + information system. The existing system did not contain any explicit + location (spatial) data. However, the existing system did contain implicit + location data in the form of addresses. By spatially enabling the existing + database, the user expands the business analysis capabilities of the system. + + A bank that has customers with accounts at two branches needs to use the + spatial attribute of the existing data along with census demographic data + to perform various kinds of spatial analysis. The analysis consists of + comparing customer, branch, and demographic data, as well as profiling + customers and doing market analysis. The bank looks for prospective + customers by finding average balances for customers within three miles of + the branch, determining what areas the primary customers live in, and + searching for similar areas. + + Note: Although this demo focuses on a banking application, it is equally + applicable to different businesses such as retail, insurance, and so on. +***************************************************************************** + +For UNIX, the Banking Demo is driven by a Korn shell script called +"saBankDemoRunBankDemo". To display usage information, enter + saBankDemoRunBankDemo -h + +For Windows, the Banking Demo is driven by a batch file which is TBD. + +Before you run the demo, look at the "saBankDemoREADME.txt" file. This +README file describes the prerequisites and explains how to run the demo. + +After the Banking Demo runs, the complete record of its actions can be found +in the file "sa_bank.log" which is in the "tmp", subdirectory under the home +directory of the user who ran the demo. + diff --git a/spatial/bank/saBankDemoDDL.db2 b/spatial/bank/saBankDemoDDL.db2 new file mode 100644 index 0000000..f5b87dc --- /dev/null +++ b/spatial/bank/saBankDemoDDL.db2 @@ -0,0 +1,98 @@ +---------------------------------------------------------------------------- +-- Licensed Materials - Property of IBM +-- Governed under the terms of the IBM Public License +-- +-- (C) COPYRIGHT International Business Machines Corp. 2000 - 2021 +-- All Rights Reserved. +-- +-- US Government Users Restricted Rights - Use, duplication or +-- disclosure restricted by GSA ADP Schedule Contract with IBM Corp. +---------------------------------------------------------------------------- +-- +-- Component Name: Db2 Spatial Analytics +-- +-- Source File Name: saBankDemoDDL.db2 +-- +-- Version: 11.5.6+ +-- +-- Description: Load non-spatial data into the sample database. +-- +-- SQL STATEMENTS USED: +-- DROP TABLE +-- CREATE TABLE +-- +-- The tables are created using the database default table organization. +-- Note: for column organized tables the primary keys are not enforced +-- by default. +-- +-- For more information about the Db2 Spatial Analytics Bank Demo scripts, +-- see the saBankDemoREADME.txt file. +-- +-- For more information about Db2 Spatial Analytics component, refer to the +-- documentation at +-- https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics. +-- +-- For the latest information on Db2 refer to the Db2 website at +-- https://www.ibm.com/analytics/db2. +---------------------------------------------------------------------------- +CREATE TABLE sa_demo.customers ( + customer_id INTEGER NOT NULL + PRIMARY KEY ENFORCED, + sa_row_id INTEGER, + name VARCHAR (20), + street VARCHAR (25), + city VARCHAR (10), + state VARCHAR (2), + zip VARCHAR (5), + phone VARCHAR (20) , + email VARCHAR (50) , + customer_type VARCHAR (10) , + date_billed DATE , + notes VARCHAR (100), + date_entered DATE, + latitude DOUBLE, + longitude DOUBLE + ) ; + +CREATE TABLE sa_demo.branches ( + branch_id INTEGER NOT NULL + PRIMARY KEY ENFORCED, + sa_row_id INTEGER, + name VARCHAR (12), + manager VARCHAR (20), + street VARCHAR (20), + city VARCHAR (10), + state VARCHAR (2), + zip VARCHAR (5), + phone VARCHAR (30), + fax VARCHAR (30), + latitude DOUBLE, + longitude DOUBLE + ) ; + +CREATE TABLE sa_demo.accounts ( + customer_id INTEGER NOT NULL, + branch_id INTEGER NOT NULL, + account_id INTEGER NOT NULL + PRIMARY KEY ENFORCED, + type VARCHAR (10) NOT NULL, + balance DECIMAL (14, 2) NOT NULL, + routing_number integer NOT NULL, + CONSTRAINT fk_branches FOREIGN KEY(branch_id) + REFERENCES sa_demo.branches(branch_id) ON DELETE CASCADE, + CONSTRAINT fk_customers FOREIGN KEY(customer_id) + REFERENCES sa_demo.customers(customer_id) ON DELETE CASCADE + ) ; + +CREATE TABLE sa_demo.transactions ( + transaction_id INTEGER NOT NULL + PRIMARY KEY, + transaction_date DATE NOT NULL, + description VARCHAR (100), + account_id INTEGER NOT NULL , + amount DECIMAL (14, 2) NOT NULL, + notes VARCHAR (100), + classification VARCHAR (30), + CONSTRAINT fk_accounts FOREIGN KEY(account_id) + REFERENCES sa_demo.accounts(account_id) ON DELETE CASCADE + ) ; diff --git a/spatial/bank/saBankDemoREADME.txt b/spatial/bank/saBankDemoREADME.txt new file mode 100644 index 0000000..8f1eafa --- /dev/null +++ b/spatial/bank/saBankDemoREADME.txt @@ -0,0 +1,260 @@ +README file for Db2 Spatial Analytics Bank Demo +Db2 LUW + + +* +* +* (C) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 2002 - 2021. +* ALL RIGHTS RESERVED. +* + + +This sample script demonstrates Db2 Spatial Analytics administration, +SQL stored procedures, and spatial functions. + +***************************************************************************** + +WARNING: Some of these samples may change your database or database manager + configuration. Run the samples against a "test" database only, + such as the Db2 SAMPLE database. + +***************************************************************************** + +QUICKSTART + + 1. Start the database manager (with the db2start command). + + 2. Start the sample (with the saBankDemoRunBankDemo command). + +***************************************************************************** + +Documentation + + + +For more information about Db2 Spatial Analytics, see either of the following +sources. The scripts in this Bank Demo use the term "User's Guide" to refer +to both of these sources of information: + +- The equivalent Spatial Analytics topics in the Db2 Documentation. + https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics + +For the latest information about programming, compiling, and running Db2 +Spatial Analytics applications, refer to +TODO fix link +http://www.ibm.com/software/data/spatial/db2spatial + + + +***************************************************************************** + +Command syntax + + + saBankDemoRunBankDemo [-i | -n | -c | -b | -h] [] + + -i Interactive mode: A description of each step is shown before + you are prompted to execute the step. Explains the story + board of the bank scenario and the spatial administrative + actions necessary to set up the database. After the database + is set up, you are prompted to perform several queries. + + -n Non-interactive mode: Follows the same steps as the + interactive mode but does not prompt you at each step. + This mode can be used to set up a database for visualization + or for further spatial analysis with SQL. + + -c Completion mode: All the demo steps run in non-interactive + mode. At the end, the script notifies you of success or + failure. + + -b Basic mode: This mode is tutorial oriented, in which you + follow a written script to perform all the database setup + steps on the db2gse command-line processor (CLP) or Db2 + Command Editor. + The database is spatially enabled and only non-spatial data is + loaded. You perform the remaining steps. You also construct + a series of spatial queries using the Db2 CLP or the + DB2 Command Editor. + + If database does not exist, the demo creates it. The + default database name is sa_bank. + The schema name is sa_demo (you cannot modify the schema name). + + + +***************************************************************************** + +Prerequisites + + + + 1. Before you start the sample program, ensure that the following steps have + been done in advance: + + - Db2 Spatial Analytics is enabled, if needed. + + - The Db2 default instance is created. + + - The Database manager is started (with the db2start command). + + - The DB2PATH environment variable points to the sqllib directory. + + - The user ID under which this demo is invoked has either SYSADM + or DBADM authority. + + 2. If you are running this demo a second time, delete all of the previous + message and exception files that have the following form: + On UNIX, + ~/tmp/*.msg and ~/tmp/*.shp + + On Windows, + %TEMP%\*.msg and %TEMP%\*.shp + +The following steps are needed if the instance is not configured +as a warehouse (that is the registry DB2_WORKLOAD is not set to ANALYTICS). + 3. If you are going to create a new database or use an existing database, + ensure that the following parameters are updated to at least the listed + values: + + Parameter Min value CO Explanation/Description + ------------ --------- -- ------------------------------------------ + APPLHEAPSZ 10242 no various (also for enable_db) + STMTHEAP 16384 yes Various platforms raise "query too complex" + warnings + + CO => Configurable Online + + Note: Some of these parameters are not online configurable, and you must + stop and restart the DB2 instance for the new values to take effect. + + If these parameters are not set to the values listed above, the demo will + prompt you to ask if you want the demo to update these values for + the database. If you reply "yes," the demo stops and restarts the DB2 + instance. + + + 4. This demo requires larger buffer pools and table spaces than provided by + the default buffer pool and table space. + + CREATE object Page size Explanation/Description + -------------------------- --------- -------------------------------- + TABLESPACE 8K Import a shapefile with more columns + than fit on a 4K page size + TEMPORARY TABLESPACE 32K Complex ad hoc queries + USER TEMPORARY TABLESPACE 32K Spatial grid index advisor + BUFFERPOOL 8K Use with 8K table space + BUFFERPOOL 32K Use with 32K table space + + If these database objects do not exist, the demo will prompt you to + ask if you want the demo to create them. If you reply "yes," the demo + stops and restarts the DB2 instance for them to take effect. + + +***************************************************************************** + +File descriptions + +saBankDemoREADME.txt - This file +saBankDemoRunBankDemo - Main demo script (Korn Shell) +saBankDemoRunBankDemo.bat - Main demo script (Windows batch file) +saBankDemoDDL.db2 - Creates non-spatial data tables +saBankDemoTableData.db2 - Loads non-spatialdata +saBankDemoSpatialSQL.db2 - Miscellaneous spatial queries +saBankDemoViewDDL.db2 - Creates spatial analysis views +saBankDemoRefresh.db2 - Drops all the tables and views + +***************************************************************************** + +Background + +Time and space will become the cornerstone of 21st-century data warehouses. +The time dimension is already frequently used in OLAP and multidimensional +analysis tools. The next frontier is to add the space dimension to +data to discover and exploit the spatial intelligence of the data warehouse. + +Spatial data (also called location data and geographic data) consists of +values that denote the location of objects and areas with respect to one +another. Spatial objects include those that comprise the Earth's surface +and those that occupy it. They make up both the natural environment (for +example rivers, forests, hills and deserts) and the cultural environment +(cities, residences, office buildings, landmarks, and so on). + +Virtually every database already has spatial data -- addresses -- and +virtually every business can benefit from making their data spatially aware. + +It is estimated that 80% of the world's databases have a spatial element. +This data, however, is not usable because it is stored in text form, and +SQL does not know if 12 Main Street is close to 141 Langdon Street. This +address data is at the core of most commercial enterprises, yet the semantic +content is not exploited. The ability to leverage the value of this +existing data asset is central to spatial analysis. + +IBM has focused research efforts on creating an extensible data management +infrastructure for more than a decade. The results of these efforts have +become a major component of IBM's Db2 Database, which includes +access to heterogeneous data and to non-IBM, non-relational data sources. + +The ability to model complex data and objects (geospatial data, text, images +and other user-defined data types) directly in the database gives users +four key benefits: + +- Enhances the business value of existing applications and data +- Improves business intelligence with integrated searching across all data + types +- Facilitates the development of new applications and queries +- Improves overall application performance + + +***************************************************************************** + +Banking customer analysis sample + +This demo illustrates adding a spatial dimension to an existing information +system. The existing system did not contain any explicit location (spatial) +data. However, the existing system did contain implicit location data in the +form of addresses. By spatially enabling the existing database, the user +expands the business analysis capabilities of the system. + +Note: Although this demo focuses on a banking application, it is equally +applicable to different businesses such as retail, insurance, and so on. + +A bank that has customers with accounts at two branches needs to use the +spatial attribute of the existing data along with census demographic data +to perform various kinds of spatial analysis. The analysis consists of +comparing customer, branch, and demographic data, as well as profiling +customers and doing market analysis. The bank looks for prospective +customers by finding average balances for customers within three miles of +the branch, determining what areas the primary customers live in, and +searching for similar areas. + +The demographic and spatial reference data has an explicit spatial component. +The initial data is in shapefile format. Shapefile format is an ESRI standard +for storing spatial information and has become an industry standard. For more +information, see the ESRI Web site at +http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf. + +The customer, branch and employee tables contain the address information +and corresponding latitude and longitude values. + +The demo script illustrates how to use the spatial administration commands +and prepare a database for spatial data visualization using ESRI's +ArcExplorer. The sample also explains how to use the spatial routines, and +outlines how spatial analysis can be used in a banking scenario. + +The demo script runs in four modes that are described in the command syntax. + +***************************************************************************** + +Duration + +Most of the demo steps take seconds to run, but the steps below might +take several minutes: + +- Creating the database + +- Spatially enabling the database, if needed + +- Importing shapefile data + +***************************************************************************** diff --git a/spatial/bank/saBankDemoRefresh.db2 b/spatial/bank/saBankDemoRefresh.db2 new file mode 100644 index 0000000..e0c745b --- /dev/null +++ b/spatial/bank/saBankDemoRefresh.db2 @@ -0,0 +1,57 @@ +---------------------------------------------------------------------------- +-- Licensed Materials - Property of IBM +-- Governed under the terms of the IBM Public License +-- +-- (C) COPYRIGHT International Business Machines Corp. 2000 - 2021 +-- All Rights Reserved. +-- +-- US Government Users Restricted Rights - Use, duplication or +-- disclosure restricted by GSA ADP Schedule Contract with IBM Corp. +---------------------------------------------------------------------------- +-- +-- Component Name: Db2 Spatial Analytics v11.5 +-- +-- Source File Name: saBankDemoRefresh.db2 +-- +-- Version: 11.5.6+ +-- +-- Description: Drops all the tables and views, and spatially disables the +-- current database. +-- +-- SQL STATEMENTS USED: +-- DROP TABLE +-- DROP VIEW +-- +-- For more information about the Db2 Spatial Analytics Bank Demo scripts, +-- see the saBankDemoREADME.txt file. +-- +-- For more information about Db2 Spatial Analytics component, refer to the +-- documentation at +-- https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics. +-- +-- For the latest information on Db2 refer to the Db2 website at +-- https://www.ibm.com/analytics/db2. +---------------------------------------------------------------------------- + +DROP VIEW sa_demo.meridian_customers ; +DROP VIEW sa_demo.sancarlos_customers; +DROP VIEW sa_demo.closest_branch; +DROP VIEW sa_demo.customers_savings ; +DROP VIEW sa_demo.customers_checkings ; +DROP VIEW sa_demo.customers_totals ; +DROP VIEW sa_demo.closest_savings ; +DROP VIEW sa_demo.closest_checking; +DROP VIEW sa_demo.overlap_zone; +DROP VIEW sa_demo.avg_savings_block; +DROP VIEW sa_demo.prospects; +DROP TABLE sa_demo.branch_buffers ; + +DROP TABLE sa_demo.customers ; +DROP TABLE sa_demo.branches ; +DROP TABLE sa_demo.accounts ; +DROP TABLE sa_demo.transactions ; +DROP TABLE sa_demo.city_limits; +DROP TABLE sa_demo.sales_regions; +DROP TABLE sa_demo.sj_census_blocks; +DROP TABLE sa_demo.sj_zipcodes; +DROP TABLE sa_demo.sj_main_streets; diff --git a/spatial/bank/saBankDemoRunBankDemo b/spatial/bank/saBankDemoRunBankDemo new file mode 100755 index 0000000..6b35704 --- /dev/null +++ b/spatial/bank/saBankDemoRunBankDemo @@ -0,0 +1,1607 @@ +########################################################################## +# Licensed Materials - Property of IBM * +# 5765-478 * +# (c) Copyright IBM Corporation 2000-2011. * +# All rights reserved. * +# * +# US Government Users Restricted Rights - Use, duplication or * +# disclosure restricted by GSA ADP Schedule Contract with * +# IBM Corporation. * +#************************************************************************* +# Permission Notice * +# * +# Permission is granted to copy, use, modify, and merge this sample * +# software into your applications and to permit others to do any of the * +# foregoing. You may further distribute this software for * +# commercial purposes only as part of your application that adds * +# significant value and function beyond that provided by these * +# samples. * +# You must include this permission statement and retain the copyright * +# notice in all copies and modified versions of this software. * +# * +#************************************************************************* +# * +# DISCLAIMER OF WARRANTIES * +# * +# The sample software is provided to you by IBM to assist you in * +# developing your applications. THIS SOFTWARE IS PROVIDED AS-IS, * +# WITHOUT WARRANTY OF ANY KIND. IBM SHALL NOT BE LIABLE FOR ANY * +# DAMAGES ARISING OUT OF YOUR USE OR THE USE BY ANY THIRD PARTY * +# OF THE SAMPLE SOFTWARE EVEN IF IT HAS BEEN ADVISED OF THE POSSIBILITY * +# OF SUCH DAMAGES. IN ADDITION, IBM SHALL NOT BE LIABLE FOR ANY THIRD * +# PARTY CLAIMS AGAINST YOU. * +# * +#************************************************************************* +# * +# WARNING * +# * +# This sample may change your database or database manager * +# configuration. Execute the samples against a 'test' database only, * +# such as the DB2 sa_bank database. * +# * +#************************************************************************* +# Component Name: Db2 Spatial Analytics v11.5 +# +# Source File Name: saBankDemoRunBankDemo +# +# Version: 11.5.6+ +# +# Description: This script creates a sample bank database, +# ------------ creates a sample tables, insert rows into tables, +# spatially enables the database, sets up geocoder, +# runs geocoder, imports spatial data. +# S Y N T A X: +# ------------ +# saBankDemoRunBankDemo [-i | -n | -c | -b | -h] [-wh] [] +# +# If database does not exist it will be created. +# The default name that will be used is sa_bank. +# The schema name is sa_demo (you cannot modify the schema name). +# +# Command options +# +# -i Interactive mode: A description of each step is shown before +# you are prompted to execute the step. Explains the story +# board of the bank scenario and the spatial administrative +# actions necessary to set up the database. After the database +# is set up, you are prompted to perform several queries. +# +# -n Non-interactive mode: Follows the same steps as the +# interactive mode but does not prompt you at each step. +# This mode can be used to set up a database for visualization +# or for further spatial analysis with SQL. +# +# -c Completion mode: All the demo steps run in non-interactive +# mode. At the end, the script notifies you of success or +# failure. +# +# -b Basic mode: This mode is tutorial oriented, in which you +# follow a written script to perform all the database setup +# steps on the db2gse command-line processor (CLP) or Db2 +# Command Editor. +# The database is spatially enabled and only non-spatial data is +# loaded. You perform the remaining steps. You also construct +# a series of spatial queries using the Db2 CLP or the +# Db2 Command Editor. +# +# -wh Configures the instance as a warehouse by setting DB2_WORKLOAD +# to ANALYTICS (UNIX/LINUX only currently.) +# +#************************************************************************* +# +# Notes: +# ------ +# 0. Before proceeding, the following steps have been done in advance: +# - Db2 default instance has been created and configured as needed. +# - Start the database manager (with the db2start command). +# - DB2PATH environment variable points to the sqllib directory +# - The user ID under which this demo is invoked must have either SYSADM +# or DBADM authority. +# 1. If you are going to create a new database or use an existing database +# certain database configuration parameters must be updated. +# The following parameters must be updated to at least the listed +# values: +# Parameter min value CO description +# ------------ --------- -- ------------------------------------------- +# APPLHEAPSZ 2048 no various (also for enable_db) +# STMTHEAP 4096 yes Various platforms raise "query too complex" +# warnings +# CO => Configurable Online +# If these parameters are not to the values listed above the demo will +# prompt the user if they would like the demo to update these values for +# the database. NOTE, that some of the values are not online +# configurable which requires a db2stop and db2start for these values to +# take effect. +# 2. This demo Creates buffer pool and temporary table space which requires +# the database manager to be stopped(db2stop) and started(db2start) for +# them to take effect. +# 3. If you are running this demo for the second time make sure all the +# previous messages files in the ~/tmp/msg* are deleted. +# +#************************************************************************* +# +# Environment: Unix +# +#************************************************************************* +# +# For more information about the Db2 Spatial Analytics Bank demo script, +# see the file: saBankDemoREADME.txt +# +# For information on using Db2 Spatial Analytics, see the +# https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics +# documentation. +# In this Demo, this document is referred to simply as the [User's Guide]. +# +# For the latest information on Db2 refer to the Db2 website at +# https://www.ibm.com/analytics/db2. +# +########################################################################## + +#========================================================================= +# Environment settings: +# +# This is a Korn Shell script. It can not be interpreted on all platforms +# with a Bourne Shell interpreter. We will only proceed below this point +# if ksh is found in /usr/bin or /bin for compatibility reasons. +# +# If only sh exists the script might still work. You might then try to +# comment the lines below and run the script again. +#======================================================================== +if [[ $PPID -eq $BANK_ID ]] ; then + exit $? +fi + +export BANK_ID=$$ + +if [[ -x $(which ksh) ]] ; then + $(which ksh) $0 $@ +else + echo "This script requires a Korn-Shell to run. Please make sure that 'ksh' is installed." + exit 1 +fi + +#===================================================================== +# Name: create_db +# Purpose: Create Database for bank spatial sample +# Input: +# $1 => mode +# $2 => db_name +#===================================================================== +function create_db { + # local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset result='' # result of executing statement + typeset rc='' + typeset first='' # SQL error message number + + # Init log file + outfile=~/tmp/create_db.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Create database" $db_name and introduction + + echo "========================================================================" + echo " Welcome to Db2 Spatial Analytics Bank Demo!" + echo " " + echo " This demo will present the commands to create a banking database " + echo " and perform some basic spatial administration. " + echo " " + echo " During the demo you will be presented with the command and also " + echo " an explanation of the command and hints and tips." + echo " " + echo " The following is a list of places to find out more information " + echo " about Db2 Spatial Analytics:" + echo " - For more information about this demo please refer to the " + echo " readme saBankDemoREADME.txt. " + echo " - For more information about the commands used in this " + echo " demo please refer to the documentation " + echo " https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics." + echo " In the demo, we refer" + echo " to this document simply as the [User's Guide]. " + echo " " + echo " This demo is a shell script and can be stopped at any time by " + echo " pressing Control-C." + echo "------------------------------------------------------------------------" + echo "db2 create database" $db_name ". Please wait ..." + fi + + result=$(db2 create db $db_name) + rc=$? + echo "db2 create db $db_name" >>$outfile ; echo $result >>$outfile + + first=`expr "$result" | cut -d" " -f1` + + if [[ $rc = 0 ]] ; then + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo $result + press_any_key_to_continue + fi + else + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "* Create database was not successful" + echo $result + fi + # Check if the database already exists + if [[ $first = SQL1005* ]]; then + if [[ $mode = i ]] || [[ $mode = b ]]; then + press_any_key_to_continue + fi + else # The error message is not 'database already exists' + return 1 + fi + fi + + if [[ $rc = 0 ]] || [[ $first = SQL1005* ]] ; then + return 0 + else + return 1 + fi +} #//end of create_db function + + +#===================================================================== +# Name: update_cfg +# Purpose: Update database and database management configuration +# parameters necessary for the sample +# +# Parameter min value CO description +# ------------ --------- -- ------------------------------------------- +# APPLHEAPSZ 2048 no various and for enable_db +# STMTHEAP 4096 yes Various platforms raise "query too complex" +# warnings +# CO => Configurable Online +# << TO DO >> +# 1) It might be good to add a force application all if the disconnect failed +# 2) Add a refresh option +# 3) Add all the samples to the saBankDemoSpatialSQL.db2 +#===================================================================== +function update_cfg { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + #return codes of executing statements + typeset rc1=0 ; typeset rc2=0 ; typeset rc3=0 + typeset rc4=0 ; typeset rc5=0 + typeset rc_reset=0 ; rc_terminate=0 + typeset ans='' + + # Init log file + outfile=~/tmp/update_cfg.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Update Database configuration parameters" + echo "========================================================================" + echo " For this demo to operate correctly certain database configuration" + echo " parameters may need to be updated. The suggested values are:" + echo + echo " Parameter min value CO reason" + echo " ------------ --------- -- -------------------------------------------" + echo " APPLHEAPSZ 2048 no various SE commands, in particular enable_db" + echo " STMTHEAP 4096 yes Various platforms raise \"query too complex\"" + echo " warnings with some spatial queries" + echo " CO => Configurable Online" + echo + echo " Parameters that are NOT online configurable require all applications" + echo " to be disconnected from the database before they take effect." + echo + echo " This demo expects that you are the only one connected to this database" + echo " while this demo is running. If you elected for this demo to create" + echo " the database, you will be the only user connected to the database." + echo + echo " For more information about the parameters above and tuning your database " + echo " please refer to the Db2 Performance Tuning Guide. Please note that" + echo " the suggested parameters above are not a complete set of parameters" + echo " to be considering for tuning your spatial database nor are they" + echo " necessary the optimal values. The optimal values can vary depending on" + echo " the database, application and hardware requirements, however the" + echo " values above are adequate for this demo." + echo + echo " To view your current database configuration parameters use the DB2" + echo " command: db2 get database configuration. Details about this command" + echo " can be found in the Db2 Command Line Processor manual." + echo + echo " For more information about the required minimum configuration parameter" + echo " values for your spatial database refer to Chapter \"Setting up a " + echo " database\" in the User's Guide." + echo + echo " This next section of the demo will disconnect your id from the database" + echo " and update the database configuration variables to the values above." + echo + echo "------------------------------------------------------------------------" + fi + + while : + do + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo + echo "Do you want this script to update the database configuration parameters?" + echo "<> Answer y or n, then press RETURN:" + read ans + else + ans=y + fi + case "$ans" in + y)# The update commands for online configurable parameters below + # return 0 when successful, however setting the non-online + # configurable parameters returns 2 when successful because the + # user must disconnect all applications before the updated + # values take effect. To get all 0\'s, you have to first + # disconnect all applications before issuing update commands. + # + # The update command returns a 4 when a syntax error occurs. + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo 'Updating database configuration parameters. Please wait ...' + fi + + log db2 connect reset + rc_reset=$? + log db2 terminate + rc_terminate=$? + + log db2 "update db cfg for $db_name using APPLHEAPSZ 2048" + rc2=$? + log db2 "update db cfg for $db_name using STMTHEAP 4096" + rc5=$? + + showlog_pause + break ;; + + n) echo + echo "|| The database configuration parameters were not updated." + echo + break ;; + + *) echo "${ans}? Please answer y or n." + esac + done + + if [[ $rc2 = 0 ]] && \ + [[ $rc5 = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of update_cfg function + + +#===================================================================== +# Name: setup_db +# Purpose: Create tablespaces and bufferpools for demo +#===================================================================== +function setup_db { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + #return codes of executing statements + typeset rc_connect=0 + typeset rc_create_32k_bp=0; typeset rc_create_8k_bp=0 + typeset rc_create_temp_ts=0 ; typeset rc_create_user_temp_ts=0 + typeset rc_create_8k_ts=0 ; + typeset rc_grant1=0 ; typeset rc_grant2=0 + typeset rc_stop=0 ; typeset rc_start=0 + typeset rc_reset1=0 ; typeset rc_reset2=0 + + typeset ans='' + + # Init log file + outfile=~/tmp/setup_db.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Create bufferpools and tablespaces and grant public authority to" + echo "|> tablespaces." + echo "========================================================================" + echo " This is needed if the environment is not set to create a warehouse." + echo " In a warehouse environment the default database page size is 32k." + echo + echo " This part of the demo is going to create two buffer pools and two" + echo " tablespaces. The default tablespace has a 4k page size and the demo" + echo " requires one 8k page size and two 32k page size tablespaces. The 8k " + echo " page tablespace is for importing a shapefile with more columns than fit" + echo " on a 4k page size. The temporary table space is used for complex ad hoc" + echo " queries." + echo " The temporary tablespace uses a 32k page size." + echo + echo " Each tablespace must have an associated bufferpool. Since the default" + echo " bufferpool is of a small 4k page, therefore I need to create two other" + echo " bufferpools for the 8k and 32k tablespaces." + echo + echo " When a new bufferpool is created is requires the database to be stopped" + echo " before it goes into affect. Therefore, this next section will stop and" + echo " start the database manager." + echo + echo " This section also grants access to these new tablespaces to public, so" + echo " that anyone can create tables in these tablespaces." + echo + echo " For more information about bufferpools and tablespaces, please refer to" + echo " the Db2 SQL Reference." + echo "------------------------------------------------------------------------" + fi + + while : + do + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo + echo 'Do you want this script to create the bufferpools and tablespaces,' + echo ' which requires a stop and start of the database manager?' + echo '<> Answer y or n, then press RETURN: ' + read ans + else + ans=y + fi + case "$ans" in + y) if [[ $mode = i ]] || [[ $mode = b ]]; then + echo 'Creating the bufferpools and tablespaces. Please wait ...' + fi + + log db2 CONNECT RESET + rc_reset1=$? + log db2 CONNECT TO $db_name + rc_connect=$? + log db2 CREATE BUFFERPOOL sa_bank_32k_bp SIZE 1024 PAGESIZE 32 K + rc_create_32k_bp=$? + log db2 CREATE BUFFERPOOL sa_bank_8k_bp SIZE 1024 PAGESIZE 8 K + rc_create_8k_bp=$? + + log db2 "CREATE TEMPORARY TABLESPACE sa_bank_temp_ts \ + PAGESIZE 32 K MANAGED BY SYSTEM USING ('sa_bank_container_32k_tt') \ + EXTENTSIZE 64 PREFETCHSIZE 32 BUFFERPOOL sa_bank_32k_bp" + rc_create_ts=$? + + #log db2 "CREATE USER TEMPORARY TABLESPACE \ + # sa_bank_u_temp_ts \ + # PAGESIZE 32 K MANAGED BY SYSTEM USING ('sa_bank_container_32k_utt') \ + # EXTENTSIZE 64 PREFETCHSIZE 32 BUFFERPOOL sa_bank_32k_bp" + #rc_create_user_ts=$? + + log db2 "CREATE TABLESPACE sa_bank_8k_ts\ + PAGESIZE 8 K MANAGED BY SYSTEM USING ('sa_bank_container_8k') \ + EXTENTSIZE 16 PREFETCHSIZE 8 BUFFERPOOL sa_bank_8k_bp" + rc_create_8k_ts=$? + + log db2 GRANT USE OF TABLESPACE sa_bank_u_temp_ts TO PUBLIC + rc_grant1=$? + + log db2 GRANT USE OF TABLESPACE sa_bank_8k_ts TO PUBLIC + rc_grant2=$? + + log db2 CONNECT RESET + rc_reset2=$? + + log db2stop force + rc_stop=$? + + log db2start + rc_start=$? + + showlog_pause + break ;; + n) echo ; echo "|| The bufferpools and tablespaces were not created." + break ;; + *) echo ; echo "${ans}? Please answer y or n." + esac + done + + if [[ $rc_create_8k_bp = 0 ]] && \ + [[ $rc_create_temp_ts = 0 ]] && [[ $rc_create_user_temp_ts = 0 ]] && \ + [[ $rc_create_8k_ts = 0 ]] && [[ $rc_grant1 = 0 ]] && [[ $rc_grant2 = 0 ]] + then + return 0 + else + return 1 + fi +} #//end of setup_db function + + +#===================================================================== +# Name: enable_db +# Purpose: Spatially enable bank sample database +#===================================================================== +function enable_db { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + typeset rc_connect='' + typeset rc='' + + # Init log file + outfile=~/tmp/enable_db.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Spatially enable database" + echo "========================================================================" + echo " Most of Db2's Spatial Analytics administration is handled by a set of " + echo " stored procedures. User friendly mechanisms for calling these" + echo " stored procedures is provided via the command line tool db2se. " + echo " You will have access to these tools once Spatial Analytics is enabled." + echo " " + echo " The first step that must be performed on every database that you want to" + echo " store spatial data in is to spatially enable the database. Spatially " + echo " enabling your database creates the infrastructure to " + echo " perform all spatial tasks. The spatially enabling step creates all of" + echo " the spatial types, some spatial routines, spatial administrative" + echo " stored procedures, and the spatial catalog." + echo " " + echo " For syntax help on using db2se, typing db2se -h will give you usage" + echo " options." + echo " " + echo "------------------------------------------------------------------------" + echo " " + echo " Spatially enabling database" $db_name ". Please wait..." + fi + + log db2 CONNECT TO $db_name + rc_connect=$? + +if [[ $rc_connect = 0 ]] ; then + # Successful connection - run the script + log db2 "CALL SYSPROC.SYSINSTALLOBJECTS('GEO', 'C', NULL, NULL)" + rc=$? + if [[ $rc = 0 ]] ; then + showlog_pause + else + echo "* Spatially enabling the database " $db_name " was not successful:" + showlog + + # not successful + return 1 + fi + + # Make sure db2se will work + echo " Re-running a bind to make sure db2se works." + log db2 "bind $DB2PATH/bnd/@db2gse.lst" + rc=$? + if [[ $rc = 0 || $rc = 2 ]] ; then + showlog_pause + else + echo "* Binding db2se in database " $db_name " was not successful:" + showlog + + # not successful + return 1 + fi + + else + echo "* Could not connect to " $db_name ":" + showlog + + # not successful + return 1 + fi + + return 0 +} #//end of enable_db function + + +#===================================================================== +# Name: create_tables +# Purpose: Create tables +#===================================================================== +function create_tables { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + typeset rc_connect='' + typeset rc='' + + # Init log file + outfile=~/tmp/create_tables.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Create tables for Banking Demo" + echo "========================================================================" + echo " The definition for the tables is located in saBankDemoDDL.db2." + echo " All the tables are created in the sa_demo schema." + echo " Name Description" + echo " ----------- -----------------------------------------------------" + echo " Customers Information about each customer" + echo " Branches Information about each bank branch office" + echo " Accounts Information about the customers checking & saving accounts" + echo " Transactions Information about each banking transaction a customer makes" + echo + echo "------------------------------------------------------------------------" + echo "db2 connect to" $db_name " Please wait ..." + fi + + log db2 CONNECT TO $db_name + rc_connect=$? + + if [[ $rc_connect = 0 ]] ; then + # Successful connection - run the script + log db2 -tvf $SCRIPTDIR/saBankDemoDDL.db2 + rc=$? + + if [[ $rc = 0 ]] ; then + showlog_pause + else + echo "* Create tables for Banking Demo not successful:" + showlog + + # not successful + return 1 + fi + else + echo "* Could not connect to " $db_name ":" + showlog + + # not successful + return 1 + fi + + return 0 +} #//end of create_tables function + + + +#===================================================================== +# Name: insert_data +# Purpose: Insert non-spatial data. +#===================================================================== +function insert_data { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + typeset rc='' + typeset rc_connect='' + + # Init log file + outfile=~/tmp/insert_data.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Populate tables with records" + echo "========================================================================" + echo " This step is going to insert data into the previously created tables." + echo "------------------------------------------------------------------------" + echo "db2 connect to" $db_name " Please wait ..." + fi + + log db2 connect to $db_name + rc_connect=$? + + if [[ $rc_connect = 0 ]] ; then + # Successful connection - run the script + log db2 -tvf $SCRIPTDIR/saBankDemoTableData.db2 + rc=$? + + if [[ $rc = 0 ]] ; then + showlog_pause + else + echo "* Populate tables not successful:" + showlog + + # not successful + return 1 + fi + else + echo "* Could not connect to " $db_name ":" + showlog + + # not successful + return 1 + fi + + return 0 +} #//end of insert_data function + + + +#===================================================================== +# Name: add_spatial_column +# Purpose: Alter tables and add spatial column +#===================================================================== +function add_spatial_column { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset rc_connect='' + typeset rc_customers=''; typeset rc_branches='' + + # Init log file + outfile=~/tmp/add_spatial_column.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Add spatial column to business tables" + echo "========================================================================" + echo " There are 13 spatial types that comply to the OGC and SQL/MM object" + echo " hierarchy. The spatial types are all part of the SYSIBM schema. The" + echo " spatial types are of type BLOB(4M) that are created during" + echo " the spatial enable database step. These spatial types can be used just" + echo " like any other SQL data types." + echo + echo " In the following step, we are going to alter the customers and branches" + echo " tables and add a spatial column to store the location of customers and" + echo " branches." + echo + echo "------------------------------------------------------------------------" + echo + echo "Adding spatial columns to business tables. Please wait ..." + fi + + log db2 connect to $db_name + rc_connect=$? + + if [[ $rc_connect = 0 ]] ; then + # Successful connection + log db2 "ALTER TABLE sa_demo.customers ADD COLUMN location ST_Point" + rc_customers=$? + + log db2 "ALTER TABLE sa_demo.branches ADD COLUMN location ST_Point" + rc_branches=$? + + showlog_pause + else + echo "* Could not connect to " $db_name ":" + showlog + return 1 + fi + + if [[ $rc_customers = 0 ]] && [[ $rc_branches = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of add_spatial_column function + + + +#===================================================================== +# Name: check_srs +# Purpose: Checks if an appropriate spatial reference system exists +#===================================================================== +function check_srs { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + typeset rc_info=''; typeset rc_connect='' + + # Init log file + outfile=~/tmp/check_srs.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Check spatial reference system" + echo "========================================================================" + echo " A spatial reference system defines the spatial domain and precision" + echo " of the spatial data being stored in a column. The spatial domain " + echo " consists of the maximum possible spatial extent of your coordinate" + echo " values and the coordinate system associated with the spatial data." + echo + echo " The spatial extent is defined by X, Y, Z, and M offset values. The " + echo " coordinate system geo-references your data in space. It defines the" + echo ' origin, units and possibly a projection used (only for projected' + echo ' coordinate systems). For performance reasons, Db2 SA internally ' + echo " stores all spatial data as positive integer values. When you " + echo " define your spatial extent, you must consider your minimum and maximum " + echo ' X, Y (and Z, M) values, and provide offsets so that all your values' + echo " can be converted to positive numbers in the coordinate space. The " + echo " conversions are only for internal purposes and handled automatically " + echo " once they are set." + echo + echo " db2se shape_info command can help you determine the spatial extent" + echo " of a shapefile and possibly the coordinate system if a *.prj file" + echo " exists." + echo + echo " The spatial precision for your data is defined by the X, Y, Z, and M " + echo " scale factors. The spatial precision also factors into the spatial" + echo " extent. The spatial precision is reversely proportional to the" + echo " spatial extent. As the spatial precision goes up (you can " + echo " store more precise values) the size of your extent goes down (you" + echo " have a smaller extent). Conversely, as spatial precision does down" + echo " your extent goes up. Therefore, the spatial precision defines the" + echo " upper limit of your spatial extent, the max X, Y and Z (and M)." + echo + echo "For more information, please refer to the User's Guide chapter " + echo "\"Setting up spatial resources for a database\"." + echo + echo "The following are the commands associated with spatial systems:" + echo " db2se create_cs [-h]" + echo " db2se alter_cs [-h]" + echo " db2se drop_cs [-h]" + echo " db2se create_srs [-h]" + echo " db2se alter_srs [-h]" + echo " db2se drop_srs [-h]" + echo + echo "In this step we are going to use db2se shape_info to get information" + echo "about a shapefile and in particular determine if there is an " + echo "existing spatial reference system that can contain the spatial data." + echo "------------------------------------------------------------------------" + echo + echo "db2 connect to" $db_name ". Please wait ..." + fi + + log db2 connect to $db_name + rc_connect=$? + + if [[ $rc_connect = 0 ]] ; then + # Successful connection + + log db2se shape_info -fileName $SCRIPTDIR/../data/cityLimits -database $db_name -sa 1 + rc_info=$? + + showlog_pause + else + echo "* Could not connect to " $db_name ":" + showlog + return 1 + fi + + if [[ $rc_info = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of check_srs function + + +#===================================================================== +# Name: populate_location +# Purpose: Setup geocoding and auto_gc for customers and branches table +#===================================================================== +function populate_location { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset rc_register_gc1=0 ; typeset rc_auto_gc1=0 + typeset rc_register_gc2=0 ; typeset rc_auto_gc2=0 + typeset rc_cp_ref=0 ; typeset rc_cp_loc=0 + + # Init log file + outfile=~/tmp/populate_location.out + rm -f $outfile 2>/dev/null + + echo "========================================================================" + echo "|> Set location column from latitude and longitude values" + echo "========================================================================" + + log db2 "update sa_demo.customers set location = st_point(longitude, latitude, 1)" + rc_auto_gc1=$? + + log db2 "update sa_demo.branches set location = st_point(longitude, latitude, 1)" + rc_auto_gc2=$? + + showlog_pause + + if [[ $rc_auto_gc1 = 0 ]] && [[ $rc_auto_gc2 = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of populate_location function + + +#===================================================================== +# Name: geo_queries +# Purpose: Basic spatial queries with customer and branch +# data +#===================================================================== +function geo_queries { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset rc_connect=''; typeset rc_function_path='' + typeset rc_query1=''; typeset rc_query2=''; typeset rc_query3=''; + + # Init log file + outfile=~/tmp/geo_queries.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Basic spatial queries with customer and branch data" + echo "========================================================================" + echo " In this step you will have a chance to perform a few basic spatial " + echo " queries." + echo + echo " All the spatial routines are built-in into SYSIBM or SYSPROC function path. " + echo "------------------------------------------------------------------------" + echo + echo "db2 connect to" $db_name " Please wait ..." + fi + + log db2 connect to $db_name + rc_connect=$? + + if [[ $mode = i ]] || [[ $mode = b ]]; then + typeset q3="db2 SELECT c.name AS cust_name, b.name AS branch_name, DECIMAL(st_distance(b.location, c.location, 'KILOMETER'), 6, 2) AS distance FROM sa_demo.branches b, sa_demo.customers c WHERE st_distance(b.location, c.location, 'KILOMETER') < 1 ORDER BY distance" + + PS3='Basic Query? ' + select choice in \ + 'describe branches table', \ + 'view branches location coordinates', \ + 'find branch customers within 1 kilometer of my branches' \ + 'continue demo' + do + case $REPLY in + 1 ) db2 DESCRIBE TABLE sa_demo.branches ;; + 2 ) db2 'SELECT name, VARCHAR(ST_AsText(location), 50) FROM sa_demo.branches' ;; + 3 ) $q3 ;; + 4 ) break ;; + * ) echo "Please select a number 1-4 or ENTER to see the menu" ;; + esac + done + + press_any_key_to_continue + fi + + return 0 +} #//end of geo_queries function + + +#===================================================================== +# Name: import_shapefiles +# Purpose: Template to use for the rest of the functions +#===================================================================== +function import_shapefiles { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset rc_city=''; typeset rc_main=''; typeset rc_zip='' + typeset rc_census=''; typeset rc_sales='' + + # Init temporary log file + outfile=~/tmp/import_shapefiles.tmp + + # Init log file + outfile1=~/tmp/import_shapefiles.out + rm -f $outfile1 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Import Reference and Demographic Census Shapefiles" + echo "========================================================================" + echo " Many data providers and GIS products can produce shapefiles. Db2" + echo " provides a set of spatial data CD's with sample spatial data in " + echo " shapefile format." + echo + echo " In this step we will import a set of shapefiles. The shapefiles " + echo " contain census demographic data and spatial background data. The " + echo " spatial background data helps reference your data when viewing it on" + echo " a map." + echo + echo " When you import shapefile data you need to provide a spatial reference" + echo " system that the spatial data is going to belong to. For this example" + echo " we are going to use spatial reference system NAD83_SRS_1. " + echo + echo " When you spatial data via db2se you can also specify whether you want" + echo " Spatial Extender to look for the file on the client or server " + echo " filesystem via the createTableFlag option." + echo + echo " When you import shapefiles you can optionally create two other files" + echo " an exception and message file. The message file contains a status " + echo " of the import process and provides information about how many shapes" + echo " were imported. It also says whether a block of shapes failed. If it" + echo " fails it writes the block of shapes out the exception file. Note, " + echo " the block is defined by the commit scope and if within that block there" + echo " is one invalid shape the entire block is rejected. If this happens" + echo " import the exception file with a small commit scope to identify the " + echo " shape that is failing." + echo "------------------------------------------------------------------------" + echo " Please wait - this operation might take several minutes to complete." + echo + fi + + file1=~/tmp/parcels + do_import cityLimits city_limits $file1 1 200 $db_name + rc_city=$? + + file2=~/tmp/main_streets + do_import sjMainStreets sj_main_streets $file2 1 200 $db_name + rc_main=$? + + file3=~/tmp/zip_codes + do_import sjZipCodes sj_zipcodes $file3 1 200 $db_name + rc_zip=$? + + file4=~/tmp/census + do_import sjCensusBlocks sj_census_blocks $file4 1 200 $db_name + rc_census=$? + + file5=~/tmp/sales + do_import salezones sales_regions $file5 0 200 $db_name + rc_sales=$? + + if [[ $mode = i ]] || [[ $mode = b ]]; then + press_any_key_to_continue + fi + + outfile=$outfile1 + + if [[ $rc_city = 0 ]] && [[ $rc_main = 0 ]] && [[ $rc_zip = 0 ]] && \ + [[ $rc_census = 0 ]] && [[ $rc_sales = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of import_shapefiles function + + +#===================================================================== +# Name: do_import (called by imp_shape) +# Purpose: Imports a shapefile and prints/logs the results. +# Input: $1 => shapefile name +# $2 => table name +# $3 => exception (.shp) and message (.msg) files name +# $4 => if 1 then an id_column with name SA_ROW_ID is created +# otherwise, no id_column +# $5 => commitScope +# $6 => db_name +# Global vars: +# $outfile => temporary log file +# $outfile1 => permanent log file +# $db_name => database name +# Returns: return code of import command +#===================================================================== +function do_import { + typeset id_col=''; typeset rc=''; typeset line='' + typeset db_name=$6 + + if [[ $4 = 1 ]]; then + id_col="-idColumn sa_row_id -idColumnIsIdentity 1" + fi + SHAPEDIR=$(cd $SCRIPTDIR; cd ..; cd data; echo $PWD) + + # Prepare the command line + line="db2se import_shape $db_name -sa 1 -client 1" + line="$line -fileName $SHAPEDIR/$1" + line="$line -srsName NAD83_SRS_1 -tableSchema sa_demo" + line="$line -tableName $2" + line="$line -spatialcolumn geometry -createTableFlag 1 -commitScope $5" + line="$line $id_col" + line="$line -exceptionFile $3.shp" + line="$line -messagesFile $3.msg" + + # Run import, then show and log results + rm -f $outfile $3.shp $3.msg 2>/dev/null + log2 $line + rc=$? + + showlog + + echo $line >>$outfile1 + echo " " >>$outfile1 + cat $outfile >>$outfile1 2>/dev/null + echo " " >>$outfile1 + + return $rc +} #//end of do_import function + + +#===================================================================== +# Name: create_views +# Purpose: Template to use for the rest of the functions +#===================================================================== +function create_views { + # Input Parameters + # $1 => mode + # $2 => db_name + # typeset declares local function variables + typeset mode=$1 + typeset db_name=$2 + + typeset rc_connect=1; typeset rc=1 + + # Init log file + outfile=~/tmp/create_views.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Create Views" + echo "========================================================================" + echo " This step is going to create a series of views that could be used " + echo " by a geobrowser to visualize the spatial analysis performed by the " + echo " query." + echo + echo " The views are defined in the file saBankDemoViewDDL.db2" + echo + echo " For more information about creating views refer to the Db2 SQL " + echo " reference book." + echo "------------------------------------------------------------------------" + echo + echo " Creating the views. Please wait ..." + fi + + log db2 connect to $db_name + rc_connect=$? + + if [[ $rc_connect = 0 ]] ; then + # Successful connection + log db2 -tvf $SCRIPTDIR/../bank/saBankDemoViewDDL.db2 + rc=$? + + if [[ $rc = 0 ]] ; then + showlog_pause + else + echo "* Db2 Spatial View Creation not successful:" + showlog + + # not successful + return 1 + fi + else + echo "* Could not connect to " $db_name ":" + showlog + + # not successful + return 1 + fi + + if [[ $rc = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of create_views function + + +#===================================================================== +# Name: register_spatial_columns +# Purpose: Register the spatial columns created in tables and view +# by this demo. +#===================================================================== +function register_spatial_columns { +# Input Parameters +# $1 => mode +# $2 => db_name + + typeset mode=$1 + typeset db_name=$2 + + typeset rc_register1=''; typeset rc_register2=''; typeset rc_register3=''; + typeset rc_register4=''; typeset rc_register5=''; typeset rc_register6=''; + typeset rc_register7=''; + + # Init log file + outfile=~/tmp/register_spatial_columns.out + rm -f $outfile 2>/dev/null + + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "========================================================================" + echo "|> Register Spatial Columns" + echo "========================================================================" + echo " Spatial Analytics allows you to create a constraint on a spatial" + echo " column that enforces the constraint that all spatial data in the " + echo " column must belong to the same spatial reference system." + echo + echo " Many spatial visualization tools require that all the spatial data" + echo " in one column being visualized belong to the same spatial reference " + echo " system." + echo + echo " For more information about registering spatial columns refer to " + echo " chapter \"Setting up spatial columns\" in the User's Guide." + echo "------------------------------------------------------------------------" + echo + echo " Registering spatial columns. Please wait ..." + fi + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName BRANCHES -columnName LOCATION -srsName NAD83_SRS_1 -sa 1 + rc_register1=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName CUSTOMERS -columnName LOCATION -srsName NAD83_SRS_1 -sa 1 + rc_register2=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName CITY_LIMITS -columnName GEOMETRY -srsName NAD83_SRS_1 -sa 1 + rc_register3=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName SALES_REGIONS -columnName GEOMETRY -srsName NAD83_SRS_1 -sa 1 + rc_register4=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName SJ_CENSUS_BLOCKS -columnName GEOMETRY -srsName NAD83_SRS_1 -sa 1 + rc_register5=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName SJ_MAIN_STREETS -columnName GEOMETRY -srsName NAD83_SRS_1 -sa 1 + rc_register6=$? + + log db2se register_spatial_column $db_name -tableSchema SA_DEMO \ + -tableName SJ_ZIPCODES -columnName GEOMETRY -srsName NAD83_SRS_1 -sa 1 + rc_register7=$? + + showlog_pause + + if [[ $rc_register1 = 0 ]] && [[ $rc_register2 = 0 ]] && \ + [[ $rc_register3 = 0 ]] && [[ $rc_register4 = 0 ]] && \ + [[ $rc_register5 = 0 ]] && [[ $rc_register6 = 0 ]] && \ + [[ $rc_register7 = 0 ]] ; then + return 0 + else + return 1 + fi +} #//end of register_spatial_columns function + + +#===================================================================== +# Name: press_any_key_to_continue +# Purpose: Pause before starting next part of demo +#===================================================================== +function press_any_key_to_continue { + # typeset declares local function variables + typeset ans='' + echo ; echo "<> Press RETURN to continue..." + read ans +} #//end of press_any_key_to_continue function + + +#===================================================================== +# Name: log +# Purpose: Execute a command and append its output to the file +# indicated by $outfile +# Input: +# $* => the command +#===================================================================== +function log { + echo "$*" >>$outfile + $* >>$outfile 2>&1 + return $? +} + + +#===================================================================== +# Name: log2 +# Purpose: Echo a command to stdout immediately, then execute it and +# append its output to the file indicated by %log% +# Input: +# $* => the command +#===================================================================== +function log2 { + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo "$*" + fi + $* >>$outfile 2>&1 + return $? +} + + +#===================================================================== +# Name: showlog +# Purpose: If $mode is b or i, then sends the file specified by +# $outfile to the standard output -- no pause afterwards. +# Input: +# $mode (must be b or i for the log to go to stdout) +#===================================================================== +function showlog { + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo ; cat $outfile 2>/dev/null ; echo + fi +} + + +#===================================================================== +# Name: showlog_pause +# Purpose: If $mode is b or i, then sends the file specified by +# $outfile to the standard output, then pauses. +# Input: +# $mode (must be b or i for the log to go to stdout) +#===================================================================== +function showlog_pause { + if [[ $mode = i ]] || [[ $mode = b ]]; then + echo ; cat $outfile 2>/dev/null ; echo + press_any_key_to_continue + fi +} + + +#===================================================================== +# Name: loglog +# Purpose: Appends a timestamp and current file $1 to main log file $2 +# Input: +# $1 => current file +# $2 => main log file +#===================================================================== +function loglog { + if [[ -n $2 ]] ; then + echo "##############################################################" >>$2 + echo "`date` - $1" >>$2 + echo "##############################################################" >>$2 + cat $1 >>$2 2>/dev/null + echo " " >>$2 + fi +} + + +#===================================================================== +# Name: usage +# Purpose: Echoes on stdout a command help message. +#===================================================================== +function usage { + echo "Usage: saBankDemoRunBankDemo -i | -n | -c | -b | -h [-a] []" + echo " -i = interactive mode (the default mode)" + echo " -n = non-interactive mode: runs all the sample steps without" + echo " prompting the user" + echo " -c = installation confirmation test" + echo " -b = basic mode: creates database, tables, and inserts non-spatial data" + echo " -h = help: prints this usage message" + echo " -a = configure instance as warehouse (analytics)" + echo " The default database name is sa_bank." + echo +} + + +#===================================================================== +# Name: scripterr +# Purpose: Called whenever an error occurs +#===================================================================== +function scripterr { + # may do some cleanup here ... + if [[ $mode = c ]] ; then + echo "Db2 SA failed the confirmation test" + fi + exit 1 +} + +#===================================================================== +# Name: returncodes +# Purpose: Called when we are done with everything +#===================================================================== +function returncodes { + echo "Function return codes:" + echo "create_db : $rc_create_db" + echo "update_cfg : $rc_update_cfg" + echo "setup_db : $rc_setup_db" + echo "enable_db : $rc_enable_db" + echo "create_tables : $rc_create_tables" + echo "insert_data : $rc_insert_data" + echo "add_spatial_column : $rc_add_spatial_column" + echo "chk_srs : $rc_check_srs" + echo "populate_location : $rc_populate_location" + echo "geo_queries : $rc_geo_queries" + echo "import_shapefiles : $rc_import_shapefiles" + echo "create_views : $rc_create_views" + echo "register_spatial_columns: $rc_register_spatial_columns" + echo "Please check logfiles in ~/tmp/ for details." +} + +#--------------------------------------------------------------------- +# Main script +#--------------------------------------------------------------------- +# Check environment +# Check environment +if [[ -z $DB2PATH ]] ; then + # Must have DB2PATH set + echo "Please set the DB2PATH environment variable to point to the" + echo "sqllib directory of your Db2 installation." + echo "Example: export DB2PATH=~/sqllib" + exit 1 +fi + + +export SCRIPTDIR=$(cd $(dirname $0);echo $PWD) +echo "Instance found in $DB2PATH" +echo "Working from $SCRIPTDIR" + +# Handle options and arguments +mode=0 +let number_of_options=0 +analytics=0 + +while getopts ":incbha" opt; do + # counter keeps track how many options are specified + ((number_of_options= number_of_options + 1)) + + # set the correction more for the various options + case $opt in + i) mode=i ;; + n) mode=n ;; + c) mode=c ;; + b) mode=b ;; + a) analytics=1 ;; + \?) usage + exit 1 ;; + *) usage + exit 1 ;; + esac +done +shift $(($OPTIND - 1)) + +if ((number_of_options == 0)); then + #Default mode is (i)nteractive + mode=i +fi + +# Make sure that 1 or less arguments are specified +if (($# > 1)); then + usage + echo "You can only specify one argument after the options, and you specified" + echo " " $# "arguments: " $@ + exit 1 +fi + +# Set the first argument as the database name +database_name=$1 + +# If database_name is null then set it to default of se_bank +database_name=${database_name:=sa_bank} + + +#--------------------------------------------------------------------- +# Start demo +#--------------------------------------------------------------------- +rc_create_db=0; rc_update_cfg=0; rc_setup_db=0; rc_enable_db=0; +rc_create_tables=0; rc_insert_data=0; rc_add_spatial_column=0; +rc_check_srs=0; rc_setup_geocoder=0; rc_run_geocoder=0; +rc_geo_queries=0; rc_import_shapefiles=0; +rc_create_views=0; rc_register_spatial_columns=0; rc_db2set=0 + + +# create the directory to write the output to +mkdir -m 755 ~/tmp 2>/dev/null + +# Init and timestamp the log file +logg=~/tmp/${database_name}.log +rm -f $logg >/dev/null 2>&1 +echo "`date` - seBankDemoRunBankDemo starting..." >>$logg +outfile=~/tmp/create_db.out + +# If warehouse instance was specified set registry. +if [[ $analytics -eq 1 ]] ; then + echo "Setting up warehouse environment ..." + log db2set DB2_WORKLOAD=ANALYTICS + rc_db2set=$? + [[ $mode != c ]] && ([[ $rc_db2set -eq 0 ]] || scripterr) +fi + +# start the database instance +db2start + +# Create and configure the database, create tables and insert +# non-spatial data +create_db $mode $database_name ; rc_create_db=$? +loglog $outfile $logg +[[ $mode != c ]] && ([[ $rc_create_db -eq 0 ]] || scripterr) + +# we no longer need to update the configuration +# update_cfg $mode $database_name ; rc_update_cfg=$? +loglog $outfile $logg +[[ $mode != c ]] && ([[ $rc_update_cfg -eq 0 ]] || scripterr) + + +if [[ $analytics -eq 0 ]] ; then + setup_db $mode $database_name ; rc_setup_db=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_setup_db -eq 0 ]] || scripterr) +fi + +enable_db $mode $database_name ; rc_enable_db=$? +loglog $outfile $logg +[[ $mode != c ]] && ([[ $rc_enable_db -eq 0 ]] || scripterr) + +create_tables $mode $database_name ; rc_create_tables=$? +loglog $outfile $logg +[[ $mode != c ]] && ([[ $rc_create_tables -eq 0 ]] || scripterr) + +insert_data $mode $database_name ; rc_insert_data=$? +loglog $outfile $logg +[[ $mode != c ]] && ([[ $rc_insert_data -eq 0 ]] || scripterr) + +if [[ $mode = i ]] || [[ $mode = n ]] || [[ $mode = c ]]; then + add_spatial_column $mode $database_name ; rc_add_spatial_column=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_add_spatial_column -eq 0 ]] || scripterr) + + check_srs $mode $database_name ; rc_check_srs=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_check_srs -eq 0 ]] || scripterr) + + populate_location $mode $database_name ; rc_populate_location=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_populate_location -eq 0 ]] || scripterr) + + if [[ $mode = i ]] ; then + # Run queries only in interactive mode + geo_queries $mode $database_name ; rc_geo_queries=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_geo_queries -eq 0 ]] || scripterr) + fi + + typeset file1=''; typeset file2=''; typeset file3='' + typeset file4=''; typeset file5='' + import_shapefiles $mode $database_name ; rc_import_shapefiles=$? + loglog $outfile $logg + # copy msg and exp files to the main log + [[ -f ${file1}.msg ]] && loglog ${file1}.msg $logg + [[ -f ${file2}.msg ]] && loglog ${file2}.msg $logg + [[ -f ${file3}.msg ]] && loglog ${file3}.msg $logg + [[ -f ${file4}.msg ]] && loglog ${file4}.msg $logg + [[ -f ${file5}.msg ]] && loglog ${file5}.msg $logg + [[ $mode != c ]] && ([[ $rc_import_shapefiles -eq 0 ]] || scripterr) + + create_views $mode $database_name ; rc_create_views=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_create_views -eq 0 ]] || scripterr) + + register_spatial_columns $mode $database_name ; rc_register_spatial_columns=$? + loglog $outfile $logg + [[ $mode != c ]] && ([[ $rc_register_spatial_columns -eq 0 ]] || scripterr) +fi + +if [[ $rc_create_db -eq 0 ]] && [[ $rc_update_cfg -eq 0 ]] && \ + [[ $rc_setup_db -eq 0 ]] && [[ $rc_enable_db -eq 0 ]] && \ + [[ $rc_create_tables -eq 0 ]] && [[ $rc_insert_data -eq 0 ]] && \ + [[ $rc_add_spatial_column -eq 0 ]] && [[ $rc_check_srs -eq 0 ]] && \ + [[ $rc_populate_location -eq 0 ]] && \ + [[ $rc_geo_queries -eq 0 ]] && [[ $rc_import_shapefiles -eq 0 ]] && \ + [[ $rc_create_views -eq 0 ]] && \ + [[ $rc_register_spatial_columns -eq 0 ]] ; then + + if [[ $mode = c ]] ; then + echo "Db2 Spatial Analytics ran the confirmation test successfully." + returncodes + else + echo "DB2 Spatial Analytics test has finished successfully." + returncodes + fi + +else + + if [[ $mode = c ]] ; then + echo "Db2 Spatial Analytics failed the confirmation test." + returncodes + else + echo "Db2 Spatial Analytics terminated with errors." + returncodes + fi + exit 1 +fi +exit 0 + +#********************************************************************** +# End of Db2 Spatial Extender sample 'saBankDemoRunBankDemo' +#********************************************************************** diff --git a/spatial/bank/saBankDemoSpatialSQL.db2 b/spatial/bank/saBankDemoSpatialSQL.db2 new file mode 100644 index 0000000..5d1c53f --- /dev/null +++ b/spatial/bank/saBankDemoSpatialSQL.db2 @@ -0,0 +1,1424 @@ +---------------------------------------------------------------------------- +-- Licensed Materials - Property of IBM +-- Governed under the terms of the IBM Public License +-- +-- (C) COPYRIGHT International Business Machines Corp. 2000 - 2014 +-- All Rights Reserved. +-- +-- US Government Users Restricted Rights - Use, duplication or +-- disclosure restricted by GSA ADP Schedule Contract with IBM Corp. +---------------------------------------------------------------------------- +-- +-- Component Name: Db2 Spatial Analytics v11.5 +-- +-- Source File Name: saBankDemoSpatialSQL.db2 +-- +-- Version: 11.5.6+ +-- +-- Description: examples spatial routines +-- unless specified geometries use the default SRSID of 4326 (WGS-84). +-- +-- For more information about the Db2 Spatial Analytics Bank Demo scripts, +-- see the saBankDemoREADME.txt file. +-- +-- For more information about Db2 Spatial Analytics component, refer to the +-- documentation at +-- https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics. +-- +-- For the latest information on Db2 refer to the Db2 website at +-- https://www.ibm.com/analytics/db2. +---------------------------------------------------------------------------- +--connect to sa_bank; + +--=============================================================== +-- ST_Area(geometry) +--=============================================================== +--!db2se drop_srs sa_bank -srsName new_york1983 -sa 1; + +--!db2se create_srs sa_bank -srsId 4000 -srsName new_york1983 -xOffset 0 -yOffset 0 -xScale 1 -yScale 1 -coordsysName NAD_1983_StatePlane_New_York_East_FIPS_3101_Feet -sa 1; + +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons (id, geometry) +--VALUES +-- (1, ST_Polygon('polygon((0 0, 0 10, 10 10, 10 0, 0 0))', 4000) ), +-- (2, ST_Polygon('polygon((20 0, 30 20, 40 0, 20 0 ))', 4000) ), +-- (3, ST_Polygon('polygon((20 30, 25 35, 30 30, 20 30))', 4000)); + +--SELECT id, ST_Area(geometry) AS area +--FROM sample_polygons; + +----The following does the same as the above only with method notation +--SELECT id, ST_AREA(geometry) AS area +--FROM sample_polygons; + +--SELECT id, +-- ST_Area(geometry) square_feet, +-- ST_Area(geometry, 'METER') square_meters, +-- ST_Area(geometry, 'STATUTE MILE') square_miles +--FROM sample_polygons; + +--=============================================================== +-- ST_AsBinary(geometry) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT, wkb BLOB(32k)); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1100, ST_Point(10, 20, 1)); + +--INSERT INTO sample_points(id, wkb) +--VALUES (2222, +-- (SELECT ST_AsBinary(geometry) +-- FROM sample_points +-- WHERE id = 1100)); + +--SELECT id, cast(ST_AsText(ST_Point(wkb)) AS varchar(35)) AS point +--FROM sample_points +--WHERE id = 2222; + +--SELECT id, substr(ST_AsBinary(geometry), 1, 21) AS point_wkb +--FROM sample_points +--WHERE id = 1100; + +--=============================================================== +-- ST_AsGML(geometry) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT, gml CLOB(32K)); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1100, ST_Point(10, 20, 1)); + +--INSERT INTO sample_points(id, gml) +--VALUES (2222, +-- (SELECT ST_AsGML(geometry) +-- FROM sample_points +-- WHERE id = 1100)); + +--SELECT id, cast(ST_AsGML(geometry) AS varchar(110)) AS gml_fragment +--FROM sample_points +--WHERE id = 1100; + +--=============================================================== +-- ST_AsShape(geometry) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT, shape BLOB(32K)); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1100, ST_Point(10, 20, 1)); + +--INSERT INTO sample_points(id, shape) +--VALUES (2222, +-- (SELECT ST_AsShape(geometry) +-- FROM sample_points +-- WHERE id = 1100)); + +--SELECT id, substr(ST_AsShape(geometry), 1, 20) AS shape +--FROM sample_points +--WHERE id = 1100; + +--=============================================================== +-- ST_AsText(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, spatial_type varchar(18), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, spatial_type, geometry) +--VALUES +-- (1, 'st_point', ST_Point(50, 50) ), +-- (2, 'st_linestring', ST_LineString('linestring(200 100, 210 130, 220 140)') ), +-- (3, 'st_polygon', ST_Polygon('polygon((110 120, 110 140, 130 140, 130 120, 110 120))') ); + +--SELECT id, spatial_type, cast(ST_AsText(geometry) AS varchar(150)) AS wkt +--FROM sample_geometries; + +--=============================================================== +-- ST_AsGeoJSON(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, spatial_type varchar(18), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, spatial_type, geometry) +--VALUES +-- (1, 'st_point', ST_Point(50, 50) ), +-- (2, 'st_linestring', ST_LineString('linestring(200 100, 210 130, 220 140)') ), +-- (3, 'st_polygon', ST_Polygon('polygon((110 120, 110 140, 130 140, 130 120, 110 120))') ); + +--SELECT id, spatial_type, cast(ST_AsGeoJSON(geometry) AS varchar(150)) AS wkt +--FROM sample_geometries; + +--=============================================================== +-- ST_Buffer(geometry, radius) +-- ST_Buffer(geometry, radius, unit) +--=============================================================== +--!db2se drop_srs sa_bank -srsName new_york1983 -sa 1; + +--!db2se create_srs sa_bank -srsId 4000 -srsName new_york1983 -xOffset 0 -yOffset 0 -xScale 1 -yScale 1 -coordsysName NAD_1983_StatePlane_New_York_East_FIPS_3101_Feet -sa 1; + +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id INTEGER, spatial_type varchar(18), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, spatial_type, geometry) +--VALUES +-- (1, 'st_point', ST_Point(50, 50, 4000) ), +-- (2, 'st_linestring', ST_LineString('linestring(200 100, 210 130, 220 140)', 4000) ), +-- (3, 'st_polygon', ST_Polygon('polygon((110 120, 110 140, 130 140, 130 120, 110 120))', 4000) ), +-- (4, 'st_multipolygon', ST_MultiPolygon('multipolygon(( +-- (30 30, 30 40, 35 40, 35 30, 30 30), +-- (35 30, 35 40, 45 40, 45 30, 35 30)))', 4000)); + +--SELECT id, spatial_type, +-- cast(ST_AsText(ST_Buffer(geometry, 10)) AS varchar(470)) AS buffer_10 +--FROM sample_geometries; + +-- Defect -- SQL0440N No authorized routine named "ST_NUMPOLYGONS" of type "FUNCTION" having compatible arguments was found. SQLSTATE=42884 +--SELECT id, spatial_type, +-- cast(ST_AsText(ST_Buffer(geometry, 10)) AS varchar(470)) AS buffer, +-- ST_NumPolygons(ST_Buffer(geometry, 10)) +--FROM sample_geometries +--WHERE id = 4; + +--SELECT id, spatial_type, +-- cast(ST_AsText(ST_Buffer(geometry, -5)) AS varchar(150)) AS buffer_negative_5 +--FROM sample_geometries +--WHERE id = 3; + +--SELECT id, spatial_type, +-- cast(ST_AsText(ST_Buffer(geometry, 10, 'METER')) AS varchar(680)) AS buffer_10_meter +--FROM sample_geometries +--WHERE id = 3; + + +--=============================================================== +-- ST_Contains(geometry, geometry) +--=============================================================== +--DROP TABLE sample_points; +--DROP TABLE sample_lines; +--DROP TABLE sample_polygons; + +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); +--CREATE TABLE sample_lines(id SMALLINT, geometry ST_LINESTRING); +--CREATE TABLE sample_polygons(id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_points (id, geometry) +--VALUES +-- (1, ST_Point(10, 20)), +-- (2, ST_Point('point(41 41)')); + +--INSERT INTO sample_lines (id, geometry) +--VALUES +-- (10, ST_LineString('linestring (1 10, 3 12, 10 10)') ), +-- (20, ST_LineString('linestring (50 10, 50 12, 45 10)') ); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (100, ST_Polygon('polygon((0 0, 0 40, 40 40, 40 0, 0 0))') ); + +--SELECT poly.id AS polygon_id, +-- CASE ST_Contains(poly.geometry, pts.geometry) +-- WHEN 0 THEN 'does not contain' +-- WHEN 1 THEN 'does contain' +-- END AS contains, +-- pts.id AS point_id +--FROM sample_points pts, sample_polygons poly; + +--SELECT poly.id AS polygon_id, +-- CASE ST_Contains(poly.geometry, line.geometry) +-- WHEN 0 THEN 'does not contain' +-- WHEN 1 THEN 'does contain' +-- END AS contains, +-- line.id AS line_id +--FROM sample_lines line, sample_polygons poly; + +--=============================================================== +-- ST_ConvexHull(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, spatial_type varchar(18), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, spatial_type, geometry) +--VALUES +-- (1, 'ST_LineString', ST_LineString('linestring(20 20, 30 30, 20 40, 30 50)') ), +-- (2, 'ST_Polygon', ST_Polygon('polygon((110 120, 110 140, 120 130, 110 120))', 0) ), +-- (3, 'ST_Polygon', ST_Polygon('polygon((30 30, 25 35, 15 50, 35 80, 40 85, 80 90, 70 75, 65 70, 55 50, 75 40, 60 30, 30 30))') ), +-- (4, 'ST_MultiPoint', ST_MultiPoint('multipoint(20 20, 30 30, 20 40, 30 50)') ); + +--SELECT id, spatial_type, cast(ST_AsText(ST_ConvexHull(geometry)) AS varchar(300)) AS convexhull +--FROM sample_geometries; + +--=============================================================== +-- ST_Distance(geometry, geometry) +--=============================================================== +--DROP TABLE sample_geometries1; +--DROP TABLE sample_geometries2; +--CREATE TABLE sample_geometries1 (id SMALLINT, spatial_type varchar(13), geometry ST_GEOMETRY); +--CREATE TABLE sample_geometries2 (id SMALLINT, spatial_type varchar(13), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries1(id, spatial_type, geometry) +--VALUES +-- ( 1, 'ST_Point', ST_Point('point(100 100)', 1) ), +-- (10, 'ST_LineString', ST_LineString('linestring(125 125, 125 175)', 1) ), +-- (20, 'ST_Polygon', ST_Polygon('polygon((50 50, 50 150, 150 150, 150 50, 50 50))', 1) ); + +--INSERT INTO sample_geometries2(id, spatial_type, geometry) +--VALUES +-- (101, 'ST_Point', ST_Point('point(200 200)', 1) ), +-- (102, 'ST_Point', ST_Point('point(200 300)', 1) ), +-- (103, 'ST_Point', ST_Point('point(200 0)', 1) ), +-- (110, 'ST_LineString', ST_LineString('linestring(200 100, 200 200)', 1) ), +-- (120, 'ST_Polygon', ST_Polygon('polygon((200 0, 200 200, 300 200, 300 0, 200 0))', 1) ); + +--SELECT sg1.id AS sg1_id, sg1.spatial_type AS sg1_type, +-- sg2.id AS sg1_id, sg2.spatial_type AS sg2_type, +-- cast(ST_Distance(sg1.geometry, sg2.geometry) AS Decimal(8, 4)) AS distance +--FROM sample_geometries1 sg1, sample_geometries2 sg2 +--ORDER BY sg1.id; + +--SELECT sg1.id AS sg1_id, sg1.spatial_type AS sg1_type, +-- sg2.id AS sg1_id, sg2.spatial_type AS sg2_type, +-- cast(ST_Distance(sg1.geometry, sg2.geometry) AS Decimal(8, 4)) AS distance +--FROM sample_geometries1 sg1, sample_geometries2 sg2 +--WHERE ST_Distance(sg1.geometry, sg2.geometry) <= 100; + +--SELECT sg1.id AS sg1_id, sg1.spatial_type AS sg1_type, +-- sg2.id AS sg1_id, sg2.spatial_type AS sg2_type, +-- cast(ST_Distance(sg1.geometry, sg2.geometry, 'KILOMETER') AS DECIMAL(10, 4)) AS distance +--FROM sample_geometries1 sg1, sample_geometries2 sg2 +--ORDER BY sg1.id; + +--=============================================================== +-- St_FindMeasure(geometry, measure) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_LineString('linestring m (2 2 3, 3 5 3, 3 3 6, 4 4 8)', 1)), +-- (2, ST_MultiPoint('multipoint m (2 2 3, 3 5 3, 3 3 6, 4 4 6, 5 5 6, 6 6 8)', 1)); + +--SELECT id, cast(ST_AsText(ST_FindMeasure(geometry, 7)) AS varchar(45)) AS measure_7 +--FROM sample_geometries; + +--SELECT id, cast(ST_AsText(ST_FindMeasure(geometry, 6)) AS varchar(120)) AS measure_6 +--FROM sample_geometries; + + +--=============================================================== +-- ST_GeomCollection(LOB) +--=============================================================== +--DROP TABLE sample_geomcollections; +--CREATE TABLE sample_geomcollections (id SMALLINT, geometry ST_GEOMCOLLECTION); + +--INSERT INTO sample_geomcollections(id, geometry) +--VALUES +-- (4001, ST_GeomCollection('multipoint(1 2, 4 3, 5 6)', 1) ), +-- (4002, ST_GeomCollection('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ), +-- (4003, ST_GeomCollection('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)), +-- (4004, ST_GeomCollection('10203040', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(350)) AS geomcollection +--FROM sample_geomcollections; + +--=============================================================== +-- ST_GeomCollFromTxt(WKT) +--=============================================================== +--DROP TABLE sample_geomcollections; +--CREATE TABLE sample_geomcollections (id SMALLINT, geometry ST_GEOMCOLLECTION); + +--INSERT INTO sample_geomcollections(id, geometry) +--VALUES +-- (4011, ST_GeomCollFromTxt('multipoint(1 2, 4 3, 5 6)', 1) ), +-- (4012, ST_GeomCollFromTxt('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ), +-- (4013, ST_GeomCollFromTxt('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(340)) AS GeomCollection +--FROM sample_geomcollections; + +--=============================================================== +-- ST_GeomCollFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_geomcollections; +--CREATE TABLE sample_geomcollections (id SMALLINT, geometry ST_GEOMCOLLECTION, wkb BLOB(32k)); + +--INSERT INTO sample_geomcollections(id, geometry) +--VALUES +-- (4021, ST_GeomCollFromTxt('multipoint(1 2, 4 3, 5 6)', 1) ), +-- (4022, ST_GeomCollFromTxt('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12))', 1)); + +--UPDATE sample_geomcollections AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_GeomCollFromWKB(wkb)) AS varchar(190)) AS GeomCollection +--FROM sample_geomcollections; + +--=============================================================== +-- ST_Geometry(LOB) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (7001, ST_Geometry('point(1 2)', 1) ), +-- (7002, ST_Geometry('linestring(33 2, 34 3, 35 6)', 1) ), +-- (7003, ST_Geometry('polygon((3 3, 4 6, 5 3, 3 3))', 1)), +-- (7004, ST_Geometry('5060', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(120)) AS Geometry +--FROM sample_geometries; + +--=============================================================== +-- ST_GeometryN(ST_GeomCollection) +--=============================================================== +--DROP TABLE sample_geomcollections; +--CREATE TABLE sample_geomcollections (id SMALLINT, geometry ST_GEOMCOLLECTION); + +--INSERT INTO sample_geomcollections(id, geometry) +--VALUES +-- (4001, ST_GeomCollection('multipoint(1 2, 4 3)', 1) ), +-- (4002, ST_GeomCollection('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ), +-- (4003, ST_GeomCollection('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, cast(ST_AsText(ST_GeometryN(geometry, 2)) AS varchar(110)) AS second_geometry +--FROM sample_geomcollections; + +--=============================================================== +-- ST_GeometryType(ST_Geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (7101, ST_Geometry('point(1 2)', 1) ), +-- (7102, ST_Geometry('linestring(33 2, 34 3, 35 6)', 1) ), +-- (7103, ST_Geometry('polygon((3 3, 4 6, 5 3, 3 3))', 1)), +-- (7104, ST_Geometry('multipoint(1 2, 4 3)', 1) ); + +--SELECT id, ST_GeometryType(geometry) AS geometry_type +--FROM sample_geometries; + +--=============================================================== +-- ST_GeomFromTxt(WKT) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1251, ST_GeomFromText('point(1 2)', 1) ), +-- (1252, ST_GeomFromText('linestring(33 2, 34 3, 35 6)', 1) ), +-- (1253, ST_GeomFromText('polygon((3 3, 4 6, 5 3, 3 3))', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(105)) AS Geometry +--FROM sample_geometries; + +--=============================================================== +-- ST_GeomFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries (id SMALLINT, geometry ST_GEOMETRY, wkb BLOB(32K)); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1901, ST_GeomFromText('point(1 2)', 1) ), +-- (1902, ST_GeomFromText('linestring(33 2, 34 3, 35 6)', 1) ), +-- (1903, ST_GeomFromText('polygon((3 3, 4 6, 5 3, 3 3))', 1)); + +--UPDATE sample_geometries AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_GeomFromWKB(wkb)) AS varchar(190)) AS Geometry +--FROM sample_geometries; + +--=============================================================== +-- ST_Intersects(geometry, geometry) +--=============================================================== +--DROP TABLE sample_geometries1; +--DROP TABLE sample_geometries2; +--CREATE TABLE sample_geometries1 (id SMALLINT, spatial_type varchar(13), geometry ST_GEOMETRY); +--CREATE TABLE sample_geometries2 (id SMALLINT, spatial_type varchar(13), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries1(id, spatial_type, geometry) +--VALUES +-- ( 1, 'ST_Point', ST_Point('point(550 150)', 1) ), +-- (10, 'ST_LineString', ST_LineString('linestring(800 800, 900 800)', 1) ), +-- (20, 'ST_Polygon', ST_Polygon('polygon((500 100, 500 200, 700 200, 700 100, 500 100))', 1) ); + +--INSERT INTO sample_geometries2(id, spatial_type, geometry) +--VALUES +-- (101, 'ST_Point', ST_Point('point(550 150)', 1) ), +-- (102, 'ST_Point', ST_Point('point(650 200)', 1) ), +-- (103, 'ST_Point', ST_Point('point(800 800)', 1) ), +-- (110, 'ST_LineString', ST_LineString('linestring(850 250, 850 850)', 1) ), +-- (120, 'ST_Polygon', ST_Polygon('polygon((650 50, 650 150, 800 150, 800 50, 650 50))', 1) ), +-- (121, 'ST_Polygon', ST_Polygon('polygon((20 20, 20 40, 40 40, 40 20, 20 20))', 1) ); + +--SELECT sg1.id AS sg1_id, sg1.spatial_type AS sg1_type, +-- sg2.id AS sg1_id, sg2.spatial_type AS sg2_type, +-- CASE ST_Intersects(sg1.geometry, sg2.geometry) +-- WHEN 0 THEN 'Geometries do not intersect' +-- WHEN 1 THEN 'Geometries intersect' +-- END AS intersects +--FROM sample_geometries1 sg1, sample_geometries2 sg2 +--ORDER BY sg1.id; + + +--=============================================================== +-- ST_Length(geometry) +--=============================================================== +DROP TABLE sample_geometries; +CREATE TABLE sample_geometries(id SMALLINT, spatial_type varchar(20), geometry ST_GEOMETRY); + +INSERT INTO sample_geometries(id, spatial_type, geometry) +VALUES + (1110, 'ST_LineString', ST_LineString('linestring(50 10, 50 20)', 1) ), + (1111, 'ST_MultiLineString', ST_MultiLineString('multilinestring( + (33 2, 34 3, 35 6), + (28 4, 29 5, 31 8, 43 12), + (39 3, 37 4, 36 7))', 1) ); + +SELECT id, spatial_type, cast(ST_Length(ST_ToLineString(geometry)) AS DECIMAL(7, 2)) AS line_length +FROM sample_geometries +WHERE id = 1110; + +----Currently this is failing with a GSE3016 defect +SELECT id, spatial_type, ST_Length(ST_ToMultiLine(geometry)) AS multiline_length +FROM sample_geometries +WHERE id = 1111; + + +--=============================================================== +-- ST_LineFromText(WKT) +--=============================================================== +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines(id SMALLINT, geometry ST_LineString); + +--INSERT INTO sample_lines(id, geometry) +--VALUES +-- (1110, ST_LineFromText('linestring(850 250, 850 850)', 1) ), +-- (1111, ST_LineFromText('linestring empty', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(75)) AS LineString +--FROM sample_lines; + +--=============================================================== +-- ST_LineFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines(id SMALLINT, geometry ST_LineString, wkb BLOB(32k)); + +--INSERT INTO sample_lines(id, geometry) +--VALUES +-- (1901, ST_LineString('linestring(850 250, 850 850)', 1) ), +-- (1902, ST_LineString('linestring(33 2, 34 3, 35 6)', 1) ); + +--UPDATE sample_lines AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_LineFromWKB(wkb)) AS varchar(90)) AS Line +--FROM sample_lines; + +--=============================================================== +-- ST_LineString(LOB) +--=============================================================== +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines(id SMALLINT, geometry ST_LineString); + +--INSERT INTO sample_lines(id, geometry) +--VALUES +-- (1110, ST_LineString('linestring(850 250, 850 850)', 1) ), +-- (1111, ST_LineString('9090100100', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(75)) AS linestring +--FROM sample_lines; + +--=============================================================== +-- ST_LineStringN(ST_MultiLineString) +--=============================================================== +--DROP TABLE sample_mlines; +--CREATE TABLE sample_mlines (id SMALLINT, geometry ST_MULTILINESTRING); + +--INSERT INTO sample_mlines(id, geometry) +--VALUES +-- (1110, ST_MultiLineString('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ), +-- (1111, ST_MLineFromText('multilinestring( +-- (61 2, 64 3, 65 6), +-- (58 4, 59 5, 61 8), +-- (69 3, 67 4, 66 7, 68 9))', 1) ); + +--SELECT id, cast(ST_AsText(ST_LineStringN(geometry, 2)) AS varchar(110)) AS second_linestring +--FROM sample_mlines; + +--=============================================================== +-- ST_M(st_point) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1, ST_Point(2, 3, 32, 5, 1)), +-- (2, ST_Point(4, 5, 20, 4, 1)), +-- (3, ST_Point(3, 8, 23, 7, 1)); + +--SELECT id, ST_M(geometry) AS measure +--FROM sample_points; + +--SELECT id, cast(ST_AsText(ST_M(geometry, 40)) AS varchar(60)) AS measure_40 +--FROM sample_points +--WHERE id = 3; + +--=============================================================== +-- ST_MaxM(st_geometry) +-- ST_MaxX(st_geometry) +-- ST_MaxY(st_geometry) +-- ST_MaxZ(st_geometry) +-- ST_MinM(st_geometry) +-- ST_MinX(st_geometry) +-- ST_MinY(st_geometry) +-- ST_MinZ(st_geometry) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons(id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1, ST_Polygon('polygon zm((110 120 20 3, 110 140 22 3, 120 130 26 4, 110 120 20 3))') ), +-- (2, ST_Polygon('polygon zm((0 0 40 7, 0 4 35 9, 5 4 32 12, 5 0 31 5, 0 0 40 7))') ), +-- (3, ST_Polygon('polygon zm((12 13 10 16 , 8 4 10 12, 9 4 12 11, 12 13 10 16))') ); + +----------------------------------------------------------------- +-- ST_MaxM(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MaxM(geometry) AS SMALLINT) AS max_measure_per_polygon +--FROM sample_polygons; + +--< TO DO >-- +--How do you include the id without the SQL failing +--SELECT cast(MAX(ST_MaxM(geometry)) AS SMALLINT) AS max_measure +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MaxX(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MaxX(geometry) AS SMALLINT) AS max_x_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MAX(ST_MaxX(geometry)) AS SMALLINT) AS max_x_coordinate +--FROM sample_polygons; + +--Super Min/Max Example +--SELECT cast(MIN(ST_MinX(geometry)) AS SMALLINT) AS MinX, +-- cast(MIN(ST_MinY(geometry)) AS SMALLINT) AS MinY, +-- cast(MIN(ST_MinZ(geometry)) AS SMALLINT) AS MinZ, +-- cast(MIN(ST_MinM(geometry)) AS SMALLINT) AS MinM, +-- cast(MAX(ST_MaxX(geometry)) AS SMALLINT) AS MaxX, +-- cast(MAX(ST_MaxY(geometry)) AS SMALLINT) AS MaxY, +-- cast(MAX(ST_MaxZ(geometry)) AS SMALLINT) AS MaxZ, +-- cast(MAX(ST_MaxM(geometry)) AS SMALLINT) AS MaxM +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MaxY(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MaxY(geometry) AS SMALLINT) AS max_y_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MAX(ST_MaxY(geometry)) AS SMALLINT) AS max_y_coordinate +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MaxZ(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST(MaxZ(geometry) AS SMALLINT) AS max_z_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MAX(ST_MaxZ(geometry)) AS SMALLINT) AS max_z_coordinate +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MinM(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MinM(geometry) AS SMALLINT) AS min_m_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MIN(ST_MinM(geometry)) AS SMALLINT) AS min_m_coordinate +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MinX(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MinX(geometry) AS SMALLINT) AS min_x_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MIN(ST_MinX(geometry)) AS SMALLINT) AS min_x_coordinate +--FROM sample_polygons; + +----------------------------------------------------------------- +-- ST_MinY(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MinY(geometry) AS SMALLINT) AS min_y_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MIN(ST_MinY(geometry)) AS SMALLINT) AS min_y_coordinate +--FROM sample_polygons; + + +----------------------------------------------------------------- +-- ST_MinZ(st_geometry) +----------------------------------------------------------------- +--SELECT id, cast(ST_MinZ(geometry) AS SMALLINT) AS min_z_coordinate_per_polygon +--FROM sample_polygons; + +--SELECT cast(MIN(ST_MinZ(geometry)) AS SMALLINT) AS min_z_coordinate +--FROM sample_polygons; + + +--=============================================================== +-- St_MBR(geometry) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons (id, geometry) +--VALUES +-- (1, ST_Polygon('polygon((5 5, 7 7, 5 9, 7 9, 9 11, 13 9, 15 9, 13 7, 15 5, 9 6, 5 5))') ), +-- (2, ST_Polygon('polygon((20 30, 25 35, 30 30, 20 30))', 0)); + +--SELECT id, cast(ST_AsText(ST_MBR(geometry)) AS varchar(150)) AS MBR +--FROM sample_polygons; + +--=============================================================== +-- St_MBRIntersect(geometry) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons (id, geometry) +--VALUES +-- (1, ST_Polygon('polygon((0 0, 30 0, 40 30, 40 35, 5 35, 5 10, 20 10, 20 5, 0 0))') ), +-- (2, ST_Polygon('polygon((15 15, 15 20, 60 20, 60 15, 15 15))') ), +-- (3, ST_Polygon('polygon((115 15, 115 20, 160 20, 160 15, 115 15))') ); + +--SELECT sp1.id, sp2.id, +-- CASE ST_MBRIntersects(sp1.geometry, sp2.geometry) +-- WHEN 0 THEN 'MBRs do not intersect' +-- WHEN 1 THEN 'MBRs intersect' +-- END AS mbr_intersects +--FROM sample_polygons sp1, sample_polygons sp2 +--WHERE sp1.id <= sp2.id; + +--=============================================================== +-- St_MeasureBetween(geometry, startMeasure, endMeasure) +--=============================================================== +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines (id SMALLINT, geometry ST_LINESTRING); + +--INSERT INTO sample_lines(id, geometry) +--VALUES +-- (1, ST_LineString('linestring m (2 2 3, 3 5 3, 3 3 6, 4 4 6, 5 5 6, 6 6 8)', 1)); + +--SELECT id, cast(ST_AsText(ST_MeasureBetween(geometry, 4, 6)) AS varchar(150)) AS measure_between_4_and_6 +--FROM sample_lines; + +--=============================================================== +-- St_MidPoint(st_linestring) +--=============================================================== +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines (id SMALLINT, geometry ST_LINESTRING); + +--INSERT INTO sample_lines(id, geometry) +--VALUES +-- (1, ST_LineString('linestring (0 0, 0 10, 0 20, 0 30, 0 40)', 1)), +-- (2, ST_LineString('linestring (2 2, 3 5, 3 3, 4 4, 5 5, 6 6)', 1)), +-- (3, ST_LineString('linestring (0 10, 0 0, 10 0, 10 10)', 1)), +-- (4, ST_LineString('linestring (0 20, 5 20, 10 20, 15 20)', 1)); + +--SELECT id, cast(ST_AsText(ST_MidPoint(geometry)) AS varchar(60)) AS mid_point +--FROM sample_lines; + +--=============================================================== +-- St_MLineFromText(WKT) +--=============================================================== +--DROP TABLE sample_mlines; +--CREATE TABLE sample_mlines (id SMALLINT, geometry ST_MULTILINESTRING); + +--INSERT INTO sample_mlines(id, geometry) +--VALUES +-- (1110, ST_MLineFromText('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(280)) AS multilinestring +--FROM sample_mlines +--WHERE id = 1110; + +--=============================================================== +-- ST_MLineFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_mlines; +--CREATE TABLE sample_mlines (id SMALLINT, geometry ST_MULTILINESTRING, wkb BLOB(32K)); + +--INSERT INTO sample_mlines(id, geometry) +--VALUES +-- (10, ST_MLineFromText('multilinestring( +-- (61 2, 64 3, 65 6), +-- (58 4, 59 5, 61 8), +-- (69 3, 67 4, 66 7, 68 9))', 1) ); + +--UPDATE sample_mlines AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_MLineFromWKB(wkb)) AS varchar(280)) AS MultiLineString +--FROM sample_mlines +--WHERE id = 10; + +--=============================================================== +-- ST_MPointFromText(WKT) +--=============================================================== +--DROP TABLE sample_mpoints; +--CREATE TABLE sample_mpoints (id SMALLINT, geometry ST_MULTIPOINT); + +--INSERT INTO sample_mpoints(id, geometry) +--VALUES +-- (1110, ST_MPointFromText('multipoint(1 2, 4 3, 5 6)', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(280)) AS MultiPoint +--FROM sample_mpoints +--WHERE id = 1110; + + +--=============================================================== +-- ST_MPointFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_mpoints; +--CREATE TABLE sample_mpoints (id SMALLINT, geometry ST_MULTIPOINT, wkb BLOB(32K)); + +--INSERT INTO sample_mpoints(id, geometry) +--VALUES +-- (10, ST_MPointFromText('multipoint(44 14, 35 16, 24 13)', 1)); + +--UPDATE sample_mpoints AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_MPointFromWKB(wkb)) AS varchar(100)) AS MultiPoint +--FROM sample_mpoints +--WHERE id = 10; + +--=============================================================== +-- ST_MPolyFromText(WKT) +--=============================================================== +--DROP TABLE sample_mpolygons; +--CREATE TABLE sample_mpolygons (id SMALLINT, geometry ST_MULTIPOLYGON); + +--INSERT INTO sample_mpolygons(id, geometry) +--VALUES +-- (1110, ST_MPolyFromText('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(350)) AS MultiPolygon +--FROM sample_mpolygons +--WHERE id = 1110; + +--=============================================================== +-- ST_MPolyFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_mpolygons; +--CREATE TABLE sample_mpolygons (id SMALLINT, geometry ST_MULTIPOLYGON, wkb BLOB(32K)); + +--INSERT INTO sample_mpolygons(id, geometry) +--VALUES +-- (10, ST_MPolyFromText('multipolygon(((1 72, 4 79, 5 76, 1 72), +-- (10 20, 10 40, 30 41, 10 20), +-- (9 43, 7 44, 6 47, 9 43)))', 1)); + +--UPDATE sample_mpolygons AS temp_correlated +--SET wkb = St_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_MPolyFromWKB(wkb)) AS varchar(320)) AS MultiPolygon +--FROM sample_mpolygons +--WHERE id = 10; + +--=============================================================== +-- St_MultiLineString(LOB) +--=============================================================== +--DROP TABLE sample_mlines; +--CREATE TABLE sample_mlines (id SMALLINT, geometry ST_MULTILINESTRING); + +--INSERT INTO sample_mlines(id, geometry) +--VALUES +-- (1110, ST_MultiLineString('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(280)) AS MultiLineString +--FROM sample_mlines +--WHERE id = 1110; + +--=============================================================== +-- ST_MultiPoint(LOB) +--=============================================================== +--DROP TABLE sample_mpoints; +--CREATE TABLE sample_mpoints (id SMALLINT, geometry ST_MULTIPOINT); + +--INSERT INTO sample_mpoints(id, geometry) +--VALUES +-- (1110, ST_MultiPoint('multipoint(1 2, 4 3, 5 6)', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(90)) AS MultiPoint +--FROM sample_mpoints +--WHERE id = 1110; + +--=============================================================== +-- ST_MultiPolygon(LOB) +--=============================================================== +--DROP TABLE sample_mpolygons; +--CREATE TABLE sample_mpolygons (id SMALLINT, geometry ST_MULTIPOLYGON); + +--INSERT INTO sample_mpolygons(id, geometry) +--VALUES +-- (1110, ST_MultiPolygon('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(350)) AS MultiPolygon +--FROM sample_mpolygons +--WHERE id = 1110; + +--=============================================================== +-- ST_NumGeometries(collection) +--=============================================================== +--DROP TABLE sample_geometrycol; +--CREATE TABLE sample_geometrycol(id SMALLINT, geometry ST_GEOMCOLLECTION); + +--INSERT INTO sample_geometrycol(id, geometry) +--VALUES +-- (1, ST_MultiPolygon('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)), +-- (2, ST_MultiPoint('multipoint(1 2, 4 3, 5 6, 7 6, 8 8)', 1) ); + +--SELECT id, ST_NumGeometries(geometry) AS number_of_geometries +--FROM sample_geometrycol; + +--=============================================================== +-- ST_NumLineStrings(ST_MultiLineStrings) +--=============================================================== +--DROP TABLE sample_mlines; +--CREATE TABLE sample_mlines (id SMALLINT, geometry ST_MULTILINESTRING); + +--INSERT INTO sample_mlines(id, geometry) +--VALUES +-- (1110, ST_MultiLineString('multilinestring( +-- (33 2, 34 3, 35 6), +-- (28 4, 29 5, 31 8, 43 12), +-- (39 3, 37 4, 36 7))', 1) ), +-- (1111, ST_MultiLineString('multilinestring( +-- (3 2, 4 3, 5 6), +-- (8 4, 9 5, 3 8, 4 12))', 1)); + +--SELECT id, ST_NumLineStrings(geometry) AS number_of_linestrings +--FROM sample_mlines; + +--=============================================================== +-- ST_NumPoints(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(spatial_type varchar(18), geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(spatial_type, geometry) +--VALUES +-- ('st_point', ST_Point(2, 3, 0) ), +-- ('st_linestring', ST_LineString('linestring(2 5, 21 3, 23 10)') ), +-- ('st_polygon', ST_Polygon('polygon((110 120, 110 140, 120 130, 110 120))') ); + +--SELECT spatial_type, ST_NumPoints(geometry) AS number_of_points +--FROM sample_geometries; + +--=============================================================== +-- ST_NumPolygons(multipolygon) +--=============================================================== +--DROP TABLE sample_mpolygons; +--CREATE TABLE sample_mpolygons (id SMALLINT, geometry ST_MULTIPOLYGON); + +--INSERT INTO sample_mpolygons(id, geometry) +--VALUES +-- (1, ST_MultiPolygon('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)), +-- (2, ST_MultiPolygon('multipolygon empty', 1)), +-- (3, ST_MultiPolygon('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, ST_NumPolygons(geometry) AS number_of_polygons +--FROM sample_mpolygons; + +--=============================================================== +-- ST_Overlaps(geometry, geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Point(10, 20, 1)), +-- (2, ST_Point('point(41 41)', 1)), +-- (10, ST_LineString('linestring (1 10, 3 12, 10 10)', 1) ), +-- (20, ST_LineString('linestring (50 10, 50 12, 45 10)', 1) ), +-- (30, ST_LineString('linestring (50 12, 50 10, 60 8)', 1) ), +-- (100, ST_Polygon('polygon((0 0, 0 40, 40 40, 40 0, 0 0))', 1) ), +-- (110, ST_Polygon('polygon((30 10, 30 30, 50 30, 50 10, 30 10))', 1) ), +-- (120, ST_Polygon('polygon((0 50, 0 60, 40 60, 40 60, 0 50))', 1) ); + + +----Tests weather Points Overlaps----Tests weather Points Overlaps +--SELECT sg1.id, sg2.id, +-- CASE ST_Overlaps(sg1.geometry, sg2.geometry) +-- WHEN 0 THEN 'Points_do_not_Overlap' +-- WHEN 1 THEN 'Points_Overlap' +-- END AS Overlap +--FROM sample_geometries sg1, sample_geometries sg2 +--WHERE sg1.id < 10 AND sg2.id < 10 AND sg1.id >= sg2.id; + +----Tests weather Lines Overlaps +--SELECT sg1.id, sg2.id, +-- CASE ST_Overlaps(sg1.geometry, sg2.geometry) +-- WHEN 0 THEN 'Lines_do_not_Overlap' +-- WHEN 1 THEN 'Lines_Overlap' +-- END AS Overlap +--FROM sample_geometries sg1, sample_geometries sg2 +--WHERE sg1.id >= 10 AND sg1.id < 100 AND sg2.id >= 10 AND sg2.id < 100 +-- AND sg1.id >= sg2.id; + +----Tests weather Polygons Overlaps +--SELECT sg1.id, sg2.id, +-- CASE ST_Overlaps(sg1.geometry, sg2.geometry) +-- WHEN 0 THEN 'Polygons_do_not_Overlap' +-- WHEN 1 THEN 'Polygons_Overlap' +-- END AS Overlap +--FROM sample_geometries sg1, sample_geometries sg2 +--WHERE sg1.id >= 100 AND sg2.id >=100 +-- AND sg1.id >= sg2.id; + +--=============================================================== +-- ST_Perimeter(surface) +--=============================================================== +--!db2se drop_srs sa_bank -srsName new_york1983 -sa 1; + +--!db2se create_srs sa_bank -srsId 4000 -srsName new_york1983 -xOffset 0 -yOffset 0 -xScale 1 -yScale 1 -coordsysName NAD_1983_StatePlane_New_York_East_FIPS_3101_Feet -sa 1; + +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons(id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1, ST_Polygon('polygon((0 0, 0 4, 5 4, 5 0, 0 0))', 4000)); + +--SELECT id, ST_Perimeter(geometry) AS perimeter +--FROM sample_polygons; + +--SELECT id, ST_Perimeter(geometry, 'METER') AS perimeter_meter +--FROM sample_polygons; + +--=============================================================== +-- ST_PerpPoint(curve, point) +--=============================================================== +--This is not updated with Bill's fixes +--DROP TABLE sample_lines; +--CREATE TABLE sample_lines(id SMALLINT, line ST_LINESTRING); + +--INSERT INTO sample_lines(id, line) +--VALUES +-- (1, ST_LineString('linestring z (0 10 1, 0 0 3, 10 0 5, 10 10 7)') ); + +-- Perpendicular point is coincident with the input point, on the base of the U: +--SELECT ST_PerpPoint(line, ST_Point(5, 0, 0)) AS Perp_Point +--FROM sample_lines; + + +--=============================================================== +-- ST_Point(LOB) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1100, ST_Point(10, 20, 1)), +-- (1101, ST_Point('point(30 40)', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(35)) AS Points +--FROM SAMPLE_POINTS; + +--=============================================================== +-- ST_PointFromText(WKT) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1100, ST_PointFromText('point(30 40)', 1)); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(35)) AS points +--FROM sample_points; + +--=============================================================== +-- ST_PointFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT, wkb BLOB(32k)); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (10, ST_PointFromText('point(44 14)', 1)), +-- (11, ST_PointFromText('point(24 13)', 1)); + +--UPDATE sample_points AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(geometry) AS varchar(35)) AS points +--FROM SAMPLE_POINTS; + +--=============================================================== +-- ST_PolyFromText(WKT) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons(id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1110, ST_Polygon('polygon((50 20, 50 40, 70 30, 50 20))') ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(120)) AS polygons +--FROM sample_polygons; + +--=============================================================== +-- ST_PolyFromText(GeoJSON) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons(id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1110, ST_Polygon('{ "type": "polygon", "coordinates" : [[[50, 20], [50, 40], [70, 30], [50, 20]]] }') ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(120)) AS polygons +--FROM sample_polygons; + +--=============================================================== +-- ST_PolyFromWKB(WKB) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON, wkb BLOB(32K)); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1115, ST_Polygon('polygon((50 20, 50 40, 70 30, 50 20))') ); + +--UPDATE sample_polygons AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_PolyFromWKB(wkb)) AS varchar(120)) AS Polygon +--FROM sample_polygons +--WHERE id = 1115; + +--=============================================================== +-- ST_Polgyon(LOB) +--=============================================================== +--DROP TABLE sample_polygons; +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (1100, ST_Polygon(db2gse.ST_LineFromText('linestring(10 20, 10 40, 20 30, 10 20)', 1), 1)), +-- (1101, ST_Polygon('polygon((110 120, 110 140, 120 130, 110 120))', 1) ), +-- (1102, ST_Polygon('polygon((110 120, 110 140, 130 140, 130 120, 110 120),(115 125, 115 135, 125 135, 125 135, 115 125))', 1) ); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(280)) AS Polygon +--FROM sample_polygons; + +--=============================================================== +-- ST_PolgyonN(geometry) +--=============================================================== +--DROP TABLE sample_mpolygons; +--CREATE TABLE sample_mpolygons (id SMALLINT, geometry ST_MULTIPOLYGON); + +--INSERT INTO sample_mpolygons(id, geometry) +--VALUES +-- (1, ST_MPolyFromText('multipolygon(((3 3, 4 6, 5 3, 3 3), +-- (8 24, 9 25, 1 28, 8 24), +-- (13 33, 7 36, 1 40, 10 43, 13 33)))', 1)); + +--SELECT id, cast(ST_AsText(ST_PolygonN(geometry, 2)) AS varchar(120)) AS polygon_n +--FROM sample_mpolygons +--WHERE id = 1; + +--=============================================================== +-- ST_ToGeomColl(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Polygon('polygon((3 3, 4 6, 5 3, 3 3))', 1)), +-- (2, ST_Point('point(1 2)', 1) ); + +--SELECT id, cast(ST_AsText(ST_ToGeomColl(geometry)) AS varchar(120)) AS geometry_collections +--FROM sample_geometries; + +--=============================================================== +-- ST_ToPoint(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Geometry('point(30 40)', 1)), +-- (2, ST_Geometry('linestring empty', 1)), +-- (3, ST_Geometry('multipolygon empty', 1)); + +--SELECT cast(ST_AsText(geometry) AS varchar(35)) AS points +--FROM sample_geometries; + +--SELECT cast(ST_AsText(ST_ToPoint(geometry)) as varchar(35)) AS points +--FROM sample_geometries; + +--SELECT cast(ST_AsText(TREAT(geometry AS ST_Point)) as varchar(35)) AS points +--FROM sample_geometries; + +--=============================================================== +-- ST_ToLineString(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Geometry('linestring z (0 10 1, 0 0 3, 10 0 5)')), +-- (2, ST_Geometry('point empty', 1)), +-- (3, ST_Geometry('multipolygon empty', 1)); + + +--SELECT cast(ST_AsText(ST_ToLineString(geometry)) as varchar(130)) AS lines +--FROM sample_geometries; + +--=============================================================== +-- ST_ToPolygon(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Geometry('polygon((0 0, 0 4, 5 4, 5 0, 0 0))', 1)), +-- (2, ST_Geometry('point empty', 1)), +-- (3, ST_Geometry('multipolygon empty', 1)); + +--SELECT cast(ST_AsText(ST_ToPolygon(geometry)) as varchar(130)) AS polygons +--FROM sample_geometries; + +--=============================================================== +-- ST_ToMultiPoint(geometry) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (1, ST_Geometry('multipoint(0 0, 0 4)', 1)); +-- (2, ST_Geometry('point(30 40)', 1)), +-- (3, ST_Geometry('multipolygon empty', 1)); + +--SELECT cast(ST_AsText(ST_ToMultiPoint(geometry)) as varchar(100)) AS MultiPoint +--FROM sample_geometries; + +--=============================================================== +-- ST_Within(geometry) +--=============================================================== +--DROP TABLE sample_points; +--DROP TABLE sample_lines; +--DROP TABLE sample_polygons; + +--CREATE TABLE sample_points (id SMALLINT, geometry ST_POINT); +--CREATE TABLE sample_lines(id SMALLINT, line ST_LINESTRING); +--CREATE TABLE sample_polygons (id SMALLINT, geometry ST_POLYGON); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1, ST_Point(10, 20, 1)), +-- (2, ST_Point('point(41 41)', 1)); +---- (2, ST_Point('point(50 50)', 1)); --Points to test defect + +--INSERT INTO sample_lines(id, line) +--VALUES +-- (10, ST_LineString('linestring (1 10, 3 12, 10 10)', 1) ), +-- (20, ST_LineString('linestring (50 10, 50 12, 45 10)', 1) ); + +--INSERT INTO sample_polygons(id, geometry) +--VALUES +-- (100, ST_Polygon('polygon((0 0, 0 40, 40 40, 40 0, 0 0))', 1) ); + +--SELECT pts.id AS point_ids_within_polygon +--FROM sample_points pts, sample_polygons poly +--WHERE ST_Within(poly.geometry, pts.geometry) = 0; + +--SELECT lin.id AS line_ids_within_polygon +--FROM sample_lines lin, sample_polygons poly +--WHERE ST_Within(poly.geometry, lin.geometry) = 0; + +--=============================================================== +-- ST_WKBToSQL(wkb) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY, wkb BLOB(32k)); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (10, ST_Point('point(44 14)', 0)), +-- (11, ST_Point('point(24 13)', 0)), +-- (12, ST_Polygon('polygon((50 20, 50 40, 70 30, 50 20))') ); + +--UPDATE sample_geometries AS temp_correlated +--SET wkb = ST_AsBinary(geometry) +--WHERE id = temp_correlated.id; + +--SELECT id, cast(ST_AsText(ST_WKBToSQL(wkb)) AS varchar(120)) AS Geometries +--FROM sample_geometries; + +--=============================================================== +-- ST_WKTToSQL(wkt) +--=============================================================== +--DROP TABLE sample_geometries; +--CREATE TABLE sample_geometries(id SMALLINT, geometry ST_GEOMETRY); + +--INSERT INTO sample_geometries(id, geometry) +--VALUES +-- (10, ST_WKTToSQL('point(44 14)')), +-- (11, ST_WKTToSQL('point(24 13)')), +-- (12, ST_WKTToSQL('polygon((50 20, 50 40, 70 30, 50 20))')); + +--SELECT id, cast(ST_AsText(geometry) AS varchar(120)) AS Geometries +--FROM sample_geometries; + +--=============================================================== +-- ST_X(st_point) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1, ST_Point(2, 3, 32, 5, 1)), +-- (2, ST_Point(4, 5, 20, 4, 1)), +-- (3, ST_Point(3, 8, 23, 7, 1)); + +--SELECT id, ST_X(geometry) AS x_coordinate +--FROM sample_points; + +--SELECT id, cast(ST_AsText(ST_X(geometry, 40)) AS varchar(60)) AS x_40 +--FROM sample_points +--WHERE id = 3; + +--=============================================================== +-- ST_Y(st_point) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points (id, geometry) +--VALUES +-- (1, ST_Point(2, 3, 32, 5, 1)), +-- (2, ST_Point(4, 5, 20, 4, 1)), +-- (3, ST_Point(3, 8, 23, 7, 1)); + +--SELECT id, ST_Y(geometry) AS y_coordinate +--FROM sample_points; + +--SELECT id, cast(ST_AsText(ST_Y(geometry, 40)) AS varchar(60)) AS y_40 +--FROM sample_points +--WHERE id = 3; + +--=============================================================== +-- ST_Z(st_point) +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO SAMPLE_POINTS (id, geometry) +--VALUES +-- (1, ST_Point(2, 3, 32, 5, 1)), +-- (2, ST_Point(4, 5, 20, 4, 1)), +-- (3, ST_Point(3, 8, 23, 7, 1)); + +--SELECT id, ST_Z(geometry) AS z_coordinate +--FROM sample_points; + +--SELECT id, cast(ST_AsText(ST_Z(geometry, 40)) AS varchar(60)) AS z_40 +--FROM sample_points +--WHERE id = 3; + +--=============================================================== +-- ST_Grandmbr and ST_Union aggregate geometries +--=============================================================== +--DROP TABLE sample_points; +--CREATE TABLE sample_points(id SMALLINT, geometry ST_POINT); + +--INSERT INTO sample_points(id, geometry) +--VALUES +-- (1, ST_Point(2, 3, 1)), +-- (2, ST_Point(4, 5, 1)), +-- (3, ST_Point(13, 15, 1)), +-- (4, ST_Point(12, 5, 1)), +-- (5, ST_Point(23, 2, 1)), +-- (6, ST_Point(11, 4, 1)); + +--SELECT cast(ST_AsText(ST_Grandmbr(geometry)) AS varchar(160)) AS aggregate_of_points +--FROM sample_points; + +--SELECT cast(ST_AsText(ST_ConvexHull(ST_Union(geometry))) AS varchar(110)) AS aggregate_of_points +--FROM sample_points; + + + diff --git a/spatial/bank/saBankDemoTableData.db2 b/spatial/bank/saBankDemoTableData.db2 new file mode 100644 index 0000000..064b723 --- /dev/null +++ b/spatial/bank/saBankDemoTableData.db2 @@ -0,0 +1,1097 @@ +---------------------------------------------------------------------------- +-- Licensed Materials - Property of IBM +-- Governed under the terms of the IBM Public License +-- +-- (C) COPYRIGHT International Business Machines Corp. 2999 - 2021 +-- All Rights Reserved. +-- +-- US Government Users Restricted Rights - Use, duplication or +-- disclosure restricted by GSA ADP Schedule Contract with IBM Corp. +---------------------------------------------------------------------------- +-- +-- Component Name: DB2 Spatial Analytics v11.5 +-- +-- Source File Name: saBankDemoTableData.db2 +-- +-- Version: 11.5.6+ +-- +-- Description: +-- +-- +-- +-- For more information about the Db2 Spatial Analytics Bank Demo scripts, +-- see the saBankDemoREADME.txt file. +-- +-- For more information about Db2 Spatial Analytics component, refer to the +-- documentation at +-- https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics. +-- +-- For the latest information on Db2 refer to the Db2 website at +-- https://www.ibm.com/analytics/db2. +---------------------------------------------------------------------------- + +--========================================================================== +-- BRANCH DATA +--========================================================================== +INSERT INTO sa_demo.branches( + BRANCH_ID, SA_ROW_ID, NAME, MANAGER, STREET, CITY, STATE, ZIP,LATITUDE,LONGITUDE) VALUES + (1, 1, 'Meridian', 'Francisco Villa', '1670 Meridian Ave', 'San Jose', 'CA','95125',37.31164,-121.91451), + (2, 2, 'San Carlos ','Stacey Nguyen', '580 San Carlos St', 'San Jose', 'CA','95112',37.33729,-121.87508); +-- end of BRANCH DATA + +--========================================================================== +-- CUSTOMER DATA +--========================================================================== +INSERT INTO sa_demo.customers( + CUSTOMER_ID, SA_ROW_ID, NAME, STREET, CITY, STATE, ZIP,CUSTOMER_TYPE,LATITUDE,LONGITUDE) VALUES +( 124, 1,'James T.Kirk ',' 855 Garden Dr ',' San Jose ','CA','95126','NORMAL',37.33253, -121.93148), +( 125, 2,'Leonard McCoy ',' 815 Garden Dr ',' San Jose ','CA','95126','NORMAL',37.33187, -121.93069), +( 126, 3,'Hikaru Sulu ','1849 University Ave',' San Jose ','CA','95126','NORMAL',37.33126, -121.93243), +( 127, 4,'Michelle Nichols ','1649 University Way',' San Jose ','CA','95126','NORMAL',37.33333, -121.93044), +( 135, 5,'Montgomery Scott ','2024 University Ave',' San Jose ','CA','95128','NORMAL',37.33006, -121.93432), +( 136, 6,'Pavel Chekov ',' 725 Bascom Ave',' San Jose ','CA','95128','NORMAL',37.33013, -121.93367), +( 138, 8,'Deforest Kelly ',' 725 Garden Dr ',' San Jose ','CA','95126','NORMAL',37.33060, -121.92919), +( 139, 9,'Walter Koenig ','1779 Naglee Ave',' San Jose ','CA','95126','NORMAL',37.32925, -121.93012), +( 156, 10,'James Lenard ','2236 Central Park Dr ',' San Jose ','CA','95008','NORMAL',37.27586, -121.93877), +( 157, 11,'Leonard Nimoy ',' 805 Sweetbriar Dr ',' San Jose ','CA','95008','NORMAL',37.27553, -121.93867), +( 158, 12,'George Takei ',' 575 Cambrian Dr ',' San Jose ','CA','95008','NORMAL',37.27524, -121.93921), +( 159, 13,'Jean Luc Picard ',' 905 Sweetbriar Dr ',' San Jose ','CA','95008','NORMAL',37.27445, -121.93867), +( 160, 14,'Willian Riker ',' 515 Dallas Dr ',' San Jose ','CA','95008','NORMAL',37.27371, -121.94057), +( 176, 15,'Patrick Stewart ','1899 Cabana Dr ',' San Jose ','CA','95125','NORMAL',37.28738, -121.92073), +( 177, 16,'Jonathan Frakes ','2031 Hurst Ave',' San Jose ','CA','95125','NORMAL',37.28691, -121.91827), +( 178, 17,'Bervely Crusher ','2078 Hurst Ave',' San Jose ','CA','95125','NORMAL',37.28613, -121.91827), +( 179, 18,'Diana Troi ','1699 Cabana Dr ',' San Jose ','CA','95125','NORMAL',37.28770, -121.91677), +( 180, 19,'Whesley Crusher ','1974 Kocher Dr ',' San Jose ','CA','95125','NORMAL',37.28754, -121.91480), +( 262, 21,'James Cisko ','2435 Aragon Way',' San Jose ','CA','95125','NORMAL',37.27970, -121.90986), +( 263, 22,'Julian Bashir ','1690 Curtner Ave',' San Jose ','CA','95125','NORMAL',37.28147, -121.90946), +( 264, 23,'Jadzia Dax ','2349 La Mirada Dr ',' San Jose ','CA','95125','NORMAL',37.28128, -121.90878), +( 265, 24,'Katryn Janeway ','1749 Sweetbriar Dr ',' San Jose ','CA','95125','NORMAL',37.28202, -121.91039), +( 266, 25,'Bellana Torres ','2326 Briarwood Dr ',' San Jose ','CA','95125','NORMAL',37.28239, -121.90843), +( 267, 26,'Tom Parris ','1682 Curtner Ave',' San Jose ','CA','95125','NORMAL',37.28184, -121.90859), +( 368, 27,'Naomi Wilderman ','1933 Georgetta Dr ',' San Jose ','CA','95125','NORMAL',37.28537, -121.90861), +( 369, 28,'Zeffren Cockrane ','1874 Cherry Ave',' San Jose ','CA','95125','NORMAL',37.29144, -121.90176), +( 370, 29,'Jonh Sheridan ','1800 Nomark Ct ',' San Jose ','CA','95125','NORMAL',37.29228, -121.90326), +( 371, 30,'Michael Garibaldi','1974 Booksin Ave',' San Jose ','CA','95125','NORMAL',37.28708, -121.90645), +( 372, 31,'Ben Franklin ','1999 James Pl ',' San Jose ','CA','95125','NORMAL',37.28618, -121.90716), +( 373, 32,'Talia de Winters ','1832 Georgetta Dr ',' San Jose ','CA','95125','NORMAL',37.28630, -121.90652), +( 1007, 33,'Kosh Neranek ',' 399 Mayellen Ave',' San Jose ','CA','95126','NORMAL',37.32155, -121.92056), +( 1008, 34,'Zack Allan ',' 304 Buena Vista Ave',' San Jose ','CA','95126','NORMAL',37.32315, -121.91896), +( 1009, 35,'Lita Alexander ','1587 Scott St ',' San Jose ','CA','95126','NORMAL',37.31969, -121.92012), +( 1010, 36,'Susan Ivanova ',' 549 Mayellen Ave',' San Jose ','CA','95126','NORMAL',37.31893, -121.92056), +( 1011, 37,'Michael Bester ','1567 Scott St ',' San Jose ','CA','95126','NORMAL',37.31971, -121.91941), +( 1012, 38,'Fox Mulder ','1554 Scott St ',' San Jose ','CA','95126','NORMAL',37.31973, -121.91872), +( 1041, 39,'David Duchovny ',' 524 Julian St ',' San Jose ','CA','95110','NORMAL',37.33571, -121.90304), +( 1042, 40,'Danna Scully ',' 250 Autumn St ',' San Jose ','CA','95110','NORMAL',37.33560, -121.90212), +( 1043, 41,'David Skinner ',' 575 Santa Clara St ',' San Jose ','CA','95113','NORMAL',37.33196, -121.90182), +( 1044, 42,'Willian Boonne ',' 150 Autumn St ',' San Jose ','CA','95110','NORMAL',37.32836, -121.90033), +( 2127, 43,'Lilly Marquete ',' 849 Vine St ',' San Jose ','CA','95110','NORMAL',37.32102, -121.88525), +( 2128, 44,'James Sandoval ',' 224 West Virginia St ',' San Jose ','CA','95110','NORMAL',37.32189, -121.88520), +( 2129, 45,'Lian Kinkaid ',' 829 Almaden Ave',' San Jose ','CA','95110','NORMAL',37.32173, -121.88438), +( 2130, 46,'Samantha Carter ',' 149 West Virginia St ',' San Jose ','CA','95110','NORMAL',37.32258, -121.88397), +( 2131, 47,'Angela Cartwright',' 149 Sutter St ',' San Jose ','CA','95110','NORMAL',37.32194, -121.88341), +( 2132, 48,'June Lockhart ',' 274 Oak St ',' San Jose ','CA','95110','NORMAL',37.32008, -121.88525), +( 2154, 56,'Marcia Wallace ',' 500 Phelan Ave',' San Jose ','CA','95112','NORMAL',37.31710, -121.86046), +( 2155, 57,'Meggie Smith ','1718 Senter Rd ',' San Jose ','CA','95112','NORMAL',37.31816, -121.85821), +( 2156, 58,'Hank Azaria ',' 623 Nordale Ave',' San Jose ','CA','95112','NORMAL',37.31810, -121.85750), +( 2157, 59,'Paul Buchman ','1799 Welch Ave',' San Jose ','CA','95112','NORMAL',37.31771, -121.85643), +( 2158, 60,'Derek Whitestar ','1665 10th St ',' San Jose ','CA','95112','NORMAL',37.31624, -121.86285), +( 2159, 61,'Dorothy Lane ',' 375 Phelan Ave',' San Jose ','CA','95112','NORMAL',37.31526, -121.86319), +( 2160, 62,'Hemmet Brown ','1799 10th St ',' San Jose ','CA','95112','NORMAL',37.31422, -121.86088), +( 2161, 63,'Andrea Neal ','1803 Senter Rd ',' San Jose ','CA','95112','NORMAL',37.31710, -121.85720), +( 2162, 64,'James Oconor ',' 500 Needles Dr ',' San Jose ','CA','95112','NORMAL',37.31444, -121.85976), +( 2223, 49,'Billy Mummy ','1999 Senter Rd ',' San Jose ','CA','95112','NORMAL',37.31268, -121.85282), +( 2224, 50,'James Darren ',' 649 Palm St ',' San Jose ','CA','95110','NORMAL',37.32254, -121.88907), +( 2225, 51,'David Colbert ','1949 10th St ',' San Jose ','CA','95112','NORMAL',37.31275, -121.85934), +( 2226, 52,'Agnes Moghead ','1791 Monterey Hwy',' San Jose ','CA','95111','NORMAL',37.30961, -121.86740), +( 2227, 53,'Liz Montgomery ','1100 Algiers Ave',' San Jose ','CA','95122','NORMAL',37.32715, -121.84979), +( 2228, 54,'Dan Castanella ','1286 Clemence Ave',' San Jose ','CA','95122','NORMAL',37.32892, -121.85323), +( 2229, 55,'Nancy Cartwright ','1050 Walnut Woods Dr ',' San Jose ','CA','95122','NORMAL',37.32914, -121.85249), +( 3034, 65,'Idek Go ',' 350 7th St ',' San Jose ','CA','95112','NORMAL',37.33347, -121.88007), +( 3035, 66,'Kuai Chang Kaine ',' 225 Washington St ',' San Jose ','CA','95112','NORMAL',37.34497, -121.89078), +( 3036, 67,'Max Power ',' 350 6th St ',' San Jose ','CA','95112','NORMAL',37.34418, -121.88946), +( 3037, 68,'Homer Simpson ',' 375 Empire St ',' San Jose ','CA','95112','NORMAL',37.34856, -121.88916), +( 3038, 69,'Margie Simpson ',' 450 9th St ',' San Jose ','CA','95112','NORMAL',37.33337, -121.87709), +( 3039, 70,'Lisa Simpson ',' 425 Empire St ',' San Jose ','CA','95112','NORMAL',37.34904, -121.88811), +( 3084, 71,'Bart Simpson ',' 50 28th St ',' San Jose ','CA','95116','NORMAL',37.34791, -121.86358), +( 3085, 72,'Rafael Coss ','1337 Santa Clara St ',' San Jose ','CA','95116','NORMAL',37.34868, -121.86437), +( 3086, 73,'Bryan Patterson ',' 25 28th St ',' San Jose ','CA','95116','NORMAL',37.34835, -121.86390), +( 3087, 74,'Jean Ho ','1312 Santa Clara St ',' San Jose ','CA','95116','NORMAL',37.34856, -121.86464), +( 3088, 75,'Knut Stolze ','1329 Shortridge Ave',' San Jose ','CA','95116','NORMAL',37.34785, -121.86376), +( 4030, 76,'Claire Suttle ',' 949 Asbury St ',' San Jose ','CA','95126','NORMAL',37.33933, -121.91755), +( 4031, 77,'Andre Braga ',' 725 Elm St ',' San Jose ','CA','95126','NORMAL',37.33928, -121.91641), +( 4032, 78,'Tony Leung ','1074 Taylor St ',' San Jose ','CA','95126','NORMAL',37.33730, -121.91804), +( 4033, 79,'Cheung-Yuk ','1024 Taylor St ',' San Jose ','CA','95126','NORMAL',37.33779, -121.91734), +( 4034, 80,'Y. Morimoto ',' 650 Myrtle St ',' San Jose ','CA','95126','NORMAL',37.33755, -121.91671), +( 4035, 81,'Gery Mueckenbauer',' 849 Asbury St ',' San Jose ','CA','95126','NORMAL',37.34023, -121.91630), +( 4036, 82,'David Adler ',' 725 Laurel St ',' San Jose ','CA','95126','NORMAL',37.34017, -121.91515), +( 4037, 83,'Bob Shoberg ',' 849 Taylor St ',' San Jose ','CA','95126','NORMAL',37.33924, -121.91523), +( 4038, 84,'Laura Stewart ',' 949 Taylor St ',' San Jose ','CA','95126','NORMAL',37.33837, -121.91650), +( 4039, 85,'Soraia Alves ',' 650 Elm St ',' San Jose ','CA','95126','NORMAL',37.33842, -121.91548), +( 4097, 86,'Graziela Kunde ','1169 Vanessa Dr ',' San Jose ','CA','95126','NORMAL',37.30292, -121.91820), +( 4099, 88,'Nelson Mattos ','1824 Willow St ',' San Jose ','CA','95125','NORMAL',37.30075, -121.91869), +( 4100, 89,'Marilene Noronha ','1788 Isabel Dr ',' San Jose ','CA','95125','NORMAL',37.30080, -121.91825), +( 4101, 90,'Carla Nunes ','1416 Saint Francis Dr ',' San Jose ','CA','95125','NORMAL',37.30036, -121.91787), +( 4102, 91,'G.Sauaressig ','1699 Santa Barbara Dr ',' San Jose ','CA','95125','NORMAL',37.29984, -121.91567), +( 4430, 93,'Steven Elliott ','1258 Willowhaven Dr ',' San Jose ','CA','95126','NORMAL',37.30593, -121.91860), +( 4431, 94,'James Taylor ',' 942 St Elizabeth Dr ',' San Jose ','CA','95126','NORMAL',37.30721, -121.91648), +( 4432, 95,'Al Jarreau ','2323 Gunar Dr ',' San Jose ','CA','95124','NORMAL',37.27923, -121.92646), +( 4433, 96,'Diana Krall ',' 766 Malone Rd ',' San Jose ','CA','95125','NORMAL',37.29723, -121.88158), +( 4434, 97,'Gari Robinson ','2049 Delbarr Ct ',' San Jose ','CA','95125','NORMAL',37.29725, -121.88131), +( 4436, 99,'Angela Dima ',' 359 Shadow Run Dr ',' San Jose ','CA','95110','NORMAL',37.31034, -121.88066), +( 4437, 100,'Shannon Fargusson','1225 Willowhaven Dr ',' San Jose ','CA','95126','NORMAL',37.30593, -121.91802) +; +-- end of CUSTOMER DATA + +--========================================================================== +-- ACCOUNT DATA +--========================================================================== +INSERT INTO sa_demo.accounts( + ACCOUNT_ID, CUSTOMER_ID, BRANCH_ID, TYPE, BALANCE, ROUTING_NUMBER) VALUES +( 100, 124,1,'Checking', 2363.255132,1100), +( 101, 125,2,'Checking', 2885.789723,1101), +( 102, 126,1,'Checking', 863.7858514,1102), +( 103, 127,1,'Checking', 376.3056556,1103), +( 104, 135,1,'Checking', 1335.755385,1104), +( 105, 136,1,'Checking', 1522.425684,1105), +( 107, 138,1,'Checking', 1285.902569,1107), +( 108, 139,1,'Checking', 3260.161556,1108), +( 109, 156,1,'Checking', 2919.795841,1109), +( 110, 157,1,'Checking', 1073.549577,1110), +( 111, 158,1,'Checking', 1225.286351,1111), +( 112, 159,1,'Checking', 389.7738339,1112), +( 113, 160,1,'Checking', 182.9277962,1113), +( 114, 176,2,'Checking', 812.2161706,1114), +( 115, 177,1,'Checking', 2329.205387,1115), +( 116, 178,2,'Checking', 332.32188,1116), +( 117, 179,2,'Checking', 2718.337876,1117), +( 118, 180,1,'Checking', 1188.955105,1118), +( 120, 262,1,'Checking', 2427.166818,1120), +( 121, 263,1,'Checking', 1933.819423,1121), +( 122, 264,1,'Checking', 549.3841173,1122), +( 123, 265,1,'Checking', 2429.47217,1123), +( 124, 266,1,'Checking', 1940.300551,1124), +( 125, 267,1,'Checking', 1683.467949,1125), +( 126, 368,1,'Checking', 1206.174575,1126), +( 127, 369,1,'Checking', 768.6893814,1127), +( 128, 370,2,'Checking', 1129.363835,1128), +( 129, 371,1,'Checking', 1418.82726,1129), +( 130, 372,1,'Checking', 1674.021154,1130), +( 131, 373,1,'Checking', 2477.973427,1131), +( 132,1007,1,'Checking', 370.7056947,1132), +( 133,1008,1,'Checking', 116.1817531,1133), +( 134,1009,1,'Checking', 520.6105051,1134), +( 135,1010,1,'Checking', 195.6016937,1135), +( 136,1011,1,'Checking', 106.0564091,1136), +( 138,1041,1,'Checking', 539.2325158,1138), +( 139,1042,1,'Checking', 101.1402553,1139), +( 140,1043,1,'Checking', 950.7055043,1140), +( 141,1044,1,'Checking', 575.4253339,1141), +( 142,2127,1,'Checking', 345.6576006,1142), +( 143,2128,2,'Checking', 235.6670355,1143), +( 144,2129,2,'Checking', 345.3365138,1144), +( 145,2130,2,'Checking', 137.687037,1145), +( 146,2131,1,'Checking', 100.7461097,1146), +( 147,2132,1,'Checking', 686.8912253,1147), +( 148,2223,2,'Checking', 57.94033953,1148), +( 149,2224,2,'Checking', 209.6814143,1149), +( 150,2225,2,'Checking', 272.993464,1150), +( 151,2226,1,'Checking', 273.1754423,1151), +( 152,2227,2,'Checking', 155.3547925,1152), +( 153,2228,1,'Checking', 269.5428597,1153), +( 154,2229,1,'Checking', 151.1208164,1154), +( 155,2154,2,'Checking', 8.275955916,1155), +( 156,2155,2,'Checking', 227.8439034,1156), +( 157,2156,2,'Checking', 351.6053223,1157), +( 158,2157,2,'Checking', 175.8251799,1158), +( 159,2158,2,'Checking', 636.3168721,1159), +( 160,2159,2,'Checking', 808.5135018,1160), +( 161,2160,2,'Checking', 322.3511567,1161), +( 162,2161,1,'Checking', 113.6516125,1162), +( 163,2162,2,'Checking', 634.4714832,1163), +( 164,3034,2,'Checking', 803.0728587,1164), +( 165,3035,2,'Checking', 1374.49218,1165), +( 166,3036,2,'Checking', 737.7980341,1166), +( 167,3037,1,'Checking', 880.1150966,1167), +( 168,3038,2,'Checking', 1714.550973,1168), +( 169,3039,1,'Checking', 1296.540013,1169), +( 170,3084,2,'Checking', 935.6609093,1170), +( 171,3085,2,'Checking', 534.2058106,1171), +( 172,3086,2,'Checking', 416.365382,1172), +( 173,3087,2,'Checking', 1222.481322,1173), +( 174,3088,2,'Checking', 1234.423716,1174), +( 175,4030,1,'Checking', 342.3687716,1175), +( 176,4031,1,'Checking', 219.8221082,1176), +( 177,4032,1,'Checking', 821.8153705,1177), +( 178,4033,1,'Checking', 333.0223163,1178), +( 179,4034,1,'Checking', 78.67911241,1179), +( 180,4035,1,'Checking', 692.0828828,1180), +( 181,4036,1,'Checking', 1465.075807,1181), +( 182,4037,1,'Checking', 1823.983833,1182), +( 183,4038,1,'Checking', 733.0881632,1183), +( 184,4039,1,'Checking', 1100.820315,1184), +( 185,4097,1,'Checking', 38.94935605,1185), +( 186,4099,1,'Checking', 150.0550955,1186), +( 187,4100,1,'Checking', 159.8017401,1187), +( 188,4101,1,'Checking', 363.2827794,1188), +( 189,4102,1,'Checking', 1242.323194,1189), +( 191,4430,1,'Checking', 240.9412472,1191), +( 192,4431,1,'Checking', 393.6994475,1192), +( 193,4432,1,'Checking', 873.6447408,1193), +( 194,4433,1,'Checking', 849.881861,1194), +( 195,4434,1,'Checking', 920.8499389,1195), +( 197,4436,1,'Checking', 769.2452027,1197), +( 198,4437,1,'Checking', 203.4685531,1198), +( 199, 124,1,'Saving', 25947.23173,1199), +( 200, 125,2,'Saving', 204755.0108,1200), +( 201, 126,1,'Saving', 114390.855,1201), +( 202, 127,1,'Saving', 202659.7704,1202), +( 203, 135,1,'Saving', 105370.5459,1203), +( 204, 136,1,'Saving', 16331.64918,1204), +( 206, 138,1,'Saving', 77485.47104,1206), +( 207, 139,1,'Saving', 101003.4193,1207), +( 208, 156,1,'Saving', 30627.54354,1208), +( 209, 157,1,'Saving', 84310.68934,1209), +( 210, 158,1,'Saving', 95724.16915,1210), +( 211, 159,1,'Saving', 58738.6481,1211), +( 212, 160,1,'Saving', 33947.76889,1212), +( 213, 176,2,'Saving', 50009.22738,1213), +( 214, 177,1,'Saving', 53839.09653,1214), +( 215, 178,2,'Saving', 37252.65724,1215), +( 216, 179,2,'Saving', 38832.03591,1216), +( 217, 180,1,'Saving', 157923.6088,1217), +( 219, 262,1,'Saving', 161690.7533,1219), +( 220, 263,1,'Saving', 60963.05602,1220), +( 221, 264,1,'Saving', 129716.7982,1221), +( 222, 265,1,'Saving', 146258.3654,1222), +( 223, 266,1,'Saving', 189802.0553,1223), +( 224, 267,1,'Saving', 224976.7577,1224), +( 225, 368,1,'Saving', 39103.89544,1225), +( 226, 369,1,'Saving', 46182.78934,1226), +( 227, 370,2,'Saving', 45155.12824,1227), +( 228, 371,1,'Saving', 118843.0557,1228), +( 229, 372,1,'Saving', 146979.6841,1229), +( 230, 373,1,'Saving', 79742.70174,1230), +( 231,1007,1,'Saving', 18766.24436,1231), +( 232,1008,1,'Saving', 56978.37152,1232), +( 233,1009,1,'Saving', 39892.98345,1233), +( 234,1010,1,'Saving', 14340.12927,1234), +( 235,1011,1,'Saving', 24524.27683,1235), +( 236,1012,2,'Saving', 30944.41188,1236), +( 237,1041,1,'Saving', 39186.16525,1237), +( 238,1042,1,'Saving', 17185.41623,1238), +( 239,1043,1,'Saving', 59682.25556,1239), +( 240,1044,1,'Saving', 7648.203145,1240), +( 241,2127,1,'Saving', 13560.58125,1241), +( 242,2128,2,'Saving', 14369.43733,1242), +( 243,2129,2,'Saving', 36340.46654,1243), +( 244,2130,2,'Saving', 14979.87798,1244), +( 245,2131,1,'Saving', 14515.74201,1245), +( 246,2132,1,'Saving', 305.3633823,1246), +( 247,2223,2,'Saving', 12417.23338,1247), +( 248,2224,2,'Saving', 39457.64595,1248), +( 249,2225,2,'Saving', 23017.44714,1249), +( 250,2226,1,'Saving', 7742.484165,1250), +( 251,2227,2,'Saving', 17624.66363,1251), +( 252,2228,1,'Saving', 1535.394306,1252), +( 253,2229,1,'Saving', 1226.676885,1253), +( 254,2154,2,'Saving', 22547.57602,1254), +( 255,2155,2,'Saving', 12486.17339,1255), +( 256,2156,2,'Saving', 38364.90976,1256), +( 257,2157,2,'Saving', 1734.126161,1257), +( 258,2158,2,'Saving', 60251.94392,1258), +( 259,2159,2,'Saving', 46657.42166,1259), +( 260,2160,2,'Saving', 9505.175495,1260), +( 261,2161,1,'Saving', 32381.25655,1261), +( 262,2162,2,'Saving', 34863.35359,1262), +( 263,3034,2,'Saving', 48563.18138,1263), +( 264,3035,2,'Saving', 48493.01592,1264), +( 265,3036,2,'Saving', 173101.6616,1265), +( 266,3037,1,'Saving', 88026.78844,1266), +( 267,3038,2,'Saving', 143707.0279,1267), +( 268,3039,1,'Saving', 99494.98056,1268), +( 269,3084,2,'Saving', 88987.75075,1269), +( 270,3085,2,'Saving', 25567.8175,1270), +( 271,3086,2,'Saving', 112184.2155,1271), +( 272,3087,2,'Saving', 168562.1903,1272), +( 273,3088,2,'Saving', 185847.5828,1273), +( 274,4030,1,'Saving', 44559.8743,1274), +( 275,4031,1,'Saving', 26054.6617,1275), +( 276,4032,1,'Saving', 58280.98421,1276), +( 277,4033,1,'Saving', 33446.0035,1277), +( 278,4034,1,'Saving', 88012.34913,1278), +( 279,4035,1,'Saving', 84526.49687,1279), +( 280,4036,1,'Saving', 78822.73393,1280), +( 281,4037,1,'Saving', 10788.06735,1281), +( 282,4038,1,'Saving', 101492.5752,1282), +( 283,4039,1,'Saving', 21233.41511,1283), +( 284,4097,1,'Saving', 77413.15157,1284), +( 285,4099,1,'Saving', 84883.84174,1285), +( 286,4100,1,'Saving', 69186.40003,1286), +( 287,4101,1,'Saving', 28291.18589,1287), +( 288,4102,1,'Saving', 21900.57646,1288), +( 290,4430,1,'Saving', 22028.39868,1290), +( 291,4431,1,'Saving', 69694.60985,1291), +( 292,4432,1,'Saving', 70770.24328,1292), +( 293,4433,1,'Saving', 52412.67197,1293), +( 294,4434,1,'Saving', 61382.88758,1294), +( 296,4436,1,'Saving', 46565.86445,1296), +( 297,4437,1,'Saving', 78073.61351,1297); +-- end of ACCOUNT DATA + +--========================================================================== +-- TRANSACTION DATA +--========================================================================== +INSERT INTO sa_demo.transactions( + TRANSACTION_ID, TRANSACTION_DATE, ACCOUNT_ID, AMOUNT) VALUES +( 200,'6/9/1999', 100,410.0649), +( 203,'3/16/1999', 101,134.6683), +( 206,'5/8/2000', 102,128.8427), +( 209,'2/14/1999', 103,55.29605), +( 212,'5/24/2000', 104, 246.328), +( 215,'1/20/2000', 105,217.8844), +( 221,'6/15/2000', 107,249.6642), +( 224,'6/2/1999', 108,120.8983), +( 227,'2/27/1999', 109,116.1058), +( 230,'2/6/1999', 110,187.5347), +( 233,'6/23/2000', 111,48.13646), +( 236,'5/27/1999', 112,26.88456), +( 239,'4/4/1999', 113,7.963927), +( 242,'12/14/1999', 114,6.796708), +( 245,'6/17/2000', 115,59.15062), +( 248,'1/20/2000', 116,16.10502), +( 251,'10/3/1999', 117,513.2409), +( 254,'10/4/1999', 118,136.2889), +( 260,'6/28/2000', 120,421.2396), +( 263,'5/10/1999', 121,186.4202), +( 266,'5/23/2000', 122,102.4402), +( 269,'12/19/1999', 123, 248.581), +( 272,'7/22/1999', 124, 226.448), +( 275,'11/2/2000', 125,48.19283), +( 278,'8/20/1999', 126, 228.173), +( 281,'10/3/1999', 127,68.18768), +( 284,'1/3/1999', 128,31.63948), +( 287,'6/22/1999', 129,256.2542), +( 290,'11/28/1999', 130,19.16289), +( 293,'11/16/2000', 131,162.1792), +( 296,'7/26/1999', 132,3.779025), +( 299,'2/17/1999', 133,18.46187), +( 302,'4/24/2000', 134,25.31652), +( 305,'1/1/2000', 135,4.483854), +( 308,'7/2/2000', 136,18.33536), +( 314,'10/17/1999', 138,21.03512), +( 317,'1/21/1999', 139,15.50602), +( 320,'7/20/1999', 140, 114.246), +( 323,'11/8/2000', 141,16.60923), +( 326,'8/24/1999', 142,40.86036), +( 329,'5/22/1999', 143,44.24424), +( 332,'4/1/1999', 144,14.28121), +( 335,'11/6/2000', 145,25.39269), +( 338,'11/28/2000', 146,6.341318), +( 341,'1/10/2000', 147,7.487512), +( 344,'9/12/1999', 148,5.611813), +( 347,'2/1/1999', 149,11.63708), +( 350,'4/13/1999', 150,26.33636), +( 353,'1/19/1999', 151, 26.9734), +( 356,'9/18/1999', 152, 26.3779), +( 359,'10/26/1999', 153,44.01659), +( 362,'2/20/1999', 154,3.055476), +( 365,'6/4/2000', 155,0.088982), +( 368,'11/27/2000', 156,8.333825), +( 371,'5/6/2000', 157,22.51631), +( 374,'3/21/1999', 158,29.04578), +( 377,'1/23/2000', 159,26.38774), +( 380,'10/18/1999', 160,92.33102), +( 383,'12/24/1999', 161,59.83667), +( 386,'2/8/1999', 162,8.266304), +( 389,'3/17/2000', 163,101.5791), +( 392,'11/5/2000', 164,150.8449), +( 395,'9/25/1999', 165,228.3387), +( 398,'7/24/2000', 166,121.3898), +( 401,'4/16/1999', 167,78.65684), +( 404,'7/19/2000', 168,266.9651), +( 407,'2/7/2000', 169,34.14283), +( 410,'2/4/1999', 170,62.29798), +( 413,'4/11/2000', 171,75.89482), +( 416,'8/5/2000', 172,48.03834), +( 419,'2/11/1999', 173,176.7392), +( 422,'3/15/2000', 174,129.5668), +( 425,'12/6/1999', 175,23.25297), +( 428,'8/20/2000', 176,14.07896), +( 431,'7/12/2000', 177,39.66607), +( 434,'5/9/1999', 178, 22.162), +( 437,'12/9/2000', 179,0.869688), +( 440,'9/12/1999', 180,138.2647), +( 446,'7/24/1999', 182,225.1657), +( 449,'5/7/2000', 183,12.54472), +( 452,'2/18/1999', 184,110.9305), +( 455,'5/12/2000', 185,4.345138), +( 458,'8/27/1999', 186,8.993184), +( 461,'6/16/2000', 187, 6.36054), +( 464,'5/25/2000', 188,52.51078), +( 467,'7/22/2000', 189,25.45362), +( 473,'11/2/2000', 191,40.43505), +( 476,'8/20/1999', 192,5.576618), +( 479,'11/13/1999', 193,133.9944), +( 482,'9/20/2000', 194,109.4392), +( 485,'7/4/2000', 195,84.65599), +( 491,'2/6/1999', 197,16.62518), +( 494,'8/9/2000', 198, 19.734), +( 497,'7/1/1999', 199,4172.654), +( 500,'5/14/1999', 200,38353.48), +( 503,'4/12/1999', 201,6068.544), +( 506,'4/16/1999', 202,11277.34), +( 509,'12/12/1999', 203,15628.58), +( 512,'5/23/2000', 204,1544.129), +( 518,'1/24/2000', 206, 134.573), +( 521,'12/25/1999', 207,9989.299), +( 524,'3/10/2000', 208,4443.906), +( 527,'4/2/1999', 209,1784.336), +( 530,'2/20/1999', 210, 8814.86), +( 533,'4/3/2000', 211,1133.963), +( 536,'12/4/2000', 212,1321.064), +( 539,'12/2/1999', 213,1134.468), +( 542,'9/11/2000', 214,1791.388), +( 545,'5/22/2000', 215,611.6733), +( 548,'3/1/2000', 216,3846.393), +( 551,'1/14/1999', 217,5136.206), +( 557,'4/14/1999', 219,1806.315), +( 560,'11/27/2000', 220,9556.921), +( 563,'9/7/2000', 221,5052.018), +( 566,'8/24/2000', 222,19897.25), +( 569,'8/10/1999', 223,20643.46), +( 572,'5/19/1999', 224,1010.197), +( 575,'7/26/1999', 225,5505.485), +( 578,'2/4/2000', 226,7053.833), +( 581,'9/14/1999', 227,3386.158), +( 584,'7/24/1999', 228,13494.65), +( 587,'12/21/1999', 229,2740.613), +( 590,'4/25/1999', 230, 13284.4), +( 593,'3/24/1999', 231,2445.456), +( 596,'9/23/1999', 232,1760.232), +( 599,'12/5/2000', 233,1687.219), +( 602,'7/11/2000', 234,115.0738), +( 605,'2/8/2000', 235,1271.798), +( 608,'11/20/1999', 236,4541.155), +( 611,'4/15/1999', 237, 3677.7), +( 614,'1/17/1999', 238,2795.182), +( 617,'5/17/2000', 239,774.5752), +( 620,'4/20/2000', 240,782.5478), +( 623,'2/18/1999', 241,1436.765), +( 626,'1/1/2000', 242,2771.544), +( 629,'11/19/1999', 243,3420.935), +( 632,'1/7/2000', 244,2231.038), +( 635,'9/9/1999', 245,2025.772), +( 638,'10/25/2000', 246,9.387454), +( 641,'12/18/2000', 247,1969.252), +( 644,'3/15/1999', 248,6195.007), +( 647,'10/1/2000', 249,4103.657), +( 650,'11/9/1999', 250,1359.439), +( 653,'4/17/1999', 251,530.9645), +( 656,'5/28/2000', 252,171.7705), +( 659,'3/25/2000', 253,190.8625), +( 662,'1/22/2000', 254,2765.804), +( 665,'10/7/2000', 255, 1720.33), +( 668,'2/11/1999', 256,6441.007), +( 671,'6/23/1999', 257,121.6101), +( 674,'7/24/1999', 258,9957.765), +( 677,'10/5/1999', 259,6853.639), +( 680,'4/28/1999', 260,726.6378), +( 683,'11/9/2000', 261, 769.309), +( 686,'2/7/1999', 262,5860.827), +( 689,'5/5/2000', 263,1754.494), +( 692,'3/17/2000', 264,2713.556), +( 695,'12/19/1999', 265,417.2778), +( 698,'7/20/1999', 266, 10273.4), +( 701,'8/11/1999', 267,4018.836), +( 704,'8/24/2000', 268,9078.658), +( 707,'3/21/2000', 269,16283.33), +( 710,'12/8/1999', 270, 3269.45), +( 713,'6/14/1999', 271,10040.68), +( 716,'11/24/2000', 272,6451.387), +( 719,'11/17/1999', 273,22634.37), +( 722,'12/22/2000', 274,6310.148), +( 725,'5/17/1999', 275,5195.875), +( 728,'12/22/1999', 276, 9716.49), +( 731,'11/21/2000', 277,6015.548), +( 734,'9/8/2000', 278,2858.153), +( 737,'12/21/1999', 279,14701.36), +( 740,'4/17/1999', 280,13436.15), +( 743,'12/4/2000', 281,1437.694), +( 746,'9/2/2000', 282,5929.765), +( 749,'9/28/2000', 283,851.2012), +( 752,'10/18/1999', 284,11199.08), +( 755,'7/6/2000', 285,867.0179), +( 758,'12/3/2000', 286,10766.49), +( 761,'9/4/2000', 287,4060.866), +( 764,'11/10/1999', 288,2868.957), +( 770,'6/13/1999', 290,3921.282), +( 773,'6/6/1999', 291,5691.669), +( 776,'10/22/2000', 292,5842.467), +( 779,'8/8/2000', 293,995.6348), +( 782,'10/19/1999', 294,164.2341), +( 788,'10/6/1999', 296,3120.884), +( 791,'5/24/2000', 297,4215.467), +( 794,'10/16/1999', 100,265.6453), +( 797,'8/19/1999', 101,539.0321), +( 800,'11/13/1999', 102,78.76525), +( 803,'11/9/2000', 103,68.03113), +( 806,'11/21/1999', 104,200.9549), +( 809,'3/24/1999', 105,215.4605), +( 815,'5/2/1999', 107,66.71727), +( 818,'6/9/2000', 108,623.4824), +( 821,'5/6/1999', 109,109.9385), +( 824,'6/24/2000', 110,32.86801), +( 827,'8/26/2000', 111,151.9085), +( 830,'1/26/2000', 112,11.68539), +( 833,'4/19/1999', 113,13.75836), +( 836,'10/6/2000', 114,80.53244), +( 839,'6/26/1999', 115, 20.9271), +( 842,'4/1/2000', 116,26.76104), +( 845,'1/16/2000', 117,278.6843), +( 848,'12/19/1999', 118,109.5831), +( 854,'9/8/2000', 120,161.5764), +( 857,'4/20/1999', 121,49.81852), +( 860,'11/7/1999', 122, 26.4448), +( 863,'10/27/2000', 123, 436.118), +( 866,'4/11/2000', 124,46.06044), +( 869,'4/23/2000', 125,305.0076), +( 872,'10/9/1999', 126,232.3231), +( 875,'8/2/1999', 127, 61.2963), +( 878,'3/14/2000', 128,205.2637), +( 881,'9/19/2000', 129,34.73888), +( 884,'1/14/2000', 130,170.3945), +( 887,'1/19/1999', 131,241.7908), +( 890,'1/9/2000', 132,50.60082), +( 893,'11/14/1999', 133,22.68992), +( 896,'2/6/2000', 134, 26.9585), +( 899,'8/7/1999', 135,38.72871), +( 902,'6/26/1999', 136,18.99279), +( 908,'5/1/1999', 138,95.14236), +( 911,'10/4/2000', 139,6.336616), +( 914,'11/9/2000', 140,138.0959), +( 917,'2/26/2000', 141,2.088899), +( 920,'6/12/2000', 142,32.59317), +( 923,'2/5/1999', 143, 22.6203), +( 926,'4/11/1999', 144, 35.478), +( 929,'6/21/2000', 145,27.32847), +( 932,'7/19/1999', 146,14.01379), +( 935,'1/11/1999', 147,98.60913), +( 938,'10/1/2000', 148,7.594179), +( 941,'4/17/1999', 149,14.74927), +( 944,'9/14/1999', 150,17.64516), +( 947,'10/21/2000', 151,8.414119), +( 950,'2/3/2000', 152,21.81273), +( 953,'5/24/2000', 153,45.43275), +( 956,'3/28/2000', 154,2.890876), +( 959,'5/27/1999', 155,0.941372), +( 962,'1/8/1999', 156,36.43327), +( 965,'4/19/2000', 157,22.75757), +( 968,'4/23/1999', 158, 18.3028), +( 971,'6/8/1999', 159,111.2169), +( 974,'8/25/2000', 160,144.8827), +( 977,'12/3/2000', 161,41.74191), +( 980,'12/3/2000', 162,20.86361), +( 983,'8/10/2000', 163,84.66857), +( 986,'2/9/2000', 164, 23.4569), +( 989,'10/21/1999', 165,141.7547), +( 992,'7/23/1999', 166,77.80529), +( 995,'12/24/2000', 167,111.2804), +( 998,'10/26/1999', 168,333.6068), +(1001,'2/6/2000', 169,197.2564), +(1004,'6/15/1999', 170,14.14601), +(1007,'9/16/1999', 171,65.91726), +(1010,'1/10/1999', 172,35.38287), +(1013,'3/19/1999', 173,41.68522), +(1016,'2/5/1999', 174,157.0025), +(1019,'7/28/2000', 175,49.59643), +(1022,'1/13/2000', 176,30.31786), +(1025,'1/17/2000', 177,126.8564), +(1028,'6/22/2000', 178,7.913088), +(1031,'4/16/2000', 179,0.261574), +(1034,'10/23/1999', 180,64.25004), +(1040,'10/7/2000', 182,29.98905), +(1043,'8/1/2000', 183,83.81477), +(1046,'4/9/1999', 184,96.80246), +(1049,'9/23/1999', 185,2.654964), +(1052,'2/8/2000', 186,12.90884), +(1055,'3/22/2000', 187,18.68655), +(1058,'2/19/1999', 188,25.10699), +(1061,'4/12/1999', 189,230.6099), +(1067,'2/17/1999', 191,25.50788), +(1070,'10/15/2000', 192,66.20551), +(1073,'8/16/1999', 193,145.7211), +(1076,'9/6/1999', 194,129.9411), +(1079,'6/20/2000', 195,5.229966), +(1085,'7/22/1999', 197,110.2286), +(1088,'12/8/2000', 198,27.85117), +(1091,'1/22/1999', 199,4147.848), +(1094,'2/2/1999', 200,40630.21), +(1097,'3/26/2000', 201,6341.582), +(1100,'5/27/2000', 202,19718.14), +(1103,'1/7/2000', 203,20412.81), +(1106,'11/27/2000', 204,98.19314), +(1112,'1/11/1999', 206,9746.122), +(1115,'2/28/2000', 207,12884.93), +(1118,'6/21/1999', 208,3053.719), +(1121,'8/1/2000', 209,3781.076), +(1124,'11/22/2000', 210,8038.879), +(1127,'9/16/2000', 211, 354.355), +(1130,'12/19/2000', 212,3048.593), +(1133,'6/4/2000', 213,9616.066), +(1136,'8/1/2000', 214, 4383.46), +(1139,'9/18/2000', 215,1728.502), +(1142,'9/18/1999', 216,5088.025), +(1145,'8/23/1999', 217,8403.177), +(1151,'11/14/1999', 219, 7516.24), +(1154,'2/14/2000', 220,10618.38), +(1157,'3/7/1999', 221,4955.935), +(1160,'4/18/1999', 222,8996.822), +(1163,'1/4/1999', 223,31032.86), +(1166,'2/5/2000', 224,42096.04), +(1169,'5/12/1999', 225,3026.361), +(1172,'10/20/2000', 226,5415.512), +(1175,'2/6/2000', 227,3518.782), +(1178,'7/11/1999', 228,18853.91), +(1181,'8/26/2000', 229,14540.79), +(1184,'2/12/2000', 230,3190.184), +(1187,'12/25/1999', 231,2644.192), +(1190,'4/22/1999', 232,2037.797), +(1193,'9/11/2000', 233,3369.338), +(1196,'7/2/1999', 234,1695.653), +(1199,'10/3/2000', 235,3178.529), +(1202,'2/5/1999', 236,3617.337), +(1205,'11/12/1999', 237,3787.433), +(1208,'7/20/1999', 238,1108.258), +(1211,'2/13/2000', 239,10837.12), +(1214,'8/19/1999', 240,1089.209), +(1217,'10/16/1999', 241,1176.584), +(1220,'7/21/1999', 242,2316.119), +(1223,'11/17/1999', 243,991.6162), +(1226,'11/3/2000', 244, 393.124), +(1229,'5/8/2000', 245,2604.353), +(1232,'8/16/1999', 246,25.90977), +(1235,'12/2/1999', 247,1787.568), +(1238,'9/1/2000', 248, 2377.79), +(1241,'4/2/1999', 249,1698.527), +(1244,'8/23/2000', 250,1267.302), +(1247,'6/20/2000', 251,2808.839), +(1250,'1/3/1999', 252,20.07844), +(1253,'10/5/2000', 253,88.35182), +(1256,'9/8/1999', 254,69.99725), +(1259,'11/25/2000', 255,1633.452), +(1262,'12/5/2000', 256,1299.553), +(1265,'9/20/2000', 257,197.3139), +(1268,'9/22/2000', 258,6281.389), +(1271,'4/23/2000', 259,4748.887), +(1274,'11/15/1999', 260,414.1412), +(1277,'10/4/2000', 261,4661.834), +(1280,'10/4/1999', 262,4974.991), +(1283,'6/6/2000', 263,4678.143), +(1286,'1/22/2000', 264,5313.296), +(1289,'3/19/1999', 265,19422.03), +(1292,'9/26/1999', 266,14053.36), +(1295,'10/7/2000', 267,21816.82), +(1298,'3/11/2000', 268, 1338.64), +(1301,'12/25/1999', 269,15786.09), +(1304,'8/4/2000', 270,1279.132), +(1307,'3/12/2000', 271,19843.18), +(1310,'3/17/1999', 272,30949.97), +(1313,'11/27/1999', 273,17072.19), +(1316,'8/13/1999', 274,509.6888), +(1319,'8/13/2000', 275, 4630.61), +(1322,'12/5/2000', 276,5630.218), +(1325,'9/25/2000', 277,6595.324), +(1328,'6/7/1999', 278,6732.644), +(1331,'12/8/1999', 279,9735.542), +(1334,'12/26/1999', 280,15728.74), +(1337,'4/4/1999', 281,1957.673), +(1340,'8/7/1999', 282,2560.619), +(1343,'3/17/2000', 283,474.9938), +(1346,'6/19/1999', 284,10766.51), +(1349,'7/12/2000', 285,11223.75), +(1352,'10/3/2000', 286,1553.378), +(1355,'12/25/1999', 287,4076.504), +(1358,'11/26/2000', 288,3494.722), +(1364,'4/24/2000', 290,1376.821), +(1367,'8/14/2000', 291,5235.508), +(1370,'9/23/1999', 292,190.3102), +(1373,'6/26/2000', 293,2735.294), +(1376,'6/2/2000', 294,10877.28), +(1382,'4/7/1999', 296, 9086.92), +(1385,'2/26/2000', 297,9702.064), +(1388,'3/12/1999', 100,188.7422), +(1391,'12/26/2000', 101,576.3459), +(1394,'2/24/1999', 102,67.87226), +(1397,'11/27/1999', 103,49.16274), +(1400,'3/2/2000', 104,152.5284), +(1403,'8/22/1999', 105,138.3044), +(1409,'8/5/1999', 107,24.79981), +(1412,'6/25/2000', 108,160.5938), +(1415,'6/18/1999', 109,56.72258), +(1418,'8/20/1999', 110,36.32044), +(1421,'2/17/2000', 111,131.5891), +(1424,'2/19/2000', 112,64.13718), +(1427,'8/26/2000', 113,15.60056), +(1430,'12/21/1999', 114,2.275107), +(1433,'5/23/2000', 115,353.9784), +(1436,'4/2/2000', 116,59.10805), +(1439,'4/3/1999', 117,117.4123), +(1442,'10/20/2000', 118,44.62285), +(1448,'11/8/1999', 120,482.0618), +(1451,'12/1/2000', 121,0.158674), +(1454,'2/6/2000', 122,26.42557), +(1457,'8/15/2000', 123,86.99796), +(1460,'3/14/1999', 124,245.3788), +(1463,'2/15/1999', 125,81.07891), +(1466,'9/8/2000', 126,47.85189), +(1469,'2/16/2000', 127,50.21799), +(1472,'11/23/2000', 128, 47.351), +(1475,'6/22/2000', 129,12.46757), +(1478,'4/24/1999', 130,237.2425), +(1481,'3/25/2000', 131,186.9159), +(1484,'6/2/1999', 132,18.42853), +(1487,'8/27/1999', 133,7.432432), +(1490,'7/15/2000', 134,60.26388), +(1493,'8/10/2000', 135,16.37941), +(1496,'10/2/2000', 136,4.143121), +(1502,'10/8/1999', 138,7.242031), +(1505,'8/24/2000', 139,14.24114), +(1508,'8/9/2000', 140,91.99023), +(1511,'7/1/1999', 141, 70.151), +(1514,'3/13/2000', 142,46.92224), +(1517,'6/27/2000', 143,4.914297), +(1520,'9/14/2000', 144,12.68786), +(1523,'3/18/1999', 145,9.831023), +(1526,'12/14/2000', 146,7.424878), +(1529,'6/24/1999', 147,26.91243), +(1532,'4/14/2000', 148,1.705627), +(1535,'2/20/1999', 149, 31.3328), +(1538,'7/28/1999', 150, 54.4283), +(1541,'12/3/1999', 151,30.67218), +(1544,'10/11/1999', 152, 22.6467), +(1547,'3/18/2000', 153,24.05183), +(1550,'3/15/1999', 154, 28.5632), +(1553,'8/7/1999', 155,0.826164), +(1556,'11/23/1999', 156,9.920162), +(1559,'8/21/1999', 157,14.64077), +(1562,'3/17/1999', 158,32.81727), +(1565,'3/25/1999', 159,66.04171), +(1568,'6/24/1999', 160, 112.243), +(1571,'7/2/2000', 161,18.21168), +(1574,'4/27/2000', 162,10.61284), +(1577,'10/19/1999', 163,83.85694), +(1580,'12/10/2000', 164, 52.8986), +(1583,'12/28/2000', 165,211.4837), +(1586,'11/4/1999', 166,97.49797), +(1589,'10/20/1999', 167,53.01525), +(1592,'10/14/1999', 168,46.53771), +(1595,'5/22/1999', 169,15.11523), +(1598,'5/25/2000', 170,127.9403), +(1601,'5/25/1999', 171,77.36744), +(1604,'6/9/1999', 172,78.45289), +(1607,'9/8/1999', 173,178.9362), +(1610,'6/3/2000', 174,190.9741), +(1613,'7/22/2000', 175,6.944259), +(1616,'12/27/2000', 176, 9.10269), +(1619,'4/26/2000', 177,101.4788), +(1622,'6/11/2000', 178, 50.6176), +(1625,'11/19/2000', 179,14.27261), +(1628,'4/9/1999', 180,137.7139), +(1634,'11/1/1999', 182,101.6721), +(1637,'9/11/1999', 183, 60.1139), +(1640,'4/17/2000', 184,190.7395), +(1643,'5/11/1999', 185, 5.05994), +(1646,'8/21/1999', 186,14.38241), +(1649,'4/26/1999', 187,25.71961), +(1652,'4/3/1999', 188,37.35634), +(1655,'5/7/1999', 189,167.6363), +(1661,'5/13/1999', 191,12.41107), +(1664,'11/18/1999', 192,50.95264), +(1667,'8/2/2000', 193,67.62999), +(1670,'7/16/1999', 194,83.97284), +(1673,'1/9/2000', 195,8.462688), +(1679,'10/3/1999', 197, 77.3681), +(1682,'3/10/2000', 198,1.117515), +(1685,'9/20/1999', 199,4732.466), +(1688,'12/20/2000', 200,15504.25), +(1691,'9/18/1999', 201,11203.11), +(1694,'9/5/2000', 202,16689.98), +(1697,'10/4/1999', 203,4997.475), +(1700,'6/2/1999', 204,473.3774), +(1706,'4/10/2000', 206,4661.805), +(1709,'8/4/1999', 207,11006.09), +(1712,'5/28/2000', 208, 380.71), +(1715,'1/21/1999', 209,10150.82), +(1718,'4/7/2000', 210,6567.307), +(1721,'3/12/2000', 211,1610.885), +(1724,'7/27/1999', 212,6091.375), +(1727,'10/28/2000', 213,3054.828), +(1730,'4/6/1999', 214, 8658.91), +(1733,'1/11/1999', 215,5509.121), +(1736,'10/9/1999', 216, 926.55), +(1739,'7/21/2000', 217,27760.22), +(1745,'6/2/1999', 219,10328.86), +(1748,'7/1/2000', 220,679.4078), +(1751,'9/4/1999', 221,12090.48), +(1754,'2/12/1999', 222,3772.923), +(1757,'10/5/2000', 223,35608.31), +(1760,'10/9/2000', 224,30748.52), +(1763,'9/3/2000', 225,4682.998), +(1766,'5/7/1999', 226,8499.817), +(1769,'5/20/1999', 227,7709.753), +(1772,'12/2/1999', 228,8610.715), +(1775,'11/11/2000', 229, 2641.61), +(1778,'4/3/2000', 230,12071.88), +(1781,'6/2/2000', 231,3715.188), +(1784,'1/24/1999', 232,7048.929), +(1787,'7/28/1999', 233,853.6858), +(1790,'3/17/1999', 234,82.34863), +(1793,'10/25/2000', 235,972.5005), +(1796,'1/27/1999', 236,2789.688), +(1799,'6/20/2000', 237,829.3602), +(1802,'6/13/2000', 238,1718.027), +(1805,'12/11/2000', 239,2874.005), +(1808,'8/22/2000', 240,1326.661), +(1811,'8/2/1999', 241,2673.106), +(1814,'7/23/2000', 242,2727.875), +(1817,'10/18/2000', 243,1742.129), +(1820,'11/22/2000', 244,779.3618), +(1823,'8/20/2000', 245,26.86364), +(1826,'8/15/1999', 246,5.360506), +(1829,'5/4/1999', 247,560.6894), +(1832,'12/25/2000', 248,3984.985), +(1835,'12/2/1999', 249,2396.236), +(1838,'3/9/1999', 250,459.5467), +(1841,'9/12/2000', 251,2766.734), +(1844,'8/23/1999', 252,231.6356), +(1847,'8/18/1999', 253,94.30295), +(1850,'11/26/1999', 254,1104.924), +(1853,'12/16/1999', 255,1393.034), +(1856,'9/9/1999', 256,5095.222), +(1859,'3/10/1999', 257,283.8402), +(1862,'4/6/2000', 258, 8110.89), +(1865,'12/14/2000', 259,5057.524), +(1868,'4/20/1999', 260,87.03693), +(1871,'3/19/1999', 261, 5541.51), +(1874,'9/16/1999', 262,4953.092), +(1877,'12/12/2000', 263,6178.717), +(1880,'3/8/2000', 264,8376.747), +(1883,'1/23/1999', 265,23313.55), +(1886,'8/10/1999', 266,12911.57), +(1889,'4/4/2000', 267,23678.95), +(1892,'8/20/2000', 268,7156.746), +(1895,'5/5/1999', 269,6572.862), +(1898,'1/2/2000', 270,1186.186), +(1901,'9/25/1999', 271,8418.143), +(1904,'11/23/2000', 272,33049.09), +(1907,'2/7/2000', 273,35906.11), +(1910,'9/28/1999', 274,3484.518), +(1913,'12/19/2000', 275,787.9008), +(1916,'12/2/2000', 276,1880.011), +(1919,'8/26/1999', 277,1512.381), +(1922,'4/26/1999', 278,11789.42), +(1925,'10/17/2000', 279,15526.06), +(1928,'6/24/2000', 280,15046.52), +(1931,'5/23/1999', 281,1928.325), +(1934,'5/25/2000', 282,10937.21), +(1937,'1/23/1999', 283,4017.299), +(1940,'1/18/2000', 284,11313.78), +(1943,'11/27/1999', 285,13807.37), +(1946,'12/2/1999', 286,10054.29), +(1949,'12/18/2000', 287,1341.674), +(1952,'8/20/1999', 288,4182.189), +(1958,'3/13/1999', 290, 489.583), +(1961,'10/22/1999', 291,8001.026), +(1964,'11/4/2000', 292,7429.313), +(1967,'10/6/2000', 293, 1592.42), +(1970,'10/7/2000', 294,1674.686), +(1976,'12/28/1999', 296, 2713.18), +(1979,'5/14/1999', 297,5228.697), +(1982,'2/6/1999', 100,397.2972), +(1985,'5/8/1999', 101,270.0248), +(1988,'1/6/2000', 102,171.1764), +(1991,'8/28/1999', 103,25.89929), +(1994,'2/22/1999', 104,232.3206), +(1997,'5/6/1999', 105,235.2605), +(2003,'4/2/2000', 107,30.99789), +(2006,'11/10/1999', 108,608.7637), +(2009,'1/4/2000', 109,288.1529), +(2012,'2/8/2000', 110,76.10206), +(2015,'11/7/2000', 111,43.93914), +(2018,'12/28/1999', 112,10.25989), +(2021,'1/17/2000', 113,28.78546), +(2024,'1/18/1999', 114,58.15921), +(2027,'3/22/1999', 115, 187.817), +(2030,'12/11/2000', 116,54.81473), +(2033,'1/16/2000', 117,446.1077), +(2036,'1/5/1999', 118,203.5912), +(2042,'11/24/1999', 120,23.42961), +(2045,'5/22/1999', 121,87.14982), +(2048,'11/24/1999', 122, 20.3656), +(2051,'3/9/2000', 123,256.5047), +(2054,'2/17/1999', 124,286.4381), +(2057,'9/6/1999', 125,123.9119), +(2060,'12/9/2000', 126,142.6252), +(2063,'7/17/2000', 127,104.2036), +(2066,'9/8/1999', 128,201.5262), +(2069,'6/25/1999', 129,175.6191), +(2072,'4/6/1999', 130,104.4412), +(2075,'11/9/2000', 131,417.5754), +(2078,'9/22/1999', 132,9.971304), +(2081,'9/5/1999', 133,1.064763), +(2084,'11/15/1999', 134,25.05566), +(2087,'3/17/2000', 135,19.94687), +(2090,'3/14/2000', 136,16.79072), +(2096,'7/1/2000', 138,14.76112), +(2099,'2/26/1999', 139,8.636134), +(2102,'8/4/1999', 140,33.20779), +(2105,'11/12/1999', 141,49.57415), +(2108,'10/13/2000', 142,49.40475), +(2111,'11/9/1999', 143,36.55046), +(2114,'3/21/2000', 144,5.867452), +(2117,'9/5/2000', 145,14.63534), +(2120,'4/23/1999', 146,15.91529), +(2123,'3/26/1999', 147,73.85168), +(2126,'6/1/1999', 148,8.992213), +(2129,'3/26/2000', 149,8.362277), +(2132,'6/13/2000', 150,30.64562), +(2135,'6/16/2000', 151, 34.2395), +(2138,'6/9/1999', 152,30.33333), +(2141,'1/20/2000', 153,3.226211), +(2144,'1/14/1999', 154,28.97461), +(2147,'12/19/1999', 155, 0.30189), +(2150,'6/23/2000', 156, 21.0384), +(2153,'12/25/2000', 157,29.22727), +(2156,'6/22/1999', 158,2.647235), +(2159,'2/13/1999', 159,68.63482), +(2162,'4/19/2000', 160,130.3504), +(2165,'10/6/2000', 161,2.180321), +(2168,'7/16/1999', 162,7.910875), +(2171,'5/17/1999', 163,29.40676), +(2174,'7/3/2000', 164,24.30426), +(2177,'10/6/2000', 165,90.38355), +(2180,'3/2/2000', 166,36.46251), +(2183,'3/13/1999', 167,2.747963), +(2186,'2/6/2000', 168,182.0007), +(2189,'11/1/2000', 169, 191.417), +(2192,'1/19/1999', 170,171.5873), +(2195,'8/16/2000', 171,41.89359), +(2198,'8/6/1999', 172,11.04035), +(2201,'10/8/1999', 173,68.56703), +(2204,'4/10/2000', 174,106.7472), +(2207,'6/23/1999', 175,39.85807), +(2210,'6/18/2000', 176,41.44438), +(2213,'4/20/2000', 177,44.66734), +(2216,'8/13/1999', 178,11.21136), +(2219,'11/13/1999', 179,5.600994), +(2222,'5/11/2000', 180,123.0376), +(2228,'6/1/2000', 182,251.2471), +(2231,'11/27/1999', 183,35.94439), +(2234,'4/17/1999', 184,198.5348), +(2237,'7/3/2000', 185,2.967351), +(2240,'12/2/2000', 186,8.045825), +(2243,'7/21/2000', 187,5.728503), +(2246,'9/23/1999', 188,36.76644), +(2249,'10/26/2000', 189,232.8362), +(2255,'1/12/1999', 191,33.72641), +(2258,'10/3/2000', 192,64.46211), +(2261,'7/25/2000', 193,67.27182), +(2264,'6/24/1999', 194,61.60903), +(2267,'4/13/2000', 195,165.0446), +(2273,'4/11/1999', 197,113.3709), +(2276,'3/3/2000', 198,11.32904), +(2279,'11/14/1999', 199,1851.289), +(2282,'6/6/2000', 200,31405.72), +(2285,'7/13/2000', 201,716.3705), +(2288,'9/3/2000', 202,29606.56), +(2291,'7/25/2000', 203,20195.74), +(2294,'9/4/1999', 204,2842.049), +(2300,'1/7/2000', 206,5454.829), +(2303,'11/25/1999', 207,2206.141), +(2306,'1/28/2000', 208,4744.707), +(2309,'7/7/1999', 209, 6390.97), +(2312,'4/11/1999', 210,9539.196), +(2315,'12/24/2000', 211,7864.815), +(2318,'5/15/1999', 212, 872.542), +(2321,'1/7/2000', 213,3318.323), +(2324,'11/4/1999', 214,5763.722), +(2327,'6/9/1999', 215,944.3873), +(2330,'4/13/1999', 216,511.0076), +(2333,'6/28/1999', 217,12801.39), +(2339,'7/17/1999', 219,27869.35), +(2342,'3/11/2000', 220,623.9558), +(2345,'5/16/1999', 221,20758.23), +(2348,'4/8/1999', 222,10280.78), +(2351,'7/8/2000', 223,33963.38), +(2354,'4/7/1999', 224,4988.438), +(2357,'5/8/2000', 225,177.7306), +(2360,'4/4/1999', 226,3673.922), +(2363,'2/25/1999', 227,5418.243), +(2366,'12/6/2000', 228,9651.242), +(2369,'2/19/2000', 229,801.9194), +(2372,'8/12/2000', 230,2035.503), +(2375,'1/21/2000', 231,2476.122), +(2378,'1/9/1999', 232,4527.432), +(2381,'1/27/1999', 233,275.1983), +(2384,'8/24/1999', 234, 2747.21), +(2387,'8/22/2000', 235,2454.241), +(2390,'2/2/1999', 236,2111.672), +(2393,'8/9/1999', 237,1387.837), +(2396,'12/8/2000', 238, 1163), +(2399,'7/12/1999', 239,3890.431), +(2402,'4/21/2000', 240,239.6195), +(2405,'4/6/2000', 241,1842.653), +(2408,'8/20/1999', 242,2152.329), +(2411,'3/12/2000', 243,3005.124), +(2414,'8/2/1999', 244,2638.944), +(2417,'2/26/2000', 245,2431.208), +(2420,'5/23/2000', 246,42.41151), +(2423,'2/21/2000', 247,841.1042), +(2426,'7/17/2000', 248,3386.254), +(2429,'1/3/2000', 249,1843.864), +(2432,'10/11/2000', 250,1357.021), +(2435,'11/13/2000', 251,2883.029), +(2438,'4/13/2000', 252,236.1756), +(2441,'1/10/1999', 253,142.5996), +(2444,'7/15/1999', 254,2718.375), +(2447,'4/26/1999', 255,989.5613), +(2450,'4/27/2000', 256,6972.301), +(2453,'2/24/1999', 257,130.9576), +(2456,'11/10/1999', 258,6262.766), +(2459,'11/18/2000', 259,3086.867), +(2462,'10/28/2000', 260,20.02136), +(2465,'12/10/1999', 261,4172.872), +(2468,'12/10/2000', 262,1533.623), +(2471,'12/1/2000', 263,3092.681), +(2474,'10/9/2000', 264,3854.422), +(2477,'1/19/2000', 265,9572.416), +(2480,'12/15/1999', 266,12107.02), +(2483,'6/12/1999', 267,249.8177), +(2486,'3/8/1999', 268,11433.34), +(2489,'3/15/2000', 269,905.8667), +(2492,'5/15/2000', 270,431.7046), +(2495,'11/10/2000', 271,7490.943), +(2498,'7/4/2000', 272, 4332.43), +(2501,'3/20/1999', 273,11927.34), +(2504,'7/21/2000', 274,6024.322), +(2507,'9/20/1999', 275, 84.9894), +(2510,'5/15/2000', 276,4547.415), +(2513,'5/23/2000', 277,4440.402), +(2516,'9/28/1999', 278,9733.886), +(2519,'9/13/2000', 279,1155.452), +(2522,'10/20/2000', 280,7285.954), +(2525,'6/19/1999', 281,466.4518), +(2528,'11/1/1999', 282,8143.997), +(2531,'11/28/2000', 283,2163.073), +(2534,'10/22/1999', 284,9218.228), +(2537,'7/10/2000', 285,9369.708), +(2540,'6/28/2000', 286,7669.178), +(2543,'2/25/2000', 287,2292.681), +(2552,'10/21/1999', 290,3701.036), +(2555,'3/19/2000', 291,6146.988), +(2558,'2/16/1999', 292,3093.035), +(2561,'12/8/2000', 293, 3779.69), +(2564,'4/22/2000', 294,4568.839), +(2570,'4/23/2000', 296,8000.067), +(2573,'5/4/2000', 297, 7879.64); +-- end of TRANSACTION DATA diff --git a/spatial/bank/saBankDemoViewDDL.db2 b/spatial/bank/saBankDemoViewDDL.db2 new file mode 100644 index 0000000..226f9e3 --- /dev/null +++ b/spatial/bank/saBankDemoViewDDL.db2 @@ -0,0 +1,213 @@ +---------------------------------------------------------------------------- +-- Licensed Materials - Property of IBM +-- Governed under the terms of the IBM Public License +-- +-- (C) COPYRIGHT International Business Machines Corp. 2000 - 2021 +-- All Rights Reserved. +-- +-- US Government Users Restricted Rights - Use, duplication or +-- disclosure restricted by GSA ADP Schedule Contract with IBM Corp. +---------------------------------------------------------------------------- +-- +-- Component Name: Db2 Spatial Analytics +-- +-- Source File Name: saBankDemoViewDDL.db2 +-- +-- Version: 11.5.6+ +-- +-- Description: +-- +-- +-- +-- For more information about the Db2 Spatial Analytics Bank Demo scripts, +-- see the saBankDemoREADME.txt file. +-- +-- For more information about Db2 Spatial Analytics component, refer to the +-- documentation at +-- https://www.ibm.com/docs/en/db2/11.5?topic=data-db2-spatial-analytics. +-- +-- For the latest information on Db2 refer to the Db2 website at +-- https://www.ibm.com/analytics/db2. +---------------------------------------------------------------------------- + +--========================================================================== +-- Show all customers of Branch 1 - Meridian +--========================================================================== + +CREATE VIEW sa_demo.meridian_customers (name, phone, location, branch_name) AS + SELECT c.name, c.phone, c.location, b.name + FROM (sa_demo.customers AS c + JOIN sa_demo.accounts AS a + ON (a.customer_id = c.customer_id)) + JOIN sa_demo.branches AS b + ON (b.branch_id = a.branch_id) + WHERE b.name='Meridian'; + +--========================================================================== +-- Show all customers of Branch 2 - San Carlos +--========================================================================== + +CREATE VIEW sa_demo.sancarlos_customers (name, phone, location, branch_name) AS + SELECT c.name, c.phone, c.location, b.name + FROM (sa_demo.customers AS c + JOIN sa_demo.accounts AS a + ON (a.customer_id = c.customer_id)) + JOIN sa_demo.branches AS b + ON (b.branch_id = a.branch_id) + WHERE b.name='San Carlos'; + +--========================================================================== +-- Show the nearest branch of each customer +--========================================================================== + +CREATE VIEW sa_demo.closest_branch AS + WITH distance_to_customers(c_id, b_id, distance) AS + (SELECT c.customer_id, b.branch_id, ST_Distance(c.location, b.location) + FROM sa_demo.customers c, sa_demo.branches b + WHERE c.customer_id > 0) + SELECT c.name, c.location, c.phone, d_c.b_id, d_c.distance + FROM distance_to_customers d_c, sa_demo.customers c + WHERE d_c.c_id=c.customer_id AND + d_c.distance <= ALL(SELECT distance + FROM distance_to_customers d_c2 + WHERE d_c2.c_id=d_c.c_id); + +--========================================================================== +-- Show all savings balance +--========================================================================== + +CREATE VIEW sa_demo.customers_savings AS + SELECT c.customer_id, c.name, c.phone, c.location, a.balance + FROM sa_demo.accounts a, sa_demo.customers c + WHERE a.type = 'Saving' AND + a.customer_id = c.customer_id; + +--========================================================================== +-- Show all checking accounts balance +--========================================================================== + +CREATE VIEW sa_demo.customers_checkings AS + SELECT c.customer_id, c.name, c.phone, c.location, a.balance + FROM sa_demo.accounts a, sa_demo.customers c + WHERE a.type = 'Checking' AND + a.customer_id = c.customer_id; + +--========================================================================== +-- Show checking+saving accounts balance +--========================================================================== + +CREATE VIEW sa_demo.customers_totals AS + WITH account_sum (customer_id, sum_balance) AS + (SELECT act.customer_id, SUM(act.balance) + FROM sa_demo.accounts act + GROUP BY act.customer_id + ) + SELECT c.customer_id, c.name, c.phone, c.location, account_sum.sum_balance + FROM sa_demo.customers c, account_sum + WHERE account_sum.customer_id = c.customer_id; + + +--========================================================================== +-- Show the savings balance of all customers 0.05 degrees (about 3.5 miles) +-- from my branches +--========================================================================== + +CREATE VIEW sa_demo.closest_savings AS + SELECT c.customer_id, c.name, c.phone, c.location, a.balance + FROM sa_demo.accounts a, sa_demo.branches b, sa_demo.customers c + WHERE st_distance(b.location, c.location) > .05 AND + a.type = 'Saving' AND + a.customer_id = c.customer_id AND + a.balance > 45000; + +--========================================================================== +-- Show the checking balance of all customers 3.5 miles (about 0.05 degrees) +-- from my branches +--========================================================================== + +CREATE VIEW sa_demo.closest_checking AS + SELECT c.customer_id, c.name, c.phone, c.location, a.balance + FROM sa_demo.accounts a, sa_demo.branches b, sa_demo.customers c + WHERE st_distance(b.location, c.location, 'MILE') > 3.5 AND + a.TYPE = 'Checking' AND + a.customer_id = c.customer_id AND + a.balance > 2000; + +--========================================================================== +-- Branch Zone Overlap Query +-- All the customer with more than 50000 in their saving accounts in overlapping zones +--========================================================================== + +CREATE VIEW sa_demo.overlap_zone AS + SELECT c.customer_id, c.name, c.phone, c.location, a.balance + FROM sa_demo.customers c, sa_demo.branches b1, sa_demo.branches b2, + sa_demo.accounts a + WHERE ST_Within(c.location, + ST_Intersection( + ST_Buffer(b1.location ,0.04), + ST_Buffer(b2.location ,0.04) + ) + )=1 + AND b1.branch_id <> b2.branch_id + AND a.balance > 50000 AND a.type = 'Saving' + AND a.customer_id = c.customer_id + AND (a.branch_id=b1.branch_id OR a.branch_id=b2.branch_id); + +--========================================================================== +-- Branch Buffers +-- Show the areas 0.04 miles away from my branches +--========================================================================== +-- This table is needed because of a limitation in ArcExplorer. +-- ArcExplorer can't visualize views when the geometry changes type. + +CREATE TABLE sa_demo.branch_buffers( + sa_row_id INTEGER, + geometry ST_Polygon ) organize by row; + +INSERT INTO sa_demo.branch_buffers(sa_row_id, geometry) + (SELECT sa_row_id, ST_Buffer(location, 0.04) AS ST_Polygon + FROM sa_demo.branches); + +--========================================================================== +-- Create aggregate view of Savings balance per census block +--========================================================================== + +CREATE VIEW sa_demo.avg_savings_block AS + SELECT cb.geometry, cb.sa_row_id, avg_blocks.avg_balance + FROM sa_demo.sj_census_blocks AS cb, + (SELECT blocks.sa_row_id, avg(customer_savings.balance) AS avg_balance + FROM sa_demo.sj_census_blocks AS blocks, + (SELECT c.location, a.balance + FROM sa_demo.customers AS c, sa_demo.accounts AS a + WHERE (a.type='Saving') AND + (a.customer_id=c.customer_id) + ) as customer_savings + WHERE (ST_Within(customer_savings.location, blocks.geometry)=1 ) + GROUP BY blocks.sa_row_id + ) as avg_blocks + WHERE cb.sa_row_id=avg_blocks.sa_row_id; + +--========================================================================== +-- Show the areas of Census blocks(SELBLOCKS) that have average +-- income greater than 80% of my maximum savings balance +--========================================================================== +-- all_customer = all customers with a savings account + +CREATE VIEW sa_demo.prospects AS + WITH max_blocks(amount) AS + (SELECT MAX(group_blocks.average) + FROM + (SELECT blocks.sa_row_id, AVG(all_customers.balance) AS average + FROM sa_demo.sj_census_blocks blocks, + (SELECT c.location, a.balance + FROM sa_demo.customers AS c, sa_demo.accounts AS a + WHERE (a.type='Saving') AND + (a.customer_id=c.customer_id) + ) AS all_customers + WHERE (ST_Within(all_customers.location, blocks.geometry)=1) + GROUP BY blocks.sa_row_id + ) AS group_blocks + ) + SELECT blocks.geometry, blocks.sa_row_id, average__1 + FROM sa_demo.sj_census_blocks AS blocks, max_blocks AS mx + WHERE average__1 > (0.8 * mx.amount); diff --git a/spatial/data/cityLimits.dbf b/spatial/data/cityLimits.dbf new file mode 100644 index 0000000000000000000000000000000000000000..766b04d21060f9c6fc9eec6c61cedbc989baa491 GIT binary patch literal 4672 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≪=0)`A>O%RGvST=U3(V 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�My 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 AK>z>% literal 0 HcmV?d00001 diff --git a/spatial/data/cityLimits.shx b/spatial/data/cityLimits.shx new file mode 100644 index 0000000000000000000000000000000000000000..f1d0c64340683d2f80b705cd07a747044de78124 GIT binary patch literal 556 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 literal 0 HcmV?d00001 diff --git a/spatial/data/floodzones.shx b/spatial/data/floodzones.shx new file mode 100644 index 0000000000000000000000000000000000000000..a33e52fdadba1d282483d3c7f8807dc527b23684 GIT binary patch literal 404 zcmZQzQ0HR64oWyD_G^Yu8Sjf z?I@x~K%N5-mjST{5FY|!2L=X4HYn`{q$7a*WkA{jNI!yzGpRxNOi4g`1_J}rKZrQ9 z6O?X)$TJ^;(jfT&1_qWOh&;0%4nlKiLFqIoy$DL*gV3B(P&y1sPlD3tKr{dc9xh1$ literal 0 HcmV?d00001 diff --git a/spatial/data/offices.dbf b/spatial/data/offices.dbf new file mode 100644 index 0000000000000000000000000000000000000000..a32287db0d9c2f64d8e64148d165f64933ca8743 GIT binary patch literal 1339 zcmZuxJ#X7E5Eam^MS;#8(%U+ zy#>ymzlXUjO7R2>y|X2BR_b;PZmLcBTw(37*N8<9;xI*{;L0FAI`k0ni338&Wc639 z(3V!$>dVX>O_+nQ} zn-)C=u}32pq&BD?utx$2ou`akFjA<^pa6i#^^J{Ts;O_kO8q3Z9YHp7F3=P#%IX>A zzC$@|yoRtCe&BkIW~)_Wy-$vLyJHEdp{rNz zwI$YF8=|Crl}D$B49DE_l!Wi_rBWL^tTpsXNZ?i#_y_6HAEwA%8J<$#YDsc%O&7n@ kJ#a4ofeLqO={~oavVVVSYdMO{%l&)^4#1}+q!JI zB^OwZ4JJ2n`QEwR!RC%TU06#bzJTS}VRF09r=?eMSva2GKI_%BG&_))956YX-wzcR zC)+xPA7wvx_7hkiCrs|kEn%s1N%oFw_a?pEYzuZLD15gTsXfCI<`uMM0+Z7x=(#;f2YCzIlEhDRoM`3WehDlm29x{sTBgG8 ztA(TE2F}A>kT?>D$#E>6;*r18!cof8PKezaY@Y;7&gf&x`o{Mbjs{hiyGv(+&6I@6 zwWvCO2)tCAbP#@S#X_(vz(*>$lGwdAGMIW54 z0y+sOE(4Q$DO9{9PsPsBjL$LNyapWBvM{;o7t7YWPBMe%Eugp@Ozz-z>+@V~c8)n) fr~0jO2Ae4llRLBHrG1I0jbp~Ie|E=TIyeFVR`T)4 literal 0 HcmV?d00001 diff --git a/spatial/data/offices.shx b/spatial/data/offices.shx new file mode 100644 index 0000000000000000000000000000000000000000..75ec7b861b8f4813f275e6318d767adb8c070180 GIT binary patch literal 348 zcmZQzQ0HR64%WS3W?*0h%JDdD0MCz1eCr8q5)0=AL;-A literal 0 HcmV?d00001 diff --git a/spatial/data/regions.dbf b/spatial/data/regions.dbf new file mode 100644 index 0000000000000000000000000000000000000000..90fd678173f0e0394c535ad2b73eb649a08c1d9f GIT binary patch literal 337 zcmZQhhKvNPN;uzu@4^{=1mqe5Ibb$-_fmqyd zE`-6W;GLRRQktAyso+#el_(`crVXPKigF_SdoGYSh8yO`#qZn0IkrwBEZ!WbKB&mUw(VP9&GZ!ElcE3Ml(9U_xihB3WwQty zCs=H#v*JPPQTxx}y&_ylbL=&;vB1l9qdiOPXkQBVXp?E@s%3)PWZ{Bi| zE^uDTE)Zc!7JIXii)^QzPLL8~-deL9ryE?f zw9R|iC@;qJbvaFUZgVk*pI@PoiKxak6fJb6|SC&irR69!KxqJGNtJv z49yEoS@Vd2XO7wPvcE#~dDYxH+fR;n{YKn?5QPS9?$V=yc^^8?Bz6n2=dxfx{ou;^ZD)4N-Q(?w8A-vyB<7TP?@LOjTA|ry+*L~^5I)G%*71cIHl3&VK z_ogiY1`^E${pun_eDgZ7eicyZGo@Q@h6vl{bU4*V10$!+oYgB!*0=Li&b<;~cy`UM z#!(`SPTyKO|1MB=uwaz*cOk}}e_vww02n`S$3o?ILX;--H;jJ@6eX4%9o8nq-LxuM z(JSC?Mi6^5i5J-ysGjWtRP!4=&UXso^3cGr{RgmjuxjJQuVnoS`QzMGgvc!XZM3ON z2xX5~yXwt^SX$n^y799R-=%KFpBD-7ZH2}4Q}QAlk*PuEF~XD$aPN&z59bt2r)i6bSQ`9rFl{Gl%4y9;9otY!X|ke zC%o+@2oNG-Pt%s00U}IK&QdJ36Jo~8m6I=T5+OQ8cCGw$A=Fud7uPq4Frl=RC#xXD z+`yOSCFHoxvN|b4^4z5t8Ftr&h!E><6tL_wAaI;?yvj#}`}K)0OnZR)TZOMo$oU(# zCE2X31DspVtlzhi#{WFIsn&FKc@XE6Jf5~1=*kGz`-r2O{7ajINo}= zGF=leXuf>n%~=sR$+hKgNuDb#a?MXXB|=~L-Xq>}KtSlqkVt}~(y|kzRemwps8Fq= z@>GQ4sP}Cl-3(0ax-V@ZxEdz2E-b%_L4djPd7se)SL#z__K~_&H5~IiR#A+B#+~Ic znG9r3owIWoCr0Ve+#kmK8Kj-NXyU9X#;ENh?Y4U{aJL>8|3@sw7@6~G-&`3~IsaY0 z*gqE1Gd0P@Ylj#=kCxo_p2Fbwv#qNaM~YGWdt8FYBnBh$#e1J^6~j&Cqe;*N1_}@C z^@p+v&hK*@VsnqnoWc3zl2@swV$}DHmdq~Y<9%FfLOa3T zwTs-C?od9q^&am?=@UWM&R|*V3O*FZWGs1?Bf`GUGu135J|?=J+|`gK!tiHbL#t)^ zFfD3`dPs2aD(ldZ))XGvmpv%!WJJ*Bf2^$9$b-k%bF)QuB0P*f?V+}mhe~tDGqyqz zR#cC3({|+H?EAWk-{ku%zXnR=YVa_A2|IlHI1!#-a(<-noeP=ME1VkpgpeEfDp0)3 z#e9e4uIU6f^Zc>lC*cV$)AKfu>>>EU&bKUH#Kq*@&hIAQ6ykufUg;z~E*=+FdqgA( z@#MOs-^v+WypmnKA#8^bW$q3|nF?I&Nwhh%p5RMF=SHc7(;S@m^Y*UEav|Kg*O*tk zIM|l8Hr-`0se6w_d-6g#kVyZ!(!f%P8_LRyJp(yNpOmyx`~?VvnaoKc2U6?2zF(~e z*4)%uAF0lP_Ea@a(oLYr^rMEC3kORlmwY~Yt zfb7&nDFk0lcMaiHeV0u`-s}L5 zxp22f$8zEC)Y}rbh18wX#5q#mxY)F9dRJ2ruqbJC@b<|(be3%&&{+$Zsx|DK#O1+A z{PIDtAL%zGEsKYoc_^y6+ASLlSY?da`YxOYnejhH<@*CtFMH2@Ao(%LoVC5#mt23u zNHfzrJbY9ieWq(Gpc5mKDkk|f|8`S%Zzx&Mo929xHXr9l6uZfj_550B@h#Duk7&7u z$qMU$g$Cv7o%VeA?m+lh^8GlaAF^>?d?Xq;J~m$t+>x4kuWK_O{i)i|maYVz_%>B< zy1<9Tx4NJid=Z)n1@&2PGuoy^6uXmIo_migUko3ub z!8Vg=cjg}e!dAUd@-=5*^|HyLE*rSAKfs+MWbl&Zl5cQ?i$ zK34UD)-u8~OuK^@KPLBkZ;fBPBZG$}XXn2o{naEtcm8aGPr)l4h?Id3PiQl`yn}PLg=VJ-ONd7K=xnRy}2IHz^tu_q+!Mo?R76y~!{onL+Ngp^q zN^E;?JA>UOv3c9c^+LC!<#`f=qtEra$2|cG&W}{Nn89GX+s4q63PAmX%!n%m3_3&P z6}FT0s!u5yDlcJBvo^=8EED+K^B`_a1%s*2Or8o7$$obqaeqX3(TIk(?@y9^J=^I~ zm0CmaRyEgp^mZVtYVW-8`waRHXga4EFDzb73!ezP>f4W6ir5xD=I) z6r}Gl7Hh9V)au<-WAz~oYh?gr0N~CmLhqd^YC+{)-rP5u|x8w$a#h} zv#vUj{LB9K*?KIgL#tJ5=e=_w_j~1M>|C<^|9Lvk4-1_`Dv_`AK6Fu zerfKf$)ui5o?ch0B79(}!pwGAk`G^b&3kVENs*qlHiWOfo!NdVx)%6$ZobuG381!C z^O8I{9v6MRAwdezwmo~n`~$(kpS$fBjv)70bml}B$=mO$Iss?@FxaV4v-Sqzjh>~m zW2gUMuwur^x~$iL|73~h-@h}+7+P#?@rl&I_;9=YP6o$MkC6=|IO{gUDeKV((&yBC zJ!bs{);Soq_B1o_V%aSgjvzRnptD%*1_OP$cF$tMf3Drxbj6e8VXvRX%rhf}*kf^d z3HvmIUA7a`-;h}N!>NWTVlXkhJKJ=I5Ig4|nScElgM*3J3%W?09Gcg*G@U_^mu;Jq zKH+By-Y;&Dx`@~r9rIjAh)1zM&jmyhUZ82?Wa2DDtYTJx$#Mo3W>2QD{De3>Rey7$ zJIVXIEAM455kgzuR=S(idHy%AOFLEwVf?-_X2A>wUr)L(RoEcJ@`A^QI^Gc6G5wx6 zKSl@>pF_j$bqVli)0h6>eS~MmZv8f?Spc_poZ+z~_BiAIPupVwPF+7LntxD;;qJW_ zwRZ%VDStY2Vx|zhq6yOmE()Ojb4l6lA|c$WEd-Tk1$g9<>=u1qh{4-OpT|`R@YVB+ z_X@&KPxO9PSXm~(sNVsuJ$K0ce;=N4;tL;rnO*~9DhS_|Ef8cq;$zcZGt>4;Aw2U{ zo37j=@ikrji}^xKn!Hvlf1cnrud(iQo)DUAlM802@G*9Wl3&tEAyO)vPAl)?BQ9tL zS3OmTBvFVydm$eoQ8&F)$o;gGJC5B$aNfOd!^?NkLcA4gpHWlcqw?z8)~}I5ERbZs(8LhA&*Zqhn(?IPcS)a_RQ+~3IiJIBLxljA;k742M1;oe_+KA#gS$@L@(Uy zuOFJhgT|oA53#NYK_9R5T_$>eWUg*~FPT@jx`OEW59-c^V??0+3u0*umyj40 z@E;$R|2yfjHJc;n=?i4}1N(&3Ik@fbwJ~D6&bY&#^S;!k& z<5mBgL3&Iauj~^GQ~E}pZ5#u9h!Jy7X|i!Ld|m8Bf*&EWkFd=eXc9b8t?+FWQUf-eLW^ z{KbDch%vF->cjnCAB^_N=scwJl+I&1&*?g#>x8Z&y3Xi2r0bNfW4g|19H4Q6#t|B4 zXdI$(ipDV-=V%>9L@7+ z9!T>jYXy&^m+GA+%1R zbquX@XdOiBr2o-Tl+L1c7_HN29Y^atS_jfPk=Bv4&ZKoHty5_oOY2-(2h%#4*3q=i zrgb>2(`g+~>wMY=pnU?`N1%NM+J~Th3fjk@eGb|Op?wnCN1=Td+J~Wi8rsL9eID8e zqJ1LTM=Dt#B&i(Po#5z(w zVotdLBkVmViAn6MSeHEL#e;;0ik!?|HoVI_U#=m3ko&{aZlNT8o^gEtI$ti5<{Yc= zKgPylQ|l(^bC9YTdG+f_Htcdgcw`fQ?8)F7%Pj?LJcvD3JSUi}^Q&HdW)>Tji4))K z&>;NH?8^p_?+IG^w1OUuDQ z#B*XFE3JIbf@oxOW>PE%=S?zit*d6?uG(~gU^fS84&~l4W#ssgE3&HpaB#8UPLD(p z3lBxoIos+v=w3CV`_WAnd_Q?P z@Z%{b=OpLsiPUzT)bG7+7j@K1^o_%)#KcG@KcF+crb~DUz2aO zSO)UY@zAC3X&?)#^SImnqRBp#E05bVmj#2s%!`ecJp791O^I=3!MAju!X0Furw~%Cel>`N{lNyE z4IlWZ&JWzh`0s%f89_q~=WMOS!$58Vu0X8}A&&X3^qv4;8 zA66|B;DOJBS~)fw3CkBA|LH1#pi9YZ-BdPQbj$4?-WR}d>Yt!QNj8#2dzquH0!%fq zyt1v6h2W)P(VM3N%(^|n@5+4^92OSMby{TiQh?uj z0~#N)S;)yc_-mXLgUZ;;X}`{}P@-qpvSlv z8+~N7G6UJQCzJE4Sm;|Qt>3K5V2^cF-p8{nn9cFovqFo^C*$Mo{*v`>vHvq&Wgdes zuk1^0$oZts8p*tJU?9KH`m^627LtXTYIXA&%-*_d?Y0Fh{Jyd)M$3;O{)}RUswE3! zoz-J{*D**;zAf0yVd2FrIoBn`_bckS-hFr+3z|W;#TM}lw3tNgN_iHH=eq*`YPWy2*?)BHZ}Rt_Pl&m%U&nF{tZtb1ut|x78Hc2jMn-6WU4PH` zkuj;u(G7Eh*(8pVF5I}91D~$c+qrxVe0J#jxMBwfMsoT!HET4GrCgP2Rm8#UQ7W^} zoYX+vFz$(sr#UFP>Bl_i(12NB@-X9z97GiO9teG>fta$^nJq2kctyQgT8ajGJGsZV z_mJ!FPF=Kos|MP&hs7->etFT1X3^DT4OsO43>c}&MUK_@&8yyOKvdH?(OSgCJL7i6 zh?$y5?^ICPe3i^2`s3?gX=q|fTbz+%JHdf1qh$0xYrrx>tgO?=#UhDvmCH9ZF#drao}maT!=JMyxA5d3_Mw5IuwH4wF+OhSJ*4;eq* zox-PT;`NK5ymvV~T+&)Itm2R+eqZw+by$kb*_YnT-6_xlliCyJX2Hj_xAA^+Yqh|a zp0m8rn9T8=a|&=jhU%c<6?+!(k+?J9Uq~MWZuRb<(GIE zy>U^xT(34vCS{$zP)y#VP`k5c|35mo;`T_8w}-69Hs<3IIbB#TFj&D5d_VD^BI?9y zU2OA8arK|g!-byW!;uBLm}~sQ!+S0d{AE@H5w*IA7;>1C;6Tn_qr541lpfkXdcRt^ zfd{)SK?i@$)5FNaQETj~367Qi-Ptfs4_>c_hwUQs0H27XH?QUDVp7Q{SCKm(tADcc zqLOqWJF+K6eJ>wdRy!YJ{m=zhIm{tYU4SJmR+g6jdgyl@h{)p#kiJgk>cA&Gj1O#4 zpQ0}yK5uX$%Ud7LwVy2qbU9L{v(-4-U&1#p(ttl6^55SwxnWONBGTu`;{ zc>dD>^Ik9Y9zT{roz7NgNn&u^cz>kC*@(fjw-3Gq)fgbpyYr1;76VbLd)?-dhIsT< zG}_aL_auwb{`DU80EMx{SGeNO{&L2As+bM(&@DFha-X_pF}` zEal}t&(t!;q&+wL9f;4fLeci{{3v5wUtDzjSqJe=9~W(yR%eXNGa>B2Rx)qMD9Z}4 zG=aqOdqL-jFRSCF{!Y!w1Y>&7M7?}V)+h2l8t!j``La9vorq6svX=Gt@g5W09hJIb z?0W_s18yekqD)Yd+1xo;$zYB{WnAb96Iix#Yi^X1dF}qfHOHQs;QkGTmKEfFj#)@7 z80<7b$}7n)ocqM5H9aT{C$W1(>5xL_w~}6uv#DKYSp*bi?G{ z{QEj)P`mS1`)NDzdGDFte(z)kr*}tPtjIj#XT`R?;@xIo@(gBsllA#jOdN>2W`+fy z?w#IT&cGvXX$P9jaMO2?FI7y|x5YL_y3Y(dy>_g2AwJ&58{gDV%9`U`-SbqNeFXP~ znj^1Un4>vD?UU6J;=?_7=R4fn98F{NSDq!$cgC5sFETfoV@$x=nL+&o*K^;0dH0Vw z|evFL&u`Oo8$3-XR;CT={KzQ7!j*(f%w)pPg7=) z`N&we25Wl@B+d5e$yO(PaZXoBn4blhmh&mT#P>h!xBRnTrUmZFSNFYcV{md+@`a7% z7I00F%}{*7z*qBLYV=zRD2Au^PbK@i?t1Or!$TJMaIYieD~T<~FN}R5X^F^-vfDgf zGtg^~oSpH*0!G0>d(&<)=*crbSpCNW5mo*bs$~Cpj)%i9Dp{g1zh7m{CGz{s=-NXz zmN3se_jv{J@w*?FWd59IiGz;09!4a8W#8KdpY*oG`icnwUSvQ2){ICFPqakzu2rel za^22)rTxGLfuVPiSXar`}1Dz z$+U#h})<1hN!5&rxlx3Z$#5-Y|&{B(%Smr}FjUTAb%B4_8! zcUKnzQ?%A)oBg&#+Rs~4^T`}>7jtsfEE1apZ!#z*b4JZ`)=pI|maungo@Eja%&i^4 z$>^{|rCs`mj;eif%bT6K{Xltf#DYl_I+`DRvJ^ja$n z^_P|}JVxd@S+z<>a;=chf3EanFVHra^hYM&3W0muLfgE^`y;D%YA-6Y!ie^RPnVIo zDgU;^mQN3@uyA*z@QskvmqUyHaAj+J9qwD=V@Bq(e$TGCZ?eW7tIt81hQN-^0meT{ ztPvJ@MC~DY-(%OTmXIfRtub1P&+%0Sw*0<#`1?C+96yz6lRFa_WM3$qp<)Amp3BAx z^80+Ruu)67Hkc6iV_*vpNZx2V>c9dUL^&Ik_>#F=#b9PoyQ2*<45K#N9S7c9AABvF zW`jq^vs618$Q<$W%yyYP8_f6pB3VJ^Rhcdu--X|?L12^Az?D8=sOLOpwb{Vr(y+JE zAIThcA8)R+3=4YMF?s9X0vDREMAx|x9q@ciDSnapU)WSvvrrZqtJ=fYE0K8= z_P<=|U!R-y!D*kI_R(pdo%Z2rpPu&dX`i2-1JH8c_+pEKZ(YlbDLPlES=X=^qTH}t9^v2%nY`pavFmaHxLjAmrU1(q<>77g(H`fwt)$Fc*f5gVY zD-+aLhg)F!auCOJf z5LcQrR0iggibFeOU9Ps6ssIswrPbw_zbdh|wU2sC3jr^fV z4VlcDaEnmg7iqx8HR(5pS(|3U+m#(Z*N6>`B`Gz-*3QJI3yaQqk@$U%@sbq{YN#9Q z$YI;E;hD5AY@(SOjMo0;xsdDs`yM{G^on-1D;x3IE|(25)ljy0+KuiHY`jSiiF|cI z4Yf-Yj}3ieLu#3!e9K!k96BGbyobDN-||r-URFUJYmXJL{Q8NFp6d_nC;F?SYH4@N z{nNzfQ=d0sVYND(pM?M2eS|zew^E5;<210mbf$|Y+25Zjx{2@fHK4306W%vS{3}Yo F|35@coM-?5 literal 0 HcmV?d00001 diff --git a/spatial/data/regions.shx b/spatial/data/regions.shx new file mode 100644 index 0000000000000000000000000000000000000000..82c5679e7875b2079d7fcf2a7046ac2f7ed886d0 GIT binary patch literal 124 zcmZQzQ0HR64(whqGcd3M<%FbWN=j=hI&y8A7V(?k%JIm(+26&Vxi|($7p1QYadE`1 Z9YxfLfq|m|h_^8?uxBtZ2q*#B3;+o?54QjS literal 0 HcmV?d00001 diff --git a/spatial/data/salezones.dbf b/spatial/data/salezones.dbf new file mode 100644 index 0000000000000000000000000000000000000000..b9dfe7afc7bfadb71bb83bcb5e98a08e76853b01 GIT binary patch literal 722 zcmaisy$*s<3`QGVjET|N$wvTxVI*<~2hixi$mV3tY^lLAp3wf@T5((5(2WG ztU+F`2TyIWoBOjoyJwsqxR+lQUa7$h%v?Nb=ONVcu82svoBP`r_2*^bX5oWHjeU)M_~w>A@2l)!EFP zdi3F|jq62e&qSw3Z_vx6%B&uzB1Or=>RDbXW`fPN4K`bZt+;9DI1K*)#f1Iwz4EgM zw6q=jx+H?@^(iXhJhW`)Jt(Zj43M_JF7AL0;*C+klnnug&_ z`s#CQcY~|x^EEUx3fjVoqT`rV_CwfWv&HZe?T6%MphvSy^m<=-xtQ2Dv=s3z!Ub{&d5>B;$2uSyeg?H0~1_wzqIEOo$co=NqkNswAvNko($5ptm{{8OwRDo;xrkUe%X6S(J?q==N4l@=XR@S@D z0!!Sx#a22GaE+b)OgiKnR>scF!ha{PCD(%|CH4Y#ZkhwFZRNm0=(YUaX1-W6*-D-> z)j@dA(nWQm1kN literal 0 HcmV?d00001 diff --git a/spatial/data/salezones.shx b/spatial/data/salezones.shx new file mode 100644 index 0000000000000000000000000000000000000000..72db51858a4267ec2b20656748c2ef2a5dfa2f6b GIT binary patch literal 180 zcmZQzQ0HR64x(N#Gcd3Mwwq+hz|iVkk7~m;WGw7`SXBu08soBkWOM?V2XgqGtGg>Gra)P5daV9 B8L$8V literal 0 HcmV?d00001 diff --git a/spatial/data/sjCensusBlocks.dbf b/spatial/data/sjCensusBlocks.dbf new file mode 100644 index 0000000000000000000000000000000000000000..94ee192a9dc5d46283f3214ade52d8620b7592c0 GIT binary patch literal 28046 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 literal 0 HcmV?d00001 diff --git a/spatial/data/sjCensusBlocks.prj b/spatial/data/sjCensusBlocks.prj new file mode 100644 index 0000000..747df58 --- /dev/null +++ b/spatial/data/sjCensusBlocks.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/spatial/data/sjCensusBlocks.shp b/spatial/data/sjCensusBlocks.shp new file mode 100644 index 0000000000000000000000000000000000000000..b1816bf80720ba94e2c6bfc022022228b808c600 GIT binary patch literal 81580 zcmai-1srEp)wO4o6h&+-L`B6e>|huSOvJ!Kuu#MRL=g)yP{hJOu_*-$5k@qrJ0ANUVf`}$tHfhpD5r-2{;hNr#hDDb8?Jn_xH z1%L93N8b5^;4^-<=k@;te)&`Px$-4=_f>xR!&_eIgw?D5defgCe=YD`FS`FGTY;(7 z>30I3vHyA3zA4zUiuZrU+itKu>HqVnFF))aq_2480e`>k+`sW2*LVW>O*cR41GfUd z=`&lN@MQ2|-y{KiiF0pw=n>$fSAKN;OM@S|*@JHL0q{msdCK?MSKRbzH+B z+y(r_n|QKn%j{6`j5PpCwE=5+lHrIaVPTI67g>ce)xVn zZgF|=dOv&V*1x7LKlI4woP7t%cZVB%^9?@*Uw4;ReCm(X_aztX{^uWqKl{%UpZR<6 zr7yef=e`4;F7O`k1ur`PoHM~EzxSd)d+7pGi%UNr{J|GI>-6`No_41_fBS_`uYM2s zP{en2uzl$#r(ffozb^XL7MI`iUVi}Z@%~@zdlL75@&2DY?ilcwHv9aCPX^l;?=%$! zzxDPMoOH|gk?UM?las*PPsgFYn?2)}@46%JQ{K0|CXxle`0L+0cN5yj{@VSQZhaB{ z+kD2sp-24Xra#?p*EJWROI(&`Q@5w?x@Nk{Uy$95gH>GfGwoYD|LVpc;a+;h6+Xnh zmz)jFdU-j1DLtg&l z-(L;NgKreMj2yJ%8KfiJt}E(bl_zVFFf9P~^2gMBUI68xFf?|Iz!NYA(hXMBO5efs+!{73K`Ue6DF?9X?&(Z9gQ zeeNE&dhr5JcX$r?!P8*8@3W}EJr?P2*yze{*>#c5C_<6{yMO-R8J9i&uHaYg^3U!6 zHu>M;E4RBh*#10Xzb!a=hV*}a6GaU^`?Npb??+%-A$-? zJ(Tvp$Ae#Z>u-S{dE~dY`7QWof2Tu(zj=KWF8BqQo3DZ|vCq3-at=6p1N@vlKl+qc z{}&uRLi&|Q(NBJ;!Ans8O+S8<*Iy58`LtW3Hc#XJH`5(H$@sYOldufnol%2lfqT58 z0bz;JXiT0goDd2iW(u{%`xBJ<)!M zwJ&Xd+CFK|v|nQFoAyP$X4`5X({Cv+qv6-TqJq zPpG9&EpYVF0w0M9Iv#9(TVv+l4pwi%2A*^@*!O<}^Y&`6dNjNcJnH!(^u3SW_qA7l zIrz#q{_a*AfH&C+CIhx_+8(CQZO>iYZ~K}4ZJPIqr2D?h{C>NyK4yXMIR#%}`-As? z<6bZ=(jE8qZ?w>Lzl8jHd@y9z<2rf9*~zP(_ruTckIftoO5cSkJ@1E4W2~&TQ8Ugi z%QZjKrg&#?@0gMQ;oj-C9|xa^7*~?lbFYn|1j9OBwgDKcdg7bGu&Hlf8NBZvul)71 zz&C@=Tn+s0_n`Q}(IemwfBTRNb_ajw%;)ZV7x0fn;!<&KHqB$|KQ=T$R)fMY+b{D!DxviUQBxUGZ>cl^ap`QEp85e0JQ4f z;H^&i$BWLV{^tL%=|JFjef5l;f5rP-UWgEpuRM6>KIA=e zzY*8`Zh!Buy>b`QzWkdZf~!}({f!WB@CGxmc=o5;9`pT=gWm@oIT8H#FL5Inw)~8@ zfp?>6KM(%P{eJYeH-bmaeHA>kR-^;pvN zKhFCQ1a^Ucj{EUC%4hoVcO6T&dey4SJmS;e;Cb=5F@FY!50HM$-gmgznP7V2;U59t zY!n-K+=440$MiF>?cDgPqc9igqfWm9mamHKhmWV2-z8lhX@2(Gr{flFMBD5z#pnH- z?)cu<><)f3?$D{=J-@flAuk8N0y_D1ux)AEVZB%0i}c$d&TVMR$Pui6)&5ueXYIeW zf2Vx)|Jpxn|FQY`Goc?ppuI;7ucrK~8O}cgubc+4{BhZ|mpQ->u(U|F?Z;eVB1h+Zxv} z-EoFD^SyIPPhf_AmvIiZeqz`#RmZ-py^QjmC{nO`kg^VhxYtG+~f>=F326!&Lf;|!?>_#)#Vk)CpcpN~6y zAo%*56G@^!e-SJ9II#UuUC`qly|E$J>0?hVTYMUHjJ~`+!03%DaLw;5XvJ&rTja~H zBuw-!uzDi#Ca`+taKbWc=KhH*Q7--PpW%k@08adXdid_>NAP3s^tio#M_FQrz!R=J zmir@L@N~QHgIkW)MLBmnbUW$i6ZJdyhS-~qLv);?;~4tc#yOOoF&pujM`NhzXE&Na z2J(nq0FSx79T+cij}_pSFCyQFD|}NQ*SaP4fKT{nLUR{g%X{RTrcHR_apW7G%)RQ< z#0$al!y_L{;0vr@mN*6YCy&4Z=K1&uVBa0T1RQyiKCJHti~EfanBRnTeongYw=Tw? zIzH9$tM+#%+;k%OslVQfJNFi_`sB;cA#w#)HnA6Ac}?O7VEJ>)3z=^`-F?Q#gnZ9} zgTzKGIGeg>#>eJd^OIkAZ{E+dHzAyM7y2_%#+Tm@96tw~_!T(u1+edWE8&GR=-*=B zHFWgD+^?Q&KGl4y`B?L{=5x*W#LBJtqWP_hUp60YzS?}Y`L6Pm|B9P0D{q=$<|@`q zyV-};p^+tX657aVx65(O&ouc5QK?t{ntS!*$K5&~e8UOw(k}65=|ACX;Bm{g1^X`F z?fB{O)#I#K;$Wo955kwg$|~^#>MtL-<2ce_-{0~>q?>T19pt=nSYs;2z?bddd_dxn$n|W( znp?nsU-cyhG~>hhhkKm5;T_%xZhqYSIr?hBuPuxGyZL$Z_vZJ_|Jy(4_hg!b(Vo+-kMV>k7C@9~TEwz(8IaedPBUa)?Zb=NK%|91YO=Qn!(qvuE3 zepz1aTid_3k8MAdr}nkwPm^4NYt^))_u4k<9(B#Mnt)6`3yuX*|2)?58NS#HXe zII~@CE53mnRH&9M5Kc51cqGc%~^I2o7HYXMP!+xG6Ys3~>4ZIB|?g zUt1RaF0A7db|ziFY}~m=&GR$g$o>1xL=-so1f2N}uyH^2!huuZ@ndG5nRc}9`Z4Y2 zv>()dQu|TuXSM&({zdyA?Vq%~X^PFbV)q3zZ0y>*m&sQFXo*@j=O_48i%5C{vH*~WbiA-~MCft}ZR&L{w|`M3NK?WMSm z8$GB^%-jI7dfWs>u%X)2X@^U5&CfLTj&U#j(F^{>gcQ%3mwC%q+8(#PZhPMIP0oL) zx18^AzRLLv<PTV-+o-b^N_1L+Om&a z$7s#ZH1i$x@l^D+&qi;9m2>9bz?Lg*1-9JI$ICA)i*bgILv);??L*s-wl7_Nsx+o8 z^ATB#!`dhLtv;S@G;$cDIX~0%|FXUTe=hz3GW^_kPI|$!7I=o+0pJ&0f`}ODnRf&G zu8bqzt$q!U2dn=RR|U^B=LI|;KLM=V5+?=Qf2~Vn>(c&e*M}-j2qJQ^@5NW=-I@DF zx7!z&a_RU~<^{Od_PjOACEmHf=B56+*X7WFr2DR;Sl)60IOCIdcR%iaF1Ejk?Qhn_ zvd7;ff8$;qKkxb=6IA`m@HcI}KI<=7g0Rm*myKMm#WlZ7r=eFf4@y0J)_OOuZr>ZiUqO221CU%s52~L0H{#mZF zlJ-si0zZxAR5u2v9l+LKy#53%=YFQiUO>9?vVUa#!J@x(|Dj7=o-6v>F_YK>dC9em z-7fXF^TF~9@r8PaT6sO}R^|o4@yn^NzOb?RU0c+U-x5 z7}qQI&OVm8QDmiWW1pRVBo8o6zVCX7jAx$ByyU{qBErA_CiG|X&b$;@y)@?W;oxh` z1USz>Y8GCA_2Vp?{lCXYkDnf2J^tEH>-tdD2_@|@Iom2@)5hyqR~We7jBn7aThQZuua(D{~!j zVgEtrypPcJ)3`Tl>acNgppo-9d-H31=e^os`UV z+c-|yJpT z!nOCv(Y`zsTv&wp>)JkMet~hLeeUv8wJo?ZukW+gO|G$&gY){{Yg*gsw&VXlyWc#ac|`M!<{`~f zwCnPi<~hxSnkO}nYM!NR&2GEvdJrEd(KJZe*)Wawnk1_4+>8Fj`w$Yslt|AhfclIFNr-|W0b|zWnQv~ zbxgf4$u+-@dvsi+<0c(fF>l*5c9(bAevud0ICj>tg0+vnKYEI?#_wE|J@c(#`I&WN zwfQ4%hFrXVwiDbMJj)?BsM0ctK*++G;*>oiB-RgJzs0rl*;i(PBZA|7hXuY zZSOU>NjCt8?@{jT%LBW9)%BD6&%&ogdio7GYk;_4xokKKrNOgJ;BM5T(#&; zj=}){itPsnfwTS&oONm7tY1Uc+syvTlKN*EfWZ&Hb~k zndh?(gZ#t87VpbCK;)Tq5ZoXB2TsAczuS{0z6MwHyEV+dlUxm$-X^s`U_azlKqKb=gWMT`nqkbwx;!C>(AD&t$*83Zrpx$^Q7ic&9j<^ zSzmct^SI`D%>!G$w9z%WqUYpft`Rpzq|d(8bEY{Sq7UGgKHGd%+${B~bbP4e zM;%}4_*2KHI)2sht&V?n{gBaCT*r-`Q|Cr!(C5@u>gFPzF*PgUq^!@5h%j@&jRlU0|y{z7Dz25Rb zRM+B){~bRGA6ePR)#c_RSN(6(^Ovk;Bi@x9>YDa~VimprF= zP{&`=9=y+SY1!llS%*%#wLiBqug&<+_%&FdO8l&aiT6Cb-XTD__($%+yJ|(4mL(G^^}jtPoMa}#G@%!`Y%{J z8Q&UgUgmAOc1JtgcDU_y+nJ76Xb&u_Wmm3UUaE3E>#a{O_t1CHS6J3NdY%3|+uCnT zy>BuOALBav9>Cc*4K}Z=Hv}uE@L_Pq;o^Q)eIN7%aQHOo4`tc#*Z;I!taOmzjDSFECBsqaUme%KkBUl>5bIyZf17`?34f<>TyX zJ>c)8`|hUmh@uu))uy(BD7ji`F(&eXWH&71l>65z}Q}o%T z9E=wluMD52KlrS9WuFZ7Q2*K9t^Z6{KX$yb=5JYgoLC;mk!4rz zJr2F!af%FX#1-D4&a^DrZe#Hy2YEx={p{~w=<`p1gN^fGc|hx5-zER*IDhj5%Oa0x zp3&u@s5j<{9n&USXStX*Z|Ws)khj^7!+Wr&+Odp7uz8uc_O|V@JkfeK5A}WW)aJ34 z)i&{d%SX{~!WG^ir!dViCg+%X${TvT`mB6uUE|e$)z6dlO}UPk{IxmRGsT$57RtpO z`IN)>y=n2Yxi@;8d*9D#F!upxodtNd5w8NfF6?x+4c{2-y0O)>F&><{a=-7kEZU*A zkL{miA2`peuXCOVSbHi~fB$Qats&j`M0g}vJ@Y?ow|pTuaRbU1Jr6$kAQrrVyZ(sg zW?To39PQKDONdTYSEw6Cj@qfL13}Mtujd5JGU;3Lta;gwn#VWKZ$F^*l4UVJ)75J^ z_k;4NkLP%e&yHT4jTMw9^TUhscKNB=&AH+yYBR4jixZKV97~%#a?npSP5$LN@0qT+ z7tfwccuVevbO7l&|A^;}b7VdYoc(#EC$0rHZl3*>;5i28 zi=@wTrS+({b+P|6KWP5Y{G$0s+xO<1Ee}Ms4OjY?bCUK|%eIuO{mV4V?R>#$Y+Kry zdbv*4ah82x@D%lC&XWS$KfXtJ{UKoAZCRo($**}$^Pc8K&6}E6b@`FOEw~;u>c~tYP=3)JQigatP_`O*>!kok$$#M#97+EZ02U8FI z-sVBxYkOwD7|)tl&W8cdv2foe@2rO#yfzM>`C#7d^R8pnzqD-XgZO*gf8n^A3BN^I zo0oNYsmg7*?lbMDZ)jN^!{$Bpp3Tzpi>+mR&Z&mKpdLPJIot2-@o(Phhwwo1^WB|4 zue>c+%9%cZj?A0{?^b6jlVv$gQ=ev^?BdxSXTkz(pG~`f^;3M8&$mAA{3+w@xXvAU zy0?F(CANR(zip(pV#?`0v$mhvUx|I3WB4vd9dq6s<;prR^2)h{;DiOhvE$&JuLeH# za1I~@`|de5>Hu)&7f8>3Nbs+j7W*c6ju|-+{3(vXTA%m1-{U@`n8DU1_6+Pf1hHRW z&l!k3z~K?(r``)s1v`J#a%(%-cCzhg+u62b%`cjNG(Tzi(=@l|I(^#FxvtE)Q8#t; zvK^gY%DM>VwKD(3y{Q*iKR5LT=eP;d)1SaOhXI_upkUu6R?e|2q-Q+^_lr4A>Z$vH zvoCe>%LK=N&eQcgUeELOJYdfg_B>+GGxj`W&r|k1X3ujfTkT)?4)swVwtQ)xJ8&H_ z?W7MVr&Tt_zGl4XUzw)day}&Qk-xehTz;GLG)R9N$Fe;FIcNVBde(ROZuv<2r#&wb zeZuqBtLHy^el&WB_d9>u^Q+NcBd0khiSpTJouBP~(e+0(cjSuR(&v~htJfy4%zZ6< zmZjb@ZH^~9jC+mi=x4;Qc#dk=ADsC)@ZXq@cnUcCF2Kt92b(Zc1lI4J z<1h{a|7y)`u6cLvpW}yKw7{A31v_4{Uj*!U@*FqomUAH&&%5u~_vxQmzU({We#fup z#Oc@ge9i-)e9BV)v;8~s*Z*t(u>D8nt3GM@(}vq}9X#Vf4yB#6ta7et$4$BB*Y$G$ zmi;I5ywp46pL$(!1|rzJCqV-+t zL;1aWL%uFA&N^_)qaNt;Q?>25b{ILx!E94w*Xpp51BYtm=RBU}d?&}+J`%p>v*snA zYyZr=2^|DxduPiLTSXrs(#o@Q~KXKMGFL2JE11mqzH4$r<#4T@{ zYkRJTPrEtim$M<@l*Sy5eN2Dam}`Ef8DDb!#NRpY_@6xMzSx|{4fdQ4^G>{;`9#xm z?ipAfWm)Wx9q;V-Q=~g_CEl-&b)z-)2!S)70;&5Bxpnkx{Rlw+1#n=Y@gI+jpri zdi=Lv)qYp|WnCVMdKc?un!bs?$A7C=`!N|ml-vHD@w2Fhd0Wr+TiUPj-P*nOi`sAM z@=&L{awYy|j50AE#=xCtL)v0aefr@>T=VPxAD+d%;p4QI&)$4~;G9oQx_P_*agJ}h zBN#oex5Av#(L4n zPurL?|B;{E(6Ke;*m?@VuX&-^`4i7G7SHkEM>5W{z8QHvViu5qjgRLXF0lS|^slr93Rrf*@p&Jzj=P}9A|twb;vYkOi#QW9x|VSxC-@a9@0F;wz6$HZrX9x zj=PGD%QoL^KH7Y>`E2uD~;WS)-kV+nI8ks=O|uI|MA`GiMB8OKFWMguGn*9ERF>^`?B2HbJOJa8Sn5TpEWOeM&wSq z{$O|+So_}mKJ7xf{J;H!_8+=D)ahPa{~NEJvrcBruZ`K+_O|u3hw)m|>=!xr8~OTd z)|-%*=@Uk{K3KoKc}(}K&YxG`n=A4+E#Hbjm$--0ww!V*|L!N=t6t1{0LpD%=54vV z|8~FWe%1Z1`(>AhqVCAG_t-D{oSal!E?1a(xqiYlIZEb>;2H8=dBziG!WkK*|B!Cp zzRU5^{Hyty`B|3cHO+gvd=&jY*wLFzJ&m!PbUD1wcW^cbq2dqG2J+*n=PdG`U-v8T zoo#$~pkB@kWWE{fzMHH=2m5@!o58z0uh@6HZpU=-CLE)35uTsV8eNlqn|15pdBBz7GWUoc!(QKpwF1tIUTl(z6e1@w|4{ z_t}55_L%p@ujl^kj|Urf_uLz?@u4fs2V~HTwvF+yj*oTxtmA8zU%O>}jn8%bPX9$- z*m|M$M(Y*ZSG_}**@-LqOkFoefOnqjW{37y)Z}@EXxq-7Dmb}bcz20%0 z<|my$WxOv}#(nlqGdDAzdO3x>FXYa%hlVy;j(gX!%G<8PGW)CWZ00L?*1YtC?>ig+ zNmrk_PQ!A$PF8=#bmP#?+b=BJT3-KkK0mSXqU>Eh>Uck{<7V7D2bHz9jKw3^F1r=a z8Y7>2y1t~>hj>1)`Yrrz-pg_0=Tq-|rv#ku7lB<*BA?~-_1`>%bor#`6F3gtx03hp zyk$#$z@}Sv_sK;5q$eNp&-r#>&qv62zQEz5q&sevh4XPeUu5~6FKBrns{3<=-)U2F zh6C?X*Q?t{uJSw6v;&F%qkDa}?W1|iv)XQSe!S`dTnA5k$H#)3Bo<41dxof7XUb)~ zxOtKHs%LYK^CGX^=fHY!#u;@E?*ltuIiC;M6Rcj$`PE?kALCq(8^33uUbO7$1LJD? zYd-I|Y9811p{hG87k%ZNZAjU(j)b*p|4lCO%kZnSu7Z1gRzJJ_@b=T&ukJWk$H6*I z7GB2t9d{k)>UDwE#qzoD$+~uZkjVq#1shF&v5)8MpW|5TKEZe7qAr^L;(pBd-jpl$ zhrZ={{jBRpPU=1NwR!7L_jig^ut%qArx1P*-fanM9cFxO~c*+E_ zs89SoaL&J^zVWZYj*skl1OJB41zvOd$$ak%oOuuK?{>)AbJEpkS@!|X`QY5|ImF=y zVA~?+Cxc^$xj*)owsQa4UFM)uaCj2wwq?HW2F`iLq=%<~!>`D%+moh#5d9*0#JQN9 zp~}4%a)z~YcGE9z#5F(TB$?mgUgH?@IlrT%o;FUA^X8G8*tkWx!#rzdJ6|aU0`2`YU4jj`bCH+^FM99d|Nrpk5OjN9g%Z>+5_$^Tp$KGVhdJ_zpVh82w@ww=0uDLS?H06*__jkGR+RCQP7Vjok->Kn-2mvS*pzrpW7XZ;BJ zHt~4$fqCgSnC|$|kIZ*Nxj)~frA;i0`lZK1`x%ZW^{DUDPia4<{hY23GTDtQ8aNysw++{Ox zbjqajIp6KT^GWJ$!P(yg4i5qUh|dtd796_-p3md%0gn8^**6c4-T`Mn1laSSatLVI*6)hn3pQ@#K4JB2_D_(mAJ_evuKozF%#Z04`fhz^=hSChY{WG` z(~J|e|7c$FjP^e}j@NO%jyv@GD8eJTju<-_-9R1lOx$zU=j%9N#|f>AJk|Cx&e(Ctj#GBr!8n2Z zpzDul9>o>jA*ZpgX_MvPBS(3MY1-@NKjvjTtmAzBJXt@Q>%hrh?yZdFsLEu@p`X$G zID5MmeA#`x=4IZao?lOUiseV`C;W#WF$W-%zx~>>Dc|Pb&Ci>^cloK>?p%q}%f-`X z^lQ0-wtnQW3D^8gYaZdV=A|BNKcoGS_EVZ?G!JQ>BCn9gbonUqW4NMs)Eyl=QnyS! z)jQtXI?8)H?$mLqj$3tHtK(k%K8o^KuKlN<%C)sM8H}ce0Nv`>sX8WnveYWj%+wr#Z%>yip^=cl`JfnF?&mV<{ zW7mvZ_WV=NPj&sM@}687Cvx$uDWXj~=D8dv9e>I^Iq@o=H81^!=Kbjx+;2Rk*L}GT z%JeRa*!XP6Z;iLwf4jWY`SD!QYmOnuuywKQQ*ZT}Y1T9EXFU6C>x0%8txtTn{#47Y z-$zlNz;*caYjw9ijdNkka?i(+=4YC7ZsFtjr}p#2)4;PV>S)?N^Lk+Oo@3;9T;QxX z1Lu1c+;6(^OR;t>-@M~~an7#>s~-{vSfpDw?{B-*{(1YmU0+1-MEuGfMs8o<3#&xm z%bE~;lR0AZALyct9k|A{_qDm^XPWhLowW6iKSN&Xhnx`xjy*#z`R*h*-_r)?TtIN* zzhL9?oMir@%Y*HwnRfvj*U$c3aK7)r^V#1^**z!1y2KA9T|dsc>bHthFP?WjVZK{K z{^n5f}>T)X4m9T)GodB@eo+FxKFpBMM%92)R(pCdrR^DS59q1?M&y4_lyhm$3(9 z4bv{3^WeQLmyAoEZC=#8sd-iNuI6RUdpe%maS_XI+{EwiX(wI3XS@IMhqt`a8hD^_ zm+a|7?#e=5r@qMEc+#DxvJcyi-A`Ixh;nbP#I^Maqcf0Q`$8jkv<=ip+KlQNb z;++3Lx_QrXsfR4?Kl!~Ju)Vu>o9T~^Rr{D+ zT247~*@SC;E#Dr;J%5vLHjixH)&6b!zm`oN zD%O6A)gSQ(;M?jO_jg$S_=lv669-@5t}ils3fKNKuGDSW>jpP6My;-#{$`xOG|Qdy zVbFU%>%LU`mwBrZN1!jyW`;T~D{%nJ>bvw&ym#tp9Kd_^ zKiWTO|E2vK^Y(eMe#E-`C&yjB^UgT5tXTuNz%4g%%eCchyLA1i`qS`_HlJ~jxgN$$ z&X!;t=##kCWaP9Z*ZlMs^gr^QW%zHtH^;N?w~w6xCtgH)&Orv}`=q?<)^p%HIQkQO z#>T7&0%v_4ICcaaJqwQA0cTze{6CN43lCuTV_EjZ?MWAN`rY|Y06VXi_|5`b_w3go zKlM%Q;sR&?EdASb^-=39aqBbnM#l>~e$erSjt6wxw7+KiSibi6+8-3_FSb8vezrGV zV1KUoFUHE80}Z#wW?9$iH~KH8*^XIX#=RNe$T{x?n^(`b_I#}N+4C3mtrGf3yA3_E+1V?ebCNXL6;U-fPT8?(pC0X_~wu=R{C$pY8XUw|;f| z-R+mRzt;Yo{N8cVyr#=X9iPP&K5y*n{y%!#8$UxEWQ{mwSH{zx^7(Eb@AX;FFL3=u zcs_Q;@fDs0&iZ2Xbk@6rjk_5)vb__}BR%INaKB~s{*L2yoUh}6X&>@4PT2ja`&-u+ zQ9PULh#9}?5_M(D%-Gl08M!%cZkp?>qK(S4>*1oZP0q7^-AlV)=RCoTCcU< zvo7}E_RHFDYd@#ghxhvNu0NtVfGhnkYsj$m%BF4ivj2In_C!A>`_Skgnb#q&-yKT; z3fz80`yK6kua zKK)Oh&}X}@Be#vY=GXb~)u>~>zj)927kqR7^A@=C7R!VCT`l)+mwrD*I*==RR*q~v z`dw3xO}OUgerfOZS>x^(Vybg(+F!gbzTSLZf53XSpWS5>Tb?f86q#$yw3o3bIdyFC z!e^R#@^SS1a@GuKt_u^t=`&lN@MQW`cr)qZe76>C-ico>(qlgs>EGF7#a_={;G9Rl zz+F~x;%~fPEdLNI=Z?#D+^*w#9rx3pHNW;JjmsG~QkL=?<)!=(>hrjwZ_LZObRU^^ z(B7HW{mW-vZ!OL_0QiIA%!h;3^J!eV0>zVWYcW~CNBX8H0rX9e~=NO|qlOF$X@J?(%2j?7lu=3(766gGt_Iu?e zIZ=xA$IQkau=2GpbbHeU4&q9j?~(J7PyC9k>7%Xnk!*|UH^%u)(|>aRi1se_hP>?m zowt6W_AvVxx!>pWeM7K*yXiTHp0bG@f9>bAU(kMR`?>A^b^WON3%O2TpFeW;@z{_p z___^cY0f!v^1Na1b$p1`BRP+3VUL=hG=FIx*gUa$T=UiDv(0y#4~yl?&8NHWV&i@t z7tB6Scx?P(WXD%MKX5A8c6R@c?VNSNq>Izf7g%{JUqt^RuJCW$aNOoCd6&9MA8Oi3 z{%xB1#O~4meD*36I0NVVy_44*v3C1SpQ0Vil{l0(-?G_fj1zT&x=xuYqbaxhWlU4v;lIe&XU$9f z(DLr~==SRTdG#UK%ak*Fjp$Qvz7)H3(W!D9W3^Mx>u}Al?QZ5HvFqCDtOF&ld)_W~#03eG-5?svRd_UL)i@gCOuEa}c0 zX5S*%?=l!4_W7LGMZY%gp7reDpB{g$A3vY`V(ebDm= zJ3Nc#N9lQ%o`CD zi-v;UkiG`y1Q^Z?`0*o-{1#)xSl;wg{i3$FN8Oo7CinW@?AIbM+u850IsS~po$@k1 zP|Lfr&W-!C&Ia6NY5v^&y6tn@Z?Ssbx@i|ocl!j;BIe^dRHKdlN6=+4$+Czm?B2yaAkjAmH?4@O7sHfPGiK)dqgd zREYG%^TBhB(5Jwj7jozkf4S*T!TAn5amEMEhe5z;H}1DQo)eL{2<1yWmHXv`SejM?6Pwp5%teL6!2^K{L(kTmN(xI1fTMc7oC3&<^&ekH$1yp!?s z2f-%rtA&UM`S{E=_15%b75J1Co+z!=EX z!*ire%YJ0;jo#wf#yMAak*>UR&i>+E{cdr-Yr*rzQ}j14jK`dP2aas#d)Q+T$WOf> zUc{BMF2cHWyr<(q9WS!J@*T1ERc!qc)hoD;Sf4-C?OF3cU2JoGmXWLT52o24Jm*6> zWUhz);keFv1#tXp^7fn&-<9xU{=v3w!%B%W_hk@}JUCRBA&u$Nz=v7?NzxEkrt8A9-s{XbAnbvY@IhvPp zHQja)+fLn%V%xdxYkzMAWV887;f*;5Rc zGWO-zp7C-SuKBrNH{a9a-pB*KocIYi^EcqcFKJ)%)<13kvi3z4UKo=C(_{lOZL25&&&0^UC-E=HzKSX;NSNMh;Pp)epUABXK z!!-MEzROPkwjK1Z@;wCPr2l5#o*OGaalcR2M{>Vqk?%GiZGW=;&GtvzUu}Q3{lAVs zcl@a9j|^Xnzqrx*{6!t4F6fxZ^k>ga%-I3xv&2OiH|oE{Wx>X8_22Kk4EBBy2(MQeq3Fe_6MDqm^gn)W&L-{L3`?w%>slyI)ng8JALSIX8-OtLL&V6RaFB zH4Bcw+M`>{1nJ?6_vfJ&n^D z7wx!d$5lJ-+Htd;Iq*? z3v9e6aZB>{oY3rV24`-bc*h^lIrF*uf?cPj9giPKy8SWxx54)J{l;+{ymtOJ`%1wd zIhnv6`MK^)ePaAZ-kN!O?stAMd!xYW`RpeLYX`Ew4Q#(ucG{7SA9Z}G<4+x*>iAX1 zw>tjS@v)Adb$reCF#gu@xo%&Y{PkRiPCwDdc5YRhsEwO`;{2#-%F*vaow^|>hN1@_ zG6V(xTsz?YTieZblfEnGdT@XEG|yWW{r!#ybiAPB3GHvUy>5Hn_P*;!)!)Fi|H$b= z-LzI0Sypx5$jSXcIp+yIW$dZ-*oAqGA*J4}2U}0J9&J6_dbssM$4xA|a_;g{l{a$j zF!eUpu*GaPpsf1x`c6}C&kgsxt={Xi#*xH6YhLPG_qF(Z=f|tw#1;S2yt39Fogk+$ zuPK-QrTOIiIqns!zr@;8^Nt-|+;4k&zvb+5cfC3u((#h^7u(O)-_#G+e^lRDcl~(Z zuYR?>%1W#}5Y?Nxq7NL?%0eGeUAWW-6J~lZ{93*3cYTce%eSAm?_FN=C*)|}>Wdz4 z-mhM6{@(o7vdI_X-%uX;K;i=noNtPQ^?%*ZYF#gT{9S+Wj75FAe#q!8*w+;^E?mQs zHOX&Vy-J(8l#}byOw*ov-n!4at~%>vkWNebO+0NVsA`SNb`HaiH3v67W;|?8{ z=(t74H9GFmvJhKev9inhnW_I;SsHhcA9x;hi{dn&1eo%sV@0BUe!; zYOAK*oOjk9nC89ef3ffJykoKFyIO9~Q#L){ryYNL7Pe52aEb-qY64kc`^7K!ML=N7 zo^_0ieq`Ou&-pCptHeE@W&OIoh~h}D1J~yd*CrTKlhes1MsChqIKPthi;Rt&7Y5(U zxn_euPKSplnU{HAsK@5pFQgma%Rc(yRkP5I=SN*%7HnLic}(-1=9`vXKI-~j{pKz| zRXYm(f1iTZZI9YswLNQl*Y>dOrS?X9YFlY< zwLfVG%I7{L<#XZlr+oX63y`1o?2l`){$IX>M7s7cej_;N0nz?q{mIN%lAd$&NY8#; zu=UINO5pWo0WRtJE(2KkWV#sK{fn-5G}ptYpW4S=%OOXTgH1nmKHoI?Th_5NUR~#r zbq-+jGH=IE`+MyVHvg0F$q)Pe6zv$U*jeZLlz}lnV>wd~?W}28H${6UE{C2Fr@w;D zD|!-rDmK39{icgemoJF3f1CGNR{3|w-#R|m@w<-ib^Nd6gB?HY_+rN&J3iU*OXFb5 zR%{$i`5NyLD<7KTZCq=n|7nx;J#I5j47N%eJ?-W^O4dJ;=Dp$LVDmLyzMge0q>D2L z2G-7I{tT=gv@DG+i~ORo`86MDzS4Zgx~eBlkH1epkuQloch)$Z{K|Csm+4~VrF_JQ z_U&BzPdn%n8iO;Yug^H`VEm%}$&TOKpN;Q#{NM3l+}3w#r+wb>(c`7dn(xpLADVzG zax-1r<)tdea-BN$)(2F#ItQxHIQ8}%0@L&l_Z$O&Kd2w|*PFsr#-E&XBPd6{t1;=b z5eJ<0q+s9W`N@gnqNlUoi*)U9`Ug01U($09F*y1jeA+v|ddALR?M(KsffHBeed&+j z_-kPIV{6yapGnVmtVs9y*k5qYH74CY(f)Az%gR#!y8Z3;$6KC=`Z%tWr(N_#l$Cu~ zUuN3HbJSuN7{}UIvE$yne760h_M^n|>Gs1~PqZFsJ=1!~x>&w-=`qKt_uG!Kb$K67mo$kH*RiQNDxggps?tT-zmwRws_!T|eNx>iwQy>G_wQpXs<~^K;*=UTA(F zy^o!i|F?h8{zJwg_v=sO`)Xk4A;NFL);(vWf#tP17i5v{d{5gsamxqMy%Yan^O3W< zUXIp2;>dYRuKAf}x!ARK+Mm&P>V0wQ&$!JT4(X{MIO{UNTh4(k;C!jF&oLWY(_ej`vax>avXjOEyx%_B{%!le z?H{-Q-2Qd@-|e5b|K9$+^|yTb&mBKjA9%m*O&53kqgd!hY#`NbAz&r7G{{+Iz-}zV@qjVUZ5D z&$8)TOugNY-}%JvrQY$Y>A&t*Ffa2q4$*#o`!T-TdbQld%C+U*<)i5DK`&(9V%0e9 ztU=1!r=!#V`@OibdWrkhQ{$4NSl z(s7oK!*rY`_J=qKr<0w!A@xta!1<0Q?UVU^`a*agIOj=$^Ia|4-}6`^H!xoT`rLO& zw=ZR14>;ehCf&Gz{l_?d*1?f(+$s7IoO3=YPwWlYc>wRvJS6GSucZ4uRQsd*hQ-!@ z%|nTZaDUD-<9YK_-jAQaBk8v1eA4w?aK2ea`$s=d`m5O}0k%F2k>j~CZ{=D(`;L7@ z?y!;@oyYEe<~h3R&Fn|#J@%8xWBTEzSHI_R=ojCmKJRsfz3$L)BG2x1i;26Ezj4Q2 z_vkn_zGmIjKRr&mepLOvT;bjNBu74$FK5vQy;q-S4UfQR&%RP_TeqH;0mPNm?{l@kyyL=S= zeO#FzklV=p!inIT`s!0p=Lbx)z57}5fACDELAPKWb{t?`aRSF(#~F-MIIhL=GRr5w zGF@!C<)>;VDhKB}oa2=X$w8KKnBy*gH~eK9ioOxP1h!n}<-AGrndUpqhnkOA7I|69 z$oq^_WPKA@yB#|NcHGBagRNVa9~r!#EAba&gT}JG*Sd@xjK7$s9CFSh{#fdZTyoAM z*u4Cnpz|DwbC90+JNF;^bQlZRaijld{6+uI@vMKFa`3!mZ*2RUu0PoRV*8W6PrG7y z>~G-%lvjVX{n_?+yI*v_X?Y^*4{+@3>=_d0*?hE)PXKi7R?mUs+D64pGKaFZFDviS>KiFK)lN z{p$9++b?gw-Lh(5#QMdS$FfuO4{{wo?Ptu#IX``FpPhO-e{GsNxt|p~?mE8I@u!YY zb^JVvFfM^AZg&!?G}&vsto)~n8snywxf=R8T|B=-GX z9_n<8>$LQNa&`_rm20nzkx#u`r{%h#?9b-jod1tM<+J&Y{Q{@Gz~1lqnc~<>($fx< z+j(dGy?iH%bm#H?j-CC-va2_H-Zwgq=aoax8~40&&pY?LbkAG&ymrrf_q=$|oAUpD{SL%5u>*xEGh5BDV%YG%+zPBIOexCX3VSy1j+?%H~k7-`f?O<7Lr**ZX@9XkYwT~)?)?pWN*&{jB z1i38b;Jxb0=Be^Z`INj;p4&XQdGdwt=9rI@dAHAJyn}te{XyLNxb=1GbIXqmKE`#z z*kgT(>`6rD=Ijh?q+!&o-{4-o_1$*Sa5j!wJxm_v7aPY2tUjE9dEeO@G%NS;4VL=Ty7>J`OfMYdp;O ztn&lLcl|D_@#UP`!Sj~Sc$@L=%*&CUcopT>?nKXnJ%8TutgNEvXiP7A1bDY)Gq0(){-J4>yPp+jUmAJ6m}!koh=s}{O_wK` zuKh6GcekI_^%S=pT23uT<=pk5s-NOIbo7$3h{T#1YnIirja-~xiC&?e@B6`dhn>j1 z;(YfGY+lAAx}N6Ua%efV9F?=@-H8A8>tC+94dpp+2bde};P;t0>Gb3+7Fazq$7DT_ z`?V+DZ{4kr^`q*a=1Tm@*n`h{uXP{wVq$@|uYT3G7x_lJpHT87=ooQVT%b9aSDObJ^OMBdG z3^({`AAjqWZVb*m4_H6Y^UCFA#)~YA@g&<*tlxc!37nFjc(!!D1*|^$*NM;k{Rs=4 zbKDl#x_iI4V{yu&<=*l@RG;MvPjk*xn`jI|n=*2hrtos8e-pl=#C2^<4e06ve*!gVBu3UQGLhoyE{@Hj~?~Ca8 zN5@AxeqwyVc8%Vn{Q3hOpXvBb$9G!3i2ie28Rv3seF=S0eZS>6H_dUYkK?oLr?el_ zeva=pPGnqA9?@~i_Ji9`?($K`&vS(b7*oj^g!Bo|GSsJ;dddS#(?9BG#rh3m+ehs4 z9slY0P{)t*-5uKd&l~J^_&w1Z`F_u||15|H$4-NlTbGxroXVB>dblKGUM{NcRfkQz zjjwyJeq`&T)>p01THm!kRDY;1TYrd6Z@XaG?SE}oavmdf)z0``4D0?QKKuJn(z7m> zKG5|=6kp&9Pq1(2%pdPv#KJ~y@`UE^*}liU>Z8m%fYnE?M^3zpyfY6$y6@Wad;1*n za&XQsB0YK@Y`dfngVl%86N5RH=CRx#J%<0j?JR@=TNlS^kCTo^wg1ueqv~JeivEyO zIIiSCa+an3FilP>mgldYKrg(&yv$p^vMxT8`cO~rmk%{xYCh%rEvwk_QO7TFg(sMn zKF+(Edrv*(38vXTp3|ef%049gh7F#3*!C|WFVA_`zxmV)kA2`5Nl(0#^sJc#Yrp0* z<{Kd=%VOE=Ut;AdwqDJT|HF@2>-WgV+7GgR`bFZ7Q#cMyS00G!%Up@08iNV9p{}uY z^j&T5$kjNiX^w;N0`5&blV|hYVz7C6E{**|Z2Ts68@Y-ti+a7|MIGHu}`QV!~Ad764nERPraZ1cY6h0PnAS2phyD_6@ZZ*9HmysLF{UxL_u z3Dzh2Z(*~nkLk$lG_Ld?ZEa#C^ntV;XZ&b;m;J|k?JwHp=s%t{J@J_ZRv)#U&36}g zm;J|g+wZ;K{;FL!|BNr}c;fTCFY9%|)+KrgY=5?VmLC~>)&3*Lb&aKUvoDVv>_5#1 z&DVRy)>~}3&Aa7hxf0K%+~EtiB=^run4MK9tQhNy=j6=DMD&UqD}MHycT~H)~A5;W^aPywr0Y@9lVS$BR3jY`oU~ z)$!<#SGWFZ{nq+V>^N@ysVu^?sITV|+m7lxvf0n@f>2R#zCZPmE1QrgE6_18};ium#qtqx<}Hw`IP(a+-*eq9PtJqo{npL*=REjD`K=FC z{U+Dxqc?JvJlr9BB#z=;vnZXsw8<;E$GDSnFrV+-g&8rP&3ZZBqyOrABOlUJe$q2< z4!+h9d9XYt-@OF8zAWcrfphNDqHN*+;AhT4XUdv$≪|W%XAdbH>j|7iZrw`Q;pa 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 literal 0 HcmV?d00001 diff --git a/spatial/data/sjCensusBlocks.shx b/spatial/data/sjCensusBlocks.shx new file mode 100644 index 0000000000000000000000000000000000000000..aabdddcbbe8e075cffed2e954f4fe603487a96c7 GIT binary patch literal 2012 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 literal 0 HcmV?d00001 diff --git a/spatial/data/sjMainStreets.prj b/spatial/data/sjMainStreets.prj new file mode 100644 index 0000000..247496e --- /dev/null +++ b/spatial/data/sjMainStreets.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] diff --git a/spatial/data/sjMainStreets.shp b/spatial/data/sjMainStreets.shp new file mode 100644 index 0000000000000000000000000000000000000000..37a2609dbe293dbe8e57df0ad7bacaa0a435b3d0 GIT binary patch literal 71188 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 literal 0 HcmV?d00001 diff --git a/spatial/data/sjMainStreets.shx b/spatial/data/sjMainStreets.shx new file mode 100644 index 0000000000000000000000000000000000000000..9d15dbbfbf1e5f2fb25edf569a9924f652afd547 GIT binary patch literal 4004 zcmZvcPfXNz8i(K7F5M*+E$Xb;d4rJE@F&>EFK-@W)hJ$H1kcMPEn1&b*r0aofJdl0fyzga`8p-45 z{quR>@B33lwin8;{(64)@v|cQmWh`C{4GD&eD95a{d3LMzsG`#g^6uHcQ)VayZzVI z|GpawezpDogB8dGKi}~a@H5NLW07a3;g2G#Mqn*`2&sFvn%riQ=bF*PpSuNzM1E6A zJS|c%hVBq~J_L8bn6usTznw=v7Wv(MJgI*{=T|}U>i5DFyeqQ0%i^o=zyQ4ruZtAv zKKK^te#%AT8lAUCWKA8!Z%qy+;3F7_tc^hG*EYZuoOG>u`d-xj04ANI9-oEmRa^?` zFIInLm*tD~{hD94_`0y^b^0EB*Ns8;S@+QL>kBQvz6r)f)@wh0>*wH*$c7fv8}xe+ z-=O#49ib3pPRR2i%?D`RFD z+w&0L9eNM;+M(|mfDa-0oxa~r_uHv{apIGZzOrK20do-FU8?EZ6@~ci()VWIvgzFw zFeS3v=kM0}X_42$Q#-Z_Z0Bm`Qw|qANe_A7Nh{rh!)_TGQT;`?=8TBJG&Z^9Lr z5P3^A^>2OW%)<_m1C^!^s6TTL=)LcX9Mt!aKX~8b2cJOZM#~|7(P4;RblRzT`rp>~ zDC;2gZ|Cg(fz}fbCL#Ur6q|l03IlW&UKfdJKRVU|sgLQtw?+OG!{>XEKhL4#B7Z4^ zzlhXmeHyAi^J;Y8|BAeur+zc1T|f_ryw?Wtdr#k&f_h)->nbf?=kw}xp2lb3U6J?M zU;Ey_0}~=26hY>Hp!Iv8`ej5u)b|9i2~z)I);Zyvhtwa^e)5N^ovqFh=d^Rt_)*9i zgB>CtO}c&r16GNcjyJg0eV7y1{h1SAHr9tNU+?qkeO|rJqrU!$u|fUN4f^+mcQwqJ z{e|i2FW`zE7j>Qzg=<_r$L;59x1Qf`P~<70xb;e=_EL;MDI!eUthH zQ0K*=-=}HO@}GvBG0416`<+wHWy>eRFyIsF`|(M5KB0NypH)NVeWrP(-X{TdUv#p> zS>rqhc~^2AGB^3i;)jbMeTQ{l`VL=n<{|ZmeV-#?t2?6m)`}dNvHX!0NZ;pWray0X zJ?whg^&(_$bHsGB-kWzd>pse-Fc3K!h4>w9gUmlV>UzfY3S{3@(&DL{#ZyzR7mUY> zo$hzc{f@ccG4*4gmI8=hOA8F3?!)_9opmKvg=vvfQPZdNJ;YDx_hQ~DeUEDW zUfeTX2k}kkES~m#(mF2?`63L5;DqJB(D(d9q|NKwv>u<+1(rWu0hx2U74n|bd5Urv$5JF1=PN4{gs^#jPBovSR~>G$kx^Z2OMbGK6ny$^HFH#>(RKIf-lLZqt%)Uz`<|BE4r|HV4jUCuG5-}|D!r&r$-i1hmWUY$>W?~K*= zE<^V0bH6_K>r+4K`sS>zf0eV`>G$c^`%u?EYh?tfMN i>A!j(2K-l42y0=JYkluyk#BPr|5opl5E<6@{`5c1yB3T9 literal 0 HcmV?d00001 diff --git a/spatial/data/sjZipCodes.dbf b/spatial/data/sjZipCodes.dbf new file mode 100644 index 0000000000000000000000000000000000000000..c3d43c9b8ec5f3ed90ea698967471936c067e630 GIT binary patch literal 13250 zcmb`N%Z}Yha)#S8uwi3h!)vej1P9CundGuYlC1)|Rf41$0p1k6@%ul5zlc8~Ny$iKu|M=hk_z&wZzx?uFfBeJW@$Y{<|M~ne-@UQM-{-IR|MBJHUw(c1 z^8E7Qmk;*pU%u;q|MHj5@7}-s`u4N>|Mk26-`>4_e){nG^dIlk|EE8EJK)pPn|H6T zU*A7}QU5=E+x?6B|NQIIo8Rky`t9AP-|heW{PcVMFJImVec$i@;oV=~eR}=v>C;cv z|M2qFd!K(Y|MR<#PoJK?ynFllW|J&!kzI=LP1Ag59;pM~Y`{&Oe zpMEAE?|Xjp`c?D)^c{aSm;OKhjsD=@Pv@7vG5_Vq^nZlAZ=OCrfBA`gLVr-RAJ32e ze}DSz$Nf);59ND(4f?*9@9h5x|8xJJ&Hv}+?CY^F`D}Y#xBS8X+Se_5TYVhOx_Gs% zKBkV*y|J|2N0q&whrem(sW)S6)!x)zx>hd77(S-9UDNmVxHfHNJG92KoNdeIQZF(~ zi*1+XIDPe{m&0jl<=jtOec$)Z8^h?eH=_?NJkF}Ft=8I{10u*q_0dnCXFqt#xgPPm zjYsi;t(}Kvl-h%oB0iP16;V{$T6_V{a8|I$=5vp6HfQ6xc9#l7o`=uc&a#UGbG@asqE6e#o^7kC z1IMF_oN@FZriWNzu-53U1V!u6n1)oe(k@Xze;#0jE|m%)^V#dBuQ#<8sx z1IjA-*1hWBy9wCV9D5g|_XFzu%~8AaWGl67%ek$q#Aclfs(Smyi?+vU>;4GJU{i2q zDXFAWKxdq#*63=%ie<~j5(h`dF}Q^0I0;LuGBT)H=el&=2)ml0SWA_Hmi3fDZvD_Q z+fka6+qYHHrAK1zu%J5!@)$-^mHmpArHoVBY?6D(=GwjmS4s&hTxtNqe#G=zf+CFF z#aPC!H|SZ@0m>0p-j9}NW}mgMDflf^+NddOvK=FzD${nYRfBD99b)u;tksoo98If_ zj!oN2M>}MPn`=BekZiPG&KxrLU;IgdwLOrKF_*|DDJhkf7G1NECbNt=IJ=f?pp3WY zhKs35)_ZYjxzU)5YQI`Hv2{OrY}VLY0AMdt+2iP|cWu2PIpe@(V0~OIu zkkEH)9rIE5o(fYAe}le-cuMIKec7cjwN$whgc)F4j#KNj^LEgB)-(=)`6l@EJ8Zqh z{w5!3M&U3;MiAT<5|HidJ4o1V>FtNiP+$MYo~MIrh@486rzn;`jJ@FOK_m9 zYXV?NOk09)a5;39eSHC-UF2@-G?~y`4iffvCVJSEW1qiJws}^L;0yX6fvYvQ5MR@w z1~PMf!UcF2$UhtqK-KjyO|7L@nKpi7?4|=@mbP96x>K#}_kwg{w{||#uZ5{GTu#`> z`S6;^zii>Nw{-gFkW3(2$YjbO<%g!r3d*>k8FDV;7qn}e$qamezgYq?`d$Th#|nm7 z7b@k#C}m?GUX->qMI<|FAsx7#d7MHEEo-=x5mGxIaj5;Ax|!0%D{01LU?JA9r))*` z+xiHsDDqdWAhilc--KK3qB&h2ozv5P}Iwg7l_4y5xz z6{qHhzQ)Dtk@P2w#LSLc%oySYM)|tBLw! zkLc5SWZ%{zsx>u z>ii}GPe(;Ou)ER{hGh_YDgrgBNQnCgM_JeI`dii^e_>&=ByQ2Z?T@30(1!>sy6o*K z$hHytJt9J3^SRKW#Y}=bY2j{Ro=pYQ{ov@JV)uO`47V;!OGwyH!$9M}#1#VZj8bf< zk(1HSf)2>9wLYP&29yz|I&%s~k&z(a#ChKYHyav)6@;VQCRSYWYuL_K(zW)Cc8KkL zrQW8(WE>UviHY7_Fm@L%0%vj4&s>?+0!nECA-+0sfj2;6nHH!gVIXmF{N#-@@q`!7 z*xlEM18K~*;8~|!Y-La*z?Nw1A!gLFClVz9q5?YRwk1X6*-jd0<6Y*3gVW@^-gQNZ z;}#QQ8#xf;x^ZBpV@!@?LvWHpd}oUSz>3MvWAzx6bb>R{gELebLnyk+I}G9i^98{W zn-A0Rk=}|w>0XUFk1PTZYO9;zMGc&uH%fvxf)tfoB0C9u=nJm`oM)1>2qi zfdk?$L08la+Lj)Qu)&7|vZ9li!5dhGhoV^Y5#^(@MZkogrwPqO7i;Q4c|+@;!YAz--Qj;N1ImV9zQfK%~8o2f1d`|Iaw4?~hC( zXE2T#=HS$$bo$df%=9|5CzD*vn$xoorS}QG{JJT}%>mpKT7W(SEgrLzGnHdt0?rne)l$+kUGu7KCBDu=!92|jQzy^58zoOp6^G0_Ni{^CXC9VnZrfqp9(HmLA1 zy&r^>#(_)f)#|9WUp#Opoinv!DG|OP+}Si_16rT49T5gt5bSS`NP$6{wCOW4Xj|OJ zT;U==@#wRZ(v{ZvAXfDM_UB>-*@k+DYJhcYvI1g$0T6kS;+UNf)TtcA3O);ujSP$f z7YsGR#0fYojW0<}B_0qKne~Ux6Ic8G0FVel1r*>eMbp^(vNaTZl^SUhWx1X8gd{{a0I0s(aJn)f%4 zc|(UZT0Dp?0oQZnYm(I*?Mf1%OBCvn>a)g+NM8>H`WD zm?e!fR1I1|Z68H47g~X;=}oW{(@7m5B=at|(!nXKYOuY=!-w0nLrar=_~eU`>2GXw zh6bk;t5cJ5R^ah`E+HugWhALtckvWD1owm+(t&h73?q7&(YtR#CY|zLBQq)+OL-@e zeyC4K6K5D_p(-gnAyV-%U{y-|3>P<@IicTWKqzQgH{XsaHH`Vb7Q={B1>}&?5{zT-0a!5h3 z!QHt;Ls(I%)`=>L)}l@rYH0pzqBN15`Vo9;6Xq{7A&e5Z5le^ytCsmm zNZ7@JZIAF}JHtQq(+bPrz^y<-u#goI-;R=gq7J@5=F&?*DPeo&u~u`nhm2Im#2#J4 z;g$}8eI@{sA!zZDb(Pc{d)>&s6Plyi>7%c#6UkqE2^GbB-LxocN}mR|kG_oE4md{- zh;%BcPsn-=(A*oQp0g2e68U^vBDn;+wmszX+LqEZ*X_gRjR}!h2s*8YD;y`y1Re*E z(gBDVVE_f5DPORcOCGHX&Rl0*GB>Ahy34sS%lk2@4+wb)`{d<8yKn)7CO+omcE#0$ z;sW?(I&kSdp>sl+H~@|bwifOSgiwv(Uj$?8L2JaMcCRcA#vEKuAgRosdSe(evowY@ zRO|E%k8Mvp)l^D&p`pB|e&;0Fp9>#r1R@RXw;pbubsUsm8xL*?os^Nc$rO5p6$~Y; zHxAr@m?~xpz!tQEee_y9;A#bOM;Jf^8tkF0ZNpLF2zy%ID-rHVr>Q>0N@tV@NtmV0 zR3|SI2<2wI1WG40k@5I8m&eZA>$XPfP8#5AZ4?TRqKxRLh;xFtYf4>4z*el~J7^g8UXUKIh<4iry< z5L#@&`I2la zowxSqLWjI*$9SFfjY}gPGp`@1lgd_6Z^wKBj_?JP3xPzsul2C|Spe5|ofXvr2O=Tj zBah$;SL5o$4SIt*NKjAMPAm2{M z7+1zr`?U>)5z%y@pT03xr~r~0xei5yfc_f?rlwhmWeUJI*>I=Y4IGHm9rLP))zwLO zXALwp6ck2FWIG?$_!vG|ios;ynzd(@Y~0FJeD5<$6x6^|9pFreg1MK>(&+-c&J|!s zK4Tnl`*q+RePg_%cyh9XGZt)wImUt8(gQ+8p8sXxh*~g^ygMf55LeO(b96atyAabc z(=IL5@&)P23@okQ?lOIstIohrN(+-8*UdHWQ-v6lUIn&!^96AY1awNiII&Qlh%52gVdLP5PKQ$X7~<=+ z9f;GCXQV&`^EbAGS7BuKbwKD19GGPhs|afWd_f3^9LjZo0!icrNgUsh1ORfU>hpLb zVQhRq;4$HqX~Et2_9S-zz|so(BhnN~*kOlMA!1;n9Hmyh0mQsv(5^=MK72rMAaVyn z(fGK+2a*lt0Vl7mBQ4IFIe@9by9l*8r9{S8G;&?Tt`KZKrBnH1!o~R3h&W1CkSu2y zcNf>{{N|&OI4$=DkwkI_5eHAt4(Bur+>6uYmt$OniYHiXbjAHPqKtwArhnU%OYZzd z(j5$ilq(1z)8)56NJx#i5T|Oc^TGgClI)uqNy46cFA{ryy;`3ZrX8#)%I4!R^D15La5ktea)z?i+Efkz3jqEU`PJ zTn2H=3-|y>vjSYK%;(!+OEN#OU0&osxBLJ^#X>8~jy)boHri4s%CtQDO|2<(zf8=t*ro%aowhbtiFqjd2?x?d$&N$$$e>g7 zd8n*ik}*uX)H?G9fht)XEU%OBAhGlPdXS>B$n1%I08Y=ou$;Bw*m zD()M$PaI&YTSxHLi26~}_v1{F6rNTxb1&y&hGzX!#I#aLbwD(a{=}zddL87#sg?q7$5iHp`>KkbwNnbbfvQi-EmKAM@#Fy z>^v38OQ+{XC)lRNd{46pR-S`Uuh=G=Z8Upe_y&${rSo`+V}f){+a@}=5vwokwL z;}dw|wXNrB!Q(Dhy50c(dH&_xG2xH872VbXKL69ZcVB{^B(MAJ0{C9Ruam@pKdtuR z8?)fjZ;pIB7QDAvw+v_P^~0Yu`MW>o^+KN>#{BX#{BOkE0_|7)=k=>bFUmR; z-ucRuGEW(QyX)baW8pphjW?u#IwTt`qkeuZ@~RNi8!~L((D=586MW-tzN%z ze8q3#z5hC#Bmp!}}NdXItY%@Z%!w4%p|{ zX!1+St$pfmnIHR|NAciChhpD<8~${3h9AD?`v+b#kP{e`7JM;`kvK zvotKv^(ws~UiK33fl=4vR)7oq{%YEDaJo-=G%W|;io+-I`QM#A(y}c4v7G>TG>5+n zw`o(c^2czFx&O{Rvn(o-v(w-LukTQ0Tg9K@spI>%c?Vwi?~r@O=i3h-ZTH?e-tH_M z?!~XNcdFkA?*7X^XYz9VTm7FcX$)_P#f<^KUN7&%rtp)NiIVKI@g^@{`WWt2_mww) zg!|WM@YC;0qay!|IrhvBcu&gnzh;J)P3gJPUO&IY<1dWM6ynUnQ~K@s=Wm{cdKc^E zyac~-rh3_j@S1;8L|lfGr6}>^Svb?5)pI20_Z3Tg>%bYfI}qM*yyKC_aJx0@au-d8n)7wH{^~pz z;XfL;8@~~bSop#8vv7}1k1ub6SFGm^;X}RW4o$%I(EI`SUy|&tMDUO*^O`2M=VRym zh%~UyAKdBv@ef{v=hx)|z)cGL^ja49i+GLVzX$6+g|F7^*tda=^YKOC4{Sn#*KeAe zyEc6Og}B2r@;q1G*FE=mxLEJDM`yzNUU2i3zjs^>UrCXE_pfmL$y=6efRFDP_{r~Z ztvMNHABK0$II{H-?B_qG#TOzXVm7dOG?H5=&%pXyHvAFQamFH^?H_Yi-Nd~T-pl6E z7W}inZu=se{LA|;O_=iXzns_V59%c~w#)kzw#V^4yn6d5O4&3b1 z%0=z?RX=s!JQHr!f5GDjK0BQEQZ_Nd86FPkca8DIacAF(30G+frS-}~nxJV)WV z2^^j?|J?cKGNyZO{d4V~dp|GaDfa2Gmv}D6rHNI;=7~&4+J0hu>EqPjAO1Ef^54fJ z;~Ou3dhpZD@R!}LBz_U@Gh}w;O!%eO_pN%uz36%EzUwO{Gyd|}P3LXA{qFYjJHZ#q zcm6CEuMe#I3C7yEpUuXb)h(0+?!a`G8LmF$Y=VMt?(xb0coS}RcYgunvP^$V7c=jf zUBdeZKA1aG4|_H$zgTAXV#dR>@~C&qjh&+L$<%RM7lxDmGOU)ZGoMXp(7q6y^~!*+ z_QR9LChlGUex>5}+ew*Ms$3~|BtP8npP`eJ!NY!E(r*dR;=;!)*l^Metn1-)u(=cFIxsd`1>T-alu$IJ;k9zTsUy zcpHA>@1iMU!*Qy&d=LqzY}=TriFta~<|dV3-EWLz?fuXIuElL_^V!yP%sg=6KFQ-H zg>P0}n_&>#;bLUjRB+-xADmbK&nlR5VJ>*?M>UJ@g~ME|c@`ehdPJUA7_Vdo9`~o2 zlj-3sU%!3rL%1*2oxMNrHl#V6Y~H4=so^)7c00o1{pY-RG*?f!u1(mCU!S_W;LmWF zZ(Cd*y80hDKFd@h#&754Oz^zEHa*qG-}t@z>Q(sZC3ybch7JFMi%%@x={>mK(~^(= zfNPhjp1c&CzINlHzra&p=MI50O`fysPk2p|E3*c|BQQ(NZr*X@QS1$HnGO#VUx%k8 z%(MF^c<DBj)uc~f3);= z&eZFoB4u}Qe1eyvR`i8)-T&*G%=X!zz53I8@WvA77uVpvd}qY4{k!1BH#cPdhv#ZU z?|nZh-+Jto9@C!QWPI%3 zizdY7x7<9(4GV|gru!E@wIM(I1bf42OB{ z@}d=g4qqD;Ir5)M`?@o)mAU#wi8S!17uNmV4vt|rGQa=W_e{8)%Z$xq5B`?(g?0LH z8vJ?ZJcY``&zQb9!m>x<{Y5Js{sKOdo(T#L*J9ZLCeYPUk;`LV8<~ywPr-I(>#G0o zu?A@ekAZ`IU4%J6~?npZd$=0461@9&2DoLegxkx&wydUs+dNvCF+2P+t5aMUYasXQu+|;; zY~O>4v%sG(zBc!7uGh=g+D5$!U;B`m9QN0jOU^A4tE}B8*?Ny$*NStq@H98bEcW

BT(1gT?p~hZ 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 literal 0 HcmV?d00001 diff --git a/spatial/data/st_multilinestring.prj b/spatial/data/st_multilinestring.prj new file mode 100644 index 0000000..747df58 --- /dev/null +++ b/spatial/data/st_multilinestring.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/spatial/data/st_multilinestring.shp b/spatial/data/st_multilinestring.shp new file mode 100644 index 0000000000000000000000000000000000000000..db22094c9e4dc3a92c5b1d47dbf8ffc90de271db GIT binary patch literal 100 gcmZQzQ0HR64vbzfGcW)V4)9?=L;^J8=Bgw{vsWI5_}?n1C28SIJbT@}LsMT%Zdea&Kp52Q00K zJCM`=$>}ac9}7$_@<5Q*>GHS(Z842cCPCy_VRA}qc3O7;6c3$rZ@$t7%?(sB!^ug8s1I|*VYFHDZ@)vIq=K)L*eIrm#2a(pnk6rC!~Pe8XgUzzf9 z1u))#;`}hV{wuE~_<(XNxTK5kL*xWta)!K$_r%KL4m_IngmV@|P7o%Co)&=OLNK{1 zmXqoZKtIUKo%g*1@q;i-F4QZxbu%z-6Xv*BJcG!Iz~pA`RT5SOhV_p;V~!UPKZwHQ y_I~Nzun_2$ldh zYex|^0`friI6!GXC>;Z(v!HYZlx~C4Q=s%BD7^tn?}O53p!6*${Q^pVgV2mDP+AB| UD?n*IC~X6!y`XdiluiTD0R8YCga7~l literal 0 HcmV?d00001 diff --git a/spatial/data/st_multipolygon.dbf b/spatial/data/st_multipolygon.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d8a08d89a8db9f372b52324ffe8c40fe4978a6bf GIT binary patch literal 192 rcmZQhV`AcCU|?`$-~^IrAe@20(*-W(2V!x+xex}g0u&ew2tx`0hEfv8 literal 0 HcmV?d00001 diff --git a/spatial/data/st_multipolygon.prj b/spatial/data/st_multipolygon.prj new file mode 100644 index 0000000..747df58 --- /dev/null +++ b/spatial/data/st_multipolygon.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/spatial/data/st_multipolygon.shp b/spatial/data/st_multipolygon.shp new file mode 100644 index 0000000000000000000000000000000000000000..09df9685c8fe1686a6ab53ad6d00185db5144acc GIT binary patch literal 7640 zcmZwM2~>`08wc=^>{+8|L5rzuSxOT1W-Ag>k(No4OsTYam8FG}jI}Z?hD3=Xlq4wL>B!%^`k~MSc!>>cbSfK2H}J{paQX{+}H{BjH}wb8{m4<6h-| zJy7g)Tx6tr!a_8A-T&_;3>3x*KayiV_Glj)IGC2m38QCNlbY9+G2ej+MNY=Dj(d#vJfuzt07KNlD|+_c?{FKCIdW z&n8K+v&Q^Xk&%gKq@FpRjqD7)PG#`VbCMiObFAdGH1EyvH0B^Y_V4rH`#jWf{KLdt1!aq41Qd+UO;CPe0E? zaxBfUlGoC_H^2f!hvZnAVy@`dwSFppao=H~865gCP7O}lat_6fWY)f0RA=jS0gmgZQ=YiZt_ z<7v#H2j_94{DqAXzSlNm^ebz8FXN+jubKt@)BZgV$+0xYN?uFz-W*S34m~-Kuo`7~ zJ-mn6|HK@aj~I3!J=A#sY;)%ItR{(=COMYoSjlT?-kalT%%K+^$*)2XNeu7fx&rYc zAx1aa1K)dJT=usI_VF(#(^?#mFNF8vCj19K{A^jW*Nhd&2OASI&k19<#Vmg91ZNzY zTrAjrRBWt0+}FduN^q`BsPPiGdVrJkYPf&)nubNf=dB;c2wtCYe&2l9D^1Tu@L=21 zGv~tJx+^9NwrI&|odp|=JI^oCp9jt$X*&6C!@6WrX= zP@@jNKid+%2Cj7p`T0L025mxkiGv*~c^Zd2=O|Z$>$e=2? zb>*DGVED$xRd*|4+vl&_LSWZ16%#7p9y1cghrzEdsUEx!Yj-g4-wdC6woU#XZ1yHA zZwuUKpl$puc$s-kzX&*2=APzF_)boq`&Kx@d+OzDu+L=Gl1TU;^~b9U;S(nBbfaM3 z_P0s}@X@RRDcfPIXZeqFVfWHi$~$1s6On1>VXejG2|MA;dE3Lzz?;R>hVO>kqPx2P z4L|)SIAaeivYhOc4d-v!WE>3_8apmO0gqQvtcZb)WwQO!VUvsrf%{-{EwAV_*f;;^ zusHaiLAMH0U~^a7l6ZLcfF2zV!*x39!HMum!^P%F@GkvY{XgN*(8kn1VP}=#wga%q z;r9NCaC`5Y=aXRRQI~#?gAEH)wc!x z952*ediTejh=83+k40s}mh0T|w!k-6D2Mz7tLVvAg~3HV(gIJzUujs z!vf)iFw>+0c=|TYd@;PlO6}AY_}9>GK5OBx&+lC=g3ILn^a9|JqdHHo!QnMwvi@*b zb)Qey;faIhxB0^12WJl~fsZd~c<%!n6l6@e1uN8fNDD6fB5!pE_S{mVu?Ft>&@SK} z{2^eKoj2V1l0|$O{4QMPuov9pQ(;~??A)nXO7PgDu{96jS2_8fo^VV>Oz+2V$%nS) z)o{_~KPEka`|c2j3+^A`yX+Z!>c*V0f@`zBL{-Cm*84XIv3b%JnVc7}Y5lizf=k7& z)irQKMeTmUXE(i*t%n)Q4~K7@EYxKDe9DxkF0X&OKFXqg=Np*!cM`8T_ZH^&rw5w9 zcn@=amFn|lKfs*-^u-psA7TD}Ze51je}?({drpfD`3m#-tQ-+}q#fq-%aAU)+5x$T z&sTryq`FQppMRs{{w^{w-_IMRGS#jy-``uCzYM#>e7^yT{j7SzeE&m^UviU$xjxE+ z5(E3dTt8C`#gYABuCJr_N5%|*x&FfZcI+PrbA7H1S$jwx=K3|y%uOB)bA6|`Oi5CN zx&Bk)uEs0F+#mhN8SD~jbMBvg2R%ZD!`xq|RrNj9VD7&=W&t)DF!!gnbVq|FV$%?eIBFyl+#Di`(fFyl{k(YNXe zFyqs<()*tGrsQC zcJVZV8GoC?Q$8ERjL&9AWrIy%#_z72-ysKCM$ zX8uT;t&wF0Gr#mZ)!uzB%>1L(ccQ&;rel6Gl{%g>4`%*yJ8xER0W-f1R%%mQ05kt> z*cWfJ5N3WHJwqwP5@!BXe&mw82xfkDIqPuI3TFQ8R^41`4KqJyNp*i<12cbHxbA+i z7-oLYmkYSP1ZMuXJDr?o3$s4(INUX5Da`sIyLM-o9nAV7fAYvB_Au)Yn=Zv_4lwJJ zOb^={!K`1-7?&JygjwI1_8PR{SD5vWLEjN=f>|GJn%Nxf1hak`;pnEd3}$_`peXb& z!K}aJj!e{ZhFPCER{CZNX8o4kdy?{UnDt##jDM(L)_={v|MEmI>qGt9Gj&{G){p+J z#bUv%FQsiVa|E;gbnemAD46x>u7=GDLaogD)p@U%fne6Rh4#lS1+)HbS+2KCFzaL1 z+N_`Xx&FzBgjJ~Lc)jZovv;du-oLZR!PE!l_h&_~-X9=*{$qZ#;?&*-!kmBFYt8AK zVE%r7mcQ%`gZcaCW?g$00rUA>AC@z6JIv>Iu{qIq7tH5tc3k~TG|cDksPgIKA28p~ z)n$dc`(eJn(#naRNig5<-G%Ryj=+5Xk1En{r@>qw>YrslXTV%P`x7oJXTw}yE0lt! zoQApnj22c~o`bnQKWtB3o(psRUQAiHx&Y?-4)4&-y9nm`pZ$9$_v`p=y!VD8V|lh&41!rZ?zj%`n@g1Ns_%iq|(gt`BN zV8*9Y9ElTcidvzl@tu zwsi!|{L`<;RzoeA`N{aoyJsU|=C9yG&-};0%x`%^RKDoI%zwili@hhn%#U?<^U8E# z=Fd5!E^F(<%&%HYt-K6i=HHw_vyu&A=4UB4kD_TX^S4EE;saxt`F*>0#zPaB`QN)F zpm+w%`rvTiyQ#Ba)(=-3Qu3Y$vwoSgVQQ-d z%=*SrL&I$W%=%~3h11s-!mN*$U%5YM5zPAO^%!?cE130_p_5&ZHO%^Jht96uHZbcm z`KI^Li(%Gp#~gjOEP+|ySzY?*YzwpgyLroh^ir7h;qAPKF9frGbeb_J(hg>Q`Cy02 z5PO*QXY2gheS%q^W}k8GB=jm+zxD}=wiV3!_SE%N`vtT94Roj~5zP9y+`a9UVAjv< zeXzdf=d8bZJ?nGcpY=PxpY=WG$NHc1=lOuYAI}f`{dvCN^Wph}&yVL5K3|?+`22ak z;rrqFhwqQ)BfejrpZNZHzT*1e`HSm^=QFM^p5M6sc)sKM5m*+#SZ=N5y{&~LS z{^0qO`-kUK?k}ESx&L^+<^JUPm;0CJWA1OBpSk~ezGi&j`J3^B=X1svp5GaNc)n+R z;`yKPi~Rw{H}(%0|JYw(d}RND@ss@t##i<)7=PK{V0>o(gYldF5yp4+PZReqn!*^$q)ntbf>FWPQZ` zBkL#jCs|*yf64lb{Y}R;V}F$O9s8%O|JYw;eaQYR>qquySzoe$%lec3UDl`U z|FV8%f0*?x`^T(***Ro4 zJBp|gkOxv%2BmiaX(k{(0O2#TKxq#s-2;T%=RoNP5Sm$qfq^@Lfq}0B H$WH(O-T@g~ literal 0 HcmV?d00001 diff --git a/spatial/data/st_point.dbf b/spatial/data/st_point.dbf new file mode 100644 index 0000000000000000000000000000000000000000..657c90e4199e35175ba377b8c1ea1f5eb50eea77 GIT binary patch literal 390 vcmZQhV`5TaU|?`$-~^IrAe@20(*-W(2V!x+xex}g0u&gGG87cZ3%q?Go7%r%hcDa)pSee_jS1*<(WvQf;)6#~Cm1Ox+ zk{gz$%i5M~EUho;O&Db*6;?`6iGeh-m?o8<>}(GQ6uhwe;ruxF`Jd-`#^J>Ia+ZBO z62E(LI9#x+xtZnJ=NR^deej65i>9*dk}COGhE)yab;doUsb$-j7G0n5b-k+2&%b$G z$*|>`gp@fGO+m>6es0szO!!T(6Ri<#eP*{o0%D!E{30n>vS)%hhOFs@_K*KXxe@X$ z%HxgZn_qC3b{Q+Y{hX}FL&LcO4zq=WY7w*fr+T% z5n?OQ2L6oOxEh8{^vO(Dk(~Z$+bR^FQ_2~3t}N(KF6j$EYkL|Kya8-c&Xs6dXUpjl zFg#PJ2cp@hwtCIL`R3m0mBe<_6x3ItZ7+?wbPW1^Tk18;b^g4X_FaXv$eKoLUKPN(D46KlV_5hBz=)+wtDNMPtdnX zAXw0mEKz8@DYetMbiQ?H2Uum|E7yFZ>FrLkpV4S<)n=Xs?qCqL-;zW2Y(3iWQI0Jh z>_;=dc$j2~L7TKlv#)_MCY?T&m*Ro4 zJBp|gkO#8I0ZRKp=@=-T1*I#XbQ_eO0;Ly0=?zeNACx`=rEfv$7f|{egl1%c(n3&L z0ZQvZX&Wf*1*IdPbQ+W{fznM-dIFT52c_3Q>0MCz1eCr8rJq3QPY{|3NP)tEi4RK4 GfM@`HAR~hS literal 0 HcmV?d00001 diff --git a/spatial/data/st_polygon.dbf b/spatial/data/st_polygon.dbf new file mode 100644 index 0000000000000000000000000000000000000000..b67a227396e48aa0a6a8272bb5bb9848afd0a353 GIT binary patch literal 120 rcmZQhV`5@sU|?`$-~^IrAe@20(*-W(2V!x+xex}g0u&gK#E=32i;f9D literal 0 HcmV?d00001 diff --git a/spatial/data/st_polygon.prj b/spatial/data/st_polygon.prj new file mode 100644 index 0000000..747df58 --- /dev/null +++ b/spatial/data/st_polygon.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/spatial/data/st_polygon.shp b/spatial/data/st_polygon.shp new file mode 100644 index 0000000000000000000000000000000000000000..64bb0bd7d39fe57b39c023dc28f25ca9056a2cdd GIT binary patch literal 6680 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 literal 0 HcmV?d00001 diff --git a/spatial/data/st_polygon.shx b/spatial/data/st_polygon.shx new file mode 100644 index 0000000000000000000000000000000000000000..98bdcebba2fa9296ce1a55a978017231769bf37b GIT binary patch literal 148 zcmZQzQ0HR64!mA4Gcd3M<&M2^y2n)$cR-Ej>8$J}P7d8SPi422#T}SwzU9)JwN4J$ jwWEj{0eK*GWl(w-0|R#g0|Sp7ke>vkTOi^*CqOg+Y{(Y{ literal 0 HcmV?d00001