Axional Geospatial

Extend your database with
geospatial capabilities

Most data has a component that can be tied to a place: an address, postal code, GPS location, census block, city, region, country, etc. Geographic mapping lets you visualize, analyze, create and manage data with a geographic component. It also helps you build compelling maps that help you visualize patterns, trends and outliers in your data.

Using a spatial database to store objects like points, lines and polygons using geometric data types offers a significant advantage compared to classic mapping solutions where the view is oriented towards the analysis of transactional or statistical data. The new geographic tools can reveal trends and patterns that are otherwise hidden in alphanumerical data.

Axional Geospatial allows organizations to easily implement spatial extensions and simplifies the process of building geospatial applications.

Key points

  • A web form designer allows users to write database queries and represent them on maps.
  • A geospatial SQL grammar allows users to write database-independent geospatial SQL statements.
  • Location tracking capabilities are integrated into the client software.

Data analysis

Multiple Layers

Axional Geospatial can map multiple layers of independent data sources. For instance, a company might be interested in cross-referencing different data on a map, such as the location of its customers and the socioeconomic data (such as average income or age) of their area (state, district, postal code, etc.).

 

For each data layer, certain attributes can be set:

  • Label: A label identifying the layer will appear in the legend.
  • Visibility zoom range: Minimum and maximum zoom range in which the layer is visible. Outside the range, the layer becomes invisible.
  • Initial visibility: Even if a layer is in the visible range, it can be set to hidden by default. The user can set it to visible when needed.
  • Category: Layers can be grouped into categories.
  • Geometry rendering types: Usually, spatial databases have three kinds of geometric types: point, line and polygon. However, due to the nature of the data it can sometimes be more useful to draw geometries in a special format. Axional Geospatial provides special renderers such as:
    • Heat map: Suitable for mapping density.
    • Clustering: Useful for a large number of markers.
    • GPS tracing: The ability to map a path of GPS points.
  • Symbology: Allows the definition of symbols on the map. This may include colors, opacity, borders, image markers (when geometries are points), etc.
  • Info window: The text that will appear in a box when clicking a geometric type. The text can be a static string or a template with references to columns in the row clicked; it may also call an XSQL script in the server, returning HTML code.
  • Tracking cursor: A tracking cursor is another SQL query used to iterate layers. When a tracking cursor is defined, the layer SELECT statement should have variables in the SQL condition. For each row returned by the tracking cursor, the SQL layers are executed with variables tracked by the cursor. That means that for every row in the cursor, a new layer is generated.

Thematic mapping

A choropleth map is a thematic map in which areas are shaded or patterned in proportion to the measurement of the statistical variable being displayed on the map, such as population density or per-capita income. Choropleth mapping shows statistical data aggregated over predefined regions, such as counties or states, by coloring or shading these regions.

Colored maps are not always the best way to display values, since large regions are emphasized much more than small ones. To address this issue, instead of drawing complex county shapes, circles are used. The area of each circle is proportional to the absolute value of the data.

The success of many thematic maps, especially choropleth maps, depends upon understanding how we manipulate colors to systematically encode our geographic data using the three dimensions of color: hue, lightness, and saturation.

Axional Geospatial comes with three predefined categories of color palettes to suit the nature of the data being represented:

  • Qualitative color scheme: Contains different hues that keep lightness and saturation constant; should be used for nominal data. (i.e. categories that cannot be ordered, not numerical data)
  • Sequential color scheme: Any sequence that is dominated by changes in lightness can be used with ordered or ranked categories (low/medium/high) or with numerical data.
  • Diverging color scheme: Should only be used when your data has a natural midpoint such as a zero (e.g. positive and negative change/growth), or if you want to compare places to an average (e.g. data showing counties that are above and below the national average for a variable such as per capita income).

In addition to the predefined color palettes shipped with Axional Geospatial, developers also can define their own palettes to suit their map requirements. Moreover, even end users can dynamically change the color palette being used in the map by easily clicking the palette in the legend.

Special renderers

Heat Maps

The heat map is one of the most useful and powerful data analysis tools available in business intelligence. It is a visualization feature that presents multiple rows of data in a way that makes immediate sense by assigning different sizes and colors to cells, each representing a row.

If the data points are valued, that is, each point is associated with a value, the graphical representation consists of regions known as areas of same value which can be filled with different colors and/or delineated by contour lines.

Heat maps illustrate the density and distribution of point data, generated in real time over pan and zoom maps. Point influence (radius) and color swatches can be configured to give the most appropriate overlays for your data.

Clustering

Some applications are required to display a large number of locations or markers. Google Maps mashups can suffer performance problems when trying to display a large number of markers at any one time.

To overcome this poor performance, the information displayed on the map needs to be simplified, for example, by using some kind of clustering.

Clustering is the process of grouping closely-positioned locations together and representing them with a single pushpin. When you zoom in, those locations will become further apart and separate into their own pushpins. The client-side part of “Client Side Clustering” clusters data on the fly in JavaScript rather than going back to the server to request more data. When you have a few thousand locations to display on the map, client side clustering can be significantly faster than server side clustering and also cuts down on requests to your server, thus making your application more scalable. The following images are an example of the same approximately 6,000 pushpins before and after being clustered.


Geometric data types

Axional Geospatial includes an XML-based SQL grammar with geospatial extensions for a wide range of database spatial engines. The DML grammar offers a full set of functions to write SQL-independent queries, simplifying the use of any spatial datablade.

<select>
    <columns>
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6
    </columns>
    <from alias='d' >
        <select>
            <columns>
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                <geo.asWkt>bican_zonas_censales.the_geom</geo.asWkt> the_geom
            </columns>
            <from alias='c' >
                <select>
                    <columns>
                       <geo.buffer>
                            <geom1><geo.aggrUnion pg_collect='y'>bican_areas_influencia.the_geom</geo.aggrUnion></geom1>
                            <dist>0</dist>
                       </geo.buffer> the_geom
                    </columns>
                    <from table='bican_areas_influencia' />
                    <where>
                        bican_areas_influencia.id_oficina = '#oficina'
                    </where>
                </select>
                <join table='bican_zonas_censales'>
                    <on>
                        <geo.intersects>
                            <geom1>c.the_geom</geom1>
                            <geom2>bican_zonas_censales.the_geom</geom2>
                       </geo.intersects>
                    </on>
                </join>
                <join table='bican_zonas_censales_data'>
                    <on>bican_zonas_censales.gid = bican_zonas_censales_data.id</on>
                </join>
            </from>
        </select>
    </from>
</select>
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: ids
-- ************************************************************************************
SELECT
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  

  FROM (SELECT
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                ST_AsText(bican_zonas_censales.the_geom) the_geom     

  FROM (SELECT
                       ST_Buffer(SE_Dissolve(bican_areas_influencia.the_geom),0) the_geom            

  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 

) c
      ,bican_zonas_censales
      ,bican_zonas_censales_data
 WHERE 

                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)
                     AND
       bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
 WHERE 

                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)
                     AND
       bican_zonas_censales.gid = bican_zonas_censales_data.id
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: oracle
-- ************************************************************************************
SELECT 
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  
    
  FROM (SELECT 
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                SDO_UTIL.TO_WKTGEOMETRY(bican_zonas_censales.the_geom) the_geom     
            
  FROM (SELECT 
                       SDO_GEOM.SDO_BUFFER(SDO_AGGR_UNION(SDOAGGRTYPE(bican_areas_influencia.the_geom,0.05)),0,0.05) the_geom            
                    
  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 
                    
) c
      ,bican_zonas_censales
      ,bican_zonas_censales_data
 WHERE 
       
                        SDO_ANYINTERACT(c.the_geom,bican_zonas_censales.the_geom)
                     AND 
       bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
 WHERE 
       
                        SDO_ANYINTERACT(c.the_geom,bican_zonas_censales.the_geom)
                     AND 
       bican_zonas_censales.gid = bican_zonas_censales_data.id
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: postgres
-- ************************************************************************************
SELECT
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  

  FROM (SELECT              
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                ST_AsText(bican_zonas_censales.the_geom) the_geom     

  FROM (SELECT
                       ST_Buffer(ST_Collect(bican_areas_influencia.the_geom),0) the_geom            

  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 

) c
       INNER JOIN bican_zonas_censales ON
                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)

       INNER JOIN bican_zonas_censales_data ON bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: sqlserver
-- ************************************************************************************
SELECT 
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  
    
  FROM (SELECT                 
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                bican_zonas_censales.the_geom.STAsText() the_geom     
            
  FROM (SELECT 
                       -- Tag [geo.aggrUnion] not defined for engine sqlserver.BufferWithTolerance(0,,) the_geom            
                    
  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 
                    
) c
       INNER JOIN bican_zonas_censales ON 
                        c.the_geom.STIntersects(bican_zonas_censales.the_geom)
                    
       INNER JOIN bican_zonas_censales_data ON bican_zonas_censales.gid = bican_zonas_censales_data.id

) d 

Below is a list of the geometric functions supported that are available in the XML grammar:

Informix Datablade Postgres PostGis Oracle Spatial SQLServer Spatial DB2 Spatial Extender
ST_Point        
ST_Line  
St_Polygon  
getType  
getX
getY
getZ
getEnvelope
isValid  
getCoordDim
getDim
getSRID
getNumVertices  
asKml  
asGml
asWkt
asWkb
asSvg
transform    
reverseLine
distanceCartesian  
distanceSphere
distanceSpheroid  
length
lengthSpheroid  
perimeter
area
centroid
withinDist  
equals  
touches
overlaps
covers
coveredBy  
contains
within
intersects  
disjoint
intersection
buffer
simplify  
convexHull
difference
symDifference
aggrUnion  
aggrMbr
aggrConvexHull
GPS tracking

GPS tracking is a special layer renderer aimed at tracing GPS tracks. The data input must be GPS coordinates. The renderer takes care of connecting the coordinates into lines and also traces a circle representing the accuracy of the GPS measurement.

Location tracking

As much of the data stored in a database can be georeferenced, it becomes possible to analyze any related information projected on a map. For example, you can see your customer sales by area in a map joining the geometric locations associated with a customer with the sales stored in sales tables. Instead of seeing a classic report of sales by region, the option to map them is provided. Moreover, you can zoom in on the map to see more detailed information and even go to a specific customer and see their invoices.

You can easily implement Location Based Services (LBS) for Android mobile devices. The LBS services use geographic information to serve a mobile user and enable service organizations to improve their service operations, allowing them to make decisions and take actions based on real-time location information:

  • Improved customer service
  • Increased field workforce utilization
  • Reduced scheduling and shipping labor

Axional Mobile LBS enables services such as:

  • Maps and navigation for mobile users/employees.
  • Resource tracking with dynamic distribution: Vehicles, service personnel, rental equipment, fleet scheduling.
  • Information services: Locating the nearest business or service, such as the nearest ATM, and user-generated content.
  • Proximity-based notification: Targeted advertising, favorites lists.

Using Axional Mobile location tracking services, your database will receive the tracking position of your users or vehicles, which can easily be used to report distances, record time spent on delivery, notify customers about the location of a purchase, optimize routes, etc.

Mobile devices

Android mobile devices can be used either to query and view information stored in our databases, or capture location information and store it in our systems.

Databases

Axional Geospatial works with:

  • Informix Spatial datablade
  • DB2 Spatial Extender
  • Oracle Spatial
  • Postgres PostGIS

Key features

  • Form designer to query and represent alphanumeric and geospatial data
  • Data capture from Android devices
  • Native SQL spatial queries
  • Independent XML/SQL PostGIS grammar
  • Geospatial database migration tool to and from any supported databases