wiki:DeveloperGuidelines/GIS

Version 9 (modified by Fran Boon, 13 years ago) ( diff )

+OL/MapFish docs

DeveloperGuidelines

GIS Module

OpenLayers

The GIS module uses OpenLayers for Display purposes, so a thorough understanding of this is a great foundation for what we do:

MapFish

The map window is wrapped in an Ext GUI based on MapFish client:

How to add a new Layer type

Model

models/_gis.py

gis_layer_types=['newlayertype','...']

# Provide layer-specific options in it's own table:
db.define_table('gis_layer_newlayertype',
				SQLField('modified_on','datetime',default=now),
				SQLField('layer',length=64),
				SQLField('newfield'))
db.gis_layer_newlayertype.layer.requires=IS_IN_DB(db,'gis_layer.uuid','gis_layer.name')

Controller

New Layer Types & their Fields need adding to several places in the Controller:
controllers/gis.py

def layer():
    # Display method
    elif type=="newlayertype":
        newfield=db(db['gis_layer_%s' % type].layer==t2.id).select(db['gis_layer_%s' % type].ALL)[0].newfield

def shn_gis_create_layer():
    customform=FORM(
            INPUT(_name="newfield"),
    elif type_new=="newlayertype":
        db['gis_layer_%s' % type_new].insert(
            layer=id,
            newfield=customform.vars.newfield
        )

def shn_gis_update_layer():
    elif type=="newlayertype":
        newfield=db(db['gis_layer_%s' % type].layer==t2.id).select(db['gis_layer_%s' % type].ALL)[0].newfield
    customform=FORM(
            INPUT(_name="newfield"),
    elif type_new=="newlayertype":
        db['gis_layer_%s' % type_new].insert(
            layer=id,
            newfield=customform.vars.newfield
        )

If loading custom JS files when the new Layer is active:

def map_viewing_client():
    # Check for enabled Virtual Earth layers
    virtualearth=0
    for row in layers:
        if row.type=="virtualearth":
            virtualearth=1
    return dict(virtualearth=virtualearth)

View

Custom fields need form views creating:
views/gis/form_field.html

<tr><td><label>{{=T("field_label")}}</label></td>
<td><input name="field" type="text" value="{{try:}}{{=resource.field}}{{except:}}{{pass}}" />
{{if customform.errors.field:}}<div class="error">{{=customform.errors.field}}</div>{{pass}}</td></tr>

Then adding to the layer CRUD views, such as views/gis/update_layer.html:

{{include 'gis/form_field.html'}}

static/scripts/gis_layers.js

} else if (type=="newlayertype") {
        var fields_hide=["key"];

} else if (type=="newlayertype") {
            var fields_hide=["subtype","key"];
            var fields_show=["field"];

views/gis/ol_layers_all.js

{{elif layer.type=="newlayertype":}}
    var newlayertype = new OpenLayers.Layer.newlayertype( "{{=layer.name}}" );
    map.addLayer(newlayertype);
{{pass}}

If loading custom JS files when the new Layer is active:
views/gis/ol_js_loaders.html

{{if virtualearth:}}
<script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>
{{pass}}

DeveloperGuidelines

Note: See TracWiki for help on using the wiki.