Technology

Madrona makes many technology choices for you while still providing lots of options, recognizing that the most successful software solutions are tailored to a specific goal, process, audience, geography, and culture. This takes time and multiple iterations. You want to be able to quickly piece together and refine your solution without getting distracted by all of the nuts and bolts.

Core Building Blocks

Madrona is built on libraries such as Django, PostGIS, JQuery, OpenLayers and Google Earth, which provide all of the essential building blocks for developing modern spatial web applications.

Django

  • Model-template-view architecture
  • Automatic admin interface
  • Elegant URL design
  • Template system
  • Caching
  • Internationalization
  • User accounts and groups
  • Content management
  • Extensive third-party packages
Learn More

GeoDjango

  • PostGIS support
  • Geographic models
  • Object-oriented spatial queries
  • GEOS Python API
  • GDAL Python API
Learn More

PostGIS

  • Vector and raster support
  • First-class geographic data types
  • Full spatial query support
  • GiST indexing
Learn More

JQuery

  • Lightweight
  • Cross-browser DOM manipulation and event handling
  • Extendable through plugin architecture
  • Extensive third-party plugins
Learn more

OpenLayers

  • 2D tile-based maps
  • Vector support with drawing tools
  • Extensive support for mapping services including UTF-Grid
  • Google maps integration
Learn More

Google Earth

  • Free browser plugin
  • Immersive 3D environment
  • KML support including superoverlays
  • Global base imagery
  • Simplified use through extensions
Learn More

Madrona Building Blocks

Madrona builds on these core building blocks to create new ones that are designed specifically for planning and decision support. Mix and match them to meet your specific needs.

2D and 3D Support

2D and 3D mapping clients have their strengths and weaknesses, choose the one that works best for your project. Madrona supports both using the KML and GeoJSON data standards.

Spatial Features

Provides a powerful spatial content management system complete with API. Define new features (point, line, polygon) that are unique to your needs (wind energy sites, bike paths, event locations), then let users sketch, copy and share them.

Learn More

Collaboration

The best ideas often evolve through many iterations and through connecting with other people. Madrona is developed with quick iteration and sharing in mind. Our robust permissions model is secure but allows you to share your work when you want.

Learn More

Feature Manipulators

Features sketched by users often need to be modified or cleaned, Madrona provides a workflow for doing that. Examples include clipping a polygon to a study region or excluding specific areas.

Learn More

Import-Export

Planning tools shouldn’t be black boxes. Import and export features are provided so that users can get out what they put in and integrate their external planning and GIS workflows.

Map Bookmarks

Let’s users take a snapshot of their map view including the data layers and features they had turned on then share and manage the views as bookmarks (Google Earth support only currently)

Learn More

Study Regions

Focus the user’s attention on a specific geographic region and then create or limit user actions specific to that region.

Learn More

Data Layers

Manage a hierarchy of data layers important to your decision-making process and provide fine-grained access for viewing. Also let users upload their own data layers. (KML support only currently).

Learn More

Reports

Provide feedback to users by performing real-time spatial analyses on their features. Quickly organize information as tabular data and interactive charts using Django’s template system and your favorite visualization library.

Learn More

Flexible Analysis

Interact with external modeling and analysis software such as Grass, Marxan or ArcGIS Server in a standardized way. Define your model inputs and capture the output as Features that the user can interact with and share.

Learn More

Asynchronous Tasking

Analysis can take a lot of time and system resources. Users should be able to do other things while they are waiting. Run processes in the background and get notified when they finish.

Learn More

Static Maps

Create static map images for putting into reports and printing that include user defined shapes and other features.

Learn More

Custom Projections

Use one of the thousands of projections available with Proj.4 or define your own.

Learn More

Raster Statistics

Quickly calculate statistics for a polygon Feature such as the average elevation or maximum temperature using raster data layers. Provides an optional caching mechanism.

Learn More

One-size-fits-all rarely works and often times you have to roll your sleeves up. The assumption is you will want to integrate different technology with Madrona whether it’s a mapping library like Leaflet, data management and data serving tools like Geoserver or ArcServer or a more robust client-side framework like GeoExt.

Architecture

Features

Madrona creates a system that can best be thought of as a feature spatial content management system. This starts with the Madrona PointFeature, LineFeature and PolygonFeature models. You can quickly extend these models to define your own spatial features specific to the purpose of your tool. Working with wind energy sites? Define a PolygonFeature and give it attributes for the type and number of turbines. Once you register your feature it’s mapped to a PostGIS table and automatically published through the REST API.

For more information consult the Madrona Feature documentation

@register
class WindEnergySite(PolygonFeature):
    ext = models.CharField(max_length="12")
    turbine_type = models.CharField(max_length="30")
    num_turbines = models.IntegerField()

    class Options:
        verbose_name = 'Wind Energy Site'
        form = 'myproject.forms.WindForm'
        links = (
            alternate('Shapefile',
                'mlpa.views.shapefile',
                select='single',
                type='application/shapefile'),

            alternate('KMZ (Google Earth)',
                'wind.views.kml_export',
                select='single multiple',
                type='application/vnd.google-earth.kmz',
                generic=True),

            related('Viewshed Map',
                'wind.views.viewshed_map',
                select='single',
                type='image/png'),

            edit('Delete',
                'wind.views.delete',
                select="single multiple",
                args=[WindArray],
                kwargs={'keyword_argument': True})
        )

REST API

The madrona REST API is the communication channel for the client and server and supports both GeoJSON and KML. Using it you can:

  • Create, read, update and delete Features
  • Copy and share Features between user groups
  • Manage Features within a FeatureCollection
  • Convert to export formats
  • Access reports and related documents

Workspace Document

The workspace document is an important part of the REST API. It is a JSON document that the client fetches from the server at startup that describes the server-side API. Specifically::

  • What Features are defined for the current user
  • What Feature actions are available for the current user
  • How Features relate to one another
Specifically, the workspace document describes the URLs for:
  • Creating, Updating, and Deleting Feature instances
  • Editing actions that can be performed such as Copying and Sharing
  • Managing relationships between Features
  • Alternative export formats, such as KMZ or shapefile downloads
  • Related files that can be downloaded, such as spreadsheet or pdf reports
  • Reading feature attributes or reports

Because the API is well-defined through the workspace document, you can quickly and efficiently develop alternative client interfaces.

For more information consult the Madrona workspace specification

The JSON snippet below defines the wind energy site feature in the workspace document. You can see that URL's have been published for performing create and edit actions as well as accessing associated viewshed maps and KMZ/Shapefile exports.

{
    "title": "Wind Energy Site",
    "id": "features_windenergysite",
    "link-relations": {
        "self": {
          "uri-template": "/features/windenergysite/{id}/"
        },
        "create": {
          "uri-template": "/features/windenergysite/form/"
        },
        "alternate": [
          {
            "title": "Shapefile"
            "uri-template": "/features/windenergysite/links/shapefile/{id+}/",
            "select": "multiple",
            "rel": "related"
          }
        ],
        "related": [
          {
            "title": "KMZ (Google Earth)"
            "uri-template": "/features/windenergysite/links/kmz/{id+}/",
            "select": "multiple",
            "rel": "related"
          }
        ],
        "related": [
          {
            "title": "Viewshed Map"
            "uri-template": "/features/windenergysite/links/viewshed-map/{id+}/",
            "select": "single",
            "rel": "related"
          }
        ],
        "update": {
          "uri-template": "/features/windenergysite/{id}/form/"
        }
    }
}

3D Web Client

By default, madrona provides a robust HTML/Javascript client interface based on the 3D Google Earth plugin. It is not the only option for building a client interface but it does provide a complete solution out of the box.

The 3D web client allows features to be delivered using the expressive KML format. Using the workspace document the client will automatically configure a set of javascript widgets including the Google Earth Plugin, forming an end-to-end spatial content management system. Besides the Google Earth plugin itself, madrona provides a number of additional components.

KmlTree

kmltree is a javascript tree widget that can be used in conjunction with the Google Earth API. It replicates the functionality of the Google Earth desktop client, namely the ability to render complex KML documents very quickly and present the hierarchal contents of a KML document as an expandable, interactive tree view.

KmlEditor

KmlEditor provides the editing interface and menu to hook your features tree into the REST API. It will use the workspace document and configure the editing interface according to the API definition. The interface is context sensitive and provides the appropriate options for the selected features.

KML Drawing Tools

Madrona provides a robust set of drawing and editing tools for the Google Earth Plugin. These play a part in the larger workflow of creating, editing and sharing features.

2D Web Client

Madrona provides core support for 2D web mapping through its REST API allowing a variety of possibilities for developing 2D client interfaces. Additional client-side widgets are currently in development for Madrona. You can contribute to that effort or take a look at frameworks such as GeoExt. OpenLayers is currently seen as the most robust 2D mapping client with support for vector editing, UTF-Grid encoding and other advanced features most often needed by Madrona-based tools.

GeoJSON Output

The Madrona REST API provides support for GeoJSON output of any Feature by default. This was challenging because the GeoJSON specification does not currently support a hierarchical structure (a collection within a collection) and Madrona does through its FeatureCollection class. To get around this Madrona supports two strategies, a ‘flat’ strategy that strictly follows the spec and a ‘nest_feature_set’ strategy which extends the GeoJSON specification to tell you all of the child collections that are within a given collection. In this way you can quickly query down into an arbitrary hierarchy of features.

collection1
  |- polygon1
  |- collection2
    | - polygon2
    | - polygon3

Learn more about GeoJSON output

Third-party Integration

Madrona can integrate with a variety software products, libraries, and services both server and client-side. We do this all the time on a project-by-project basis. Much of this is possible through the power of open data standards, API's and the web.

Tools we're leveraging:

  • Mapbox/Tilemill - UTFGrid map production/publishing
  • Twitter Bootstrap - simplified UI scaffolding and interaction
  • Knockout - dynamic Javascript UI's
  • Amazon S3 - cloud-based storage
  • Grass - raster analysis
  • Arc2Earth - Map tile production in ArcMap

Tools we want to leverage soon:

  • ArcServer
  • CartoDB