Client Views Map

The Map View is used to provide the user with a means of navigating geospatial data using a map.

ID

com.cohga.html.client.main.mapView

Sub-tags

Name

Type

Cardinality

Description

Name

Type

Cardinality

Description

label

String

0..1

Label to display in tab

location

String

1..1

Which region to add the view to

toolbar

toolbar

0..1

Actions and components to show at top of map

scalebar

toolbar

0..1

Actions and components to show at bottom of map

contextmenu

context menu

0..1

The definition for the right click menu

showloading

boolean

0..1

If a progress bar is included in the client setting this value to true should enable the progress bar when requesting map images from Weave.

scales

list of scale

0..1

A list of fixed scales to use for the map. If this value is set then the user will only be able to zoom to these fixed scales.

Only scales or resolutions should be set.

resolutions

list of resolution

0..1

A list of fixed resolutions to use for the map. If this value is set then the user will only be able to zoom to these fixed resolutions.

Only scales or resolutions should be set. If you have the choice choose resolutions because in the end the scales are converted to resolutions and because of the vagaries of JavaScript maths that conversion may not be as accurate as specifying the resolutions directly.

toc

table of contents

0..1

A reference to a toc model to represent the layers in the map.

Generally this value should be set and is really only optional to allow for a quick initial setup for testing purposes as a simple toc model will be generated based on the included  map engines if it is not set.

extents

list of map extents

1..1

Contains the initial, full and limit extents of the map

crs

String

0..1

Coordinate reference system to use for the map

control

map control

0..n

An additional map component to be placed on the map

mapEngine

map engine

1..n

A source for data to display on the map.

Alternatively rather than having one or more mapEngine tags you can have a single mapEngines tag that includes one or more mapEngine tags. This allows you to reference the same group of map engines in multiple clients using a client snippet.

highlight

highlight

0..1

The default style to use to highlight an individual entity (for example when selected in a data grid)

minScale

Number

0..1

The minimum scale to zoom to when the map is zoomed into the boundary of an object.

Useful for example when you may have small object to be zoomed to and you don't want the map scale to be set to 1:20 just to match the bounds of the object. By setting this value the map will zoom to the minScale value instead.

units

String

0..1

The map units that are to be used.

displayCrs

String

0..1

The CRS to use when displaying coordinates to the user, defaults to the same value as crs.

Scales

A list of scales can be added to the map which will prevent the user from zooming to arbitrary scales, that it they'll be limited to the values provided by this list.

The list is provided in the map view as a list of <scale> values within the <scales>

<scales> <scale>1000</scale> <scale>2000</scale> <scale>5000</scale> <scale>10000</scale> <scale>20000</scale> <scale>50000</scale> <scale>100000</scale> <scale>200000</scale> <scale>500000</scale> </scales>

or as a comma-separated list of values within the <scales>

<scales>1000,2000,5000,10000,20000,50000,100000,200000,500000</scales>

Table of Contents

A map view may be associated with a Table Of Contents model to provide the user with a more user-friendly listing of the layers available in the map.

If no table of contents is linked explicitly with the map then Weave will create a generic one providing the user with a simple list of the available layers.

<toc ref="toc.vectors"/>

Extents

The administrator can set the initial extent (used when the client starts and when the user uses the ‘home extent' button), full extent (used when the user uses the 'full extent' button) and limit extent (used to restrict the users movement).

Note that these values can also be set in the defaults section of the client config, but the values set in the map view take precedence.

Coordinate Reference System

You can specify a default coordinate reference system that you wish to be used for the map. Obviously, it should be one that is supported by the map engine, and preferably (for performance reasons) the default for the map engine.

The default if not set will be EPSG:4326.

Map Controls

Keyboard

com.cohga.client.mapctrl.keyboard

Adds keyboard control to the map panel (when the map has focus) allowing the user to pan and zoom the map using the keyboard

Mouse wheel

com.cohga.client.mapctrl.navigation

Adds mouse wheel control to the map panel (when the map has focus) allowing the user to zoom in and out of the map using the mouse wheel

Scale Line

com.cohga.client.mapctrl.scaleLine

Display the current scale on the map as a line

Display the current scale on the map as a line

Scale

com.cohga.client.mapctrl.scale

Display the current scale on the map as text

Scale Bar

weave.mapctrl.scalebar

Display the current scale or scale text, or both on the map

Mouse Position

com.cohga.client.mapctrl.mousePosition

Display the current cursor position on the map

additional properties

name

default

description

name

default

description

numDigits

5

Number of digits of precision to display

granularity

10

Maximum number of pixels the mouse can move in one go before the position isn't updated

prefix

""

Text to place before the coordinates

suffix

""

Text to place after the coordinates

separator

", "

Text to place between the coordinates

halo

false

Set 'true' to enable white halo around text

background

false

Set 'true' to enable white background around text

displayProjection

 

Set the the EPSG code for the coordinate display, e.g displayProjection=”EPSG:4283”. The default is same as the map

Pan/Zoom Bar

com.cohga.client.mapctrl.panZoomBar

Add a control to the map to allow the user to directly pan and zoom the map

Zoom In/Out

com.cohga.client.mapctrl.zoomInOutPanel

Add simple zoom in and out buttons. This is a simpler alternative to the above Pan/Zoom bar.

Overview Map

com.cohga.client.mapctrl.overviewMap

Display an overview map on the map

additional properties

name

default

description

name

default

description

minRatio

8

The ratio of the overview map resolution to the main map resolution at which to zoom farther out on the overview map

maxRatio

32

The ratio of the overview map resolution to the main map resolution at which to zoom farther in on the overview map

width

180

The default width in pixels of the overview map window

height

180

The default height in pixels of the overview map window

ratios

The ratio values are used to determine if the overview map extent should be changed.

From a coding perspective, we divide the current overview map resolution by the main map resolution and compare the values to the min and max resolutions to determine if the overview map should adjust its extent.

The appropriate values are dependent upon the scales set for the main map engine in the map view.
If you want to stop the zooming try setting minRatio to a large value and maxRatio to a small value.

Attribution

com.cohga.client.mapctrl.attribution

This control requires at least version 2.4.15.

Add the 'attribution' control then add an 'attribution' option to one or more client map engines.

Touch

com.cohga.client.mapctrl.touch

Enable touch navigation for the map panel.

Highlight

You can alter the style used to highlight an individual entity (only from 2.5.18 onward) by adding a highlight tag to the map view which has the following properties

Highlight

Name

Type

Description

Name

Type

Description

vector

vector

The styling for polygon and line based entities

marker

marker

The styling for point based entities

buffer

vector

The styling for buffers

autoClear

boolean

Should the highlights be automatically removed after a fixed delay or when the map is next refreshed, default true (from 2.5.23)

autoClearDelay

integer

Number of milliesconds to wait before automatically removing the highlights if autoClear is enabled  (from 2.5.23)

Vector

Name

Type

Description

Name

Type

Description

strokeColor

string

The colour for the outline (this is a CSS colour so may have to be forced to be a string if the config file reader determines that the value you have set is an integer)

strokeOpacity

float

The opacity for the outline, 0.0 - 1.0

strokeWidth

integer

The width of the outline

fillColor

string

The colour of the fill (this is a CSS colour so may have to be forced to be a string if the config file reader determines that the value you have set is an integer)

fillOpacity

float

The opacity of the fill, 0.0 - 1.0

Marker

Name

Type

Description

Name

Type

Description

icon

string

A URL pointing to the icon to use

width

int

The width of the icon

height

int

The height of the icon

offsetx

int

The x offset for the hotspot within the icon

offsety

int

The y offset for the hotspot within the icon



Map Engines

The map engine configures the actual source for the map image. Different types of map engines can be specified and and more than one map engine can be used.

Previously one of the map engines needed to be specified as the "base layer" by setting isBaseLayer to true for that particular map engine, this is no longer the case.

There is no specific user controllable base layer as part of the map view any more, it is maintained internally by Weave.

Multiple map engines

A single map engine can represent a single map layer, for example the aerial photography from 1968, or multiple map layers, for example all of the vector data related to water utilities. They can also be combined in the client configuration so that multiple images are overlayed to combine the data from more than one map engine.

Example of using three map engine to display raster, vector and a separate selection layer.

Note that to properly use the above configuration you may also need to update your toc model or add an image slider. Also, there are issues with transparency that will need to be considered (especially if you're unlucky enough to have to support Internet Explorer 6).

A toc model suitable for the above map engine configuration would set the map engine for the selection and raster layers to the same engines as configured above, rather than leaving them assigned to the original map engine.

For example assuming that we previously had a single map engine, mapengine.main, that contained raster and vector layers and was also used to draw the selection. In this case the toc model and client config could be something like:

But if we wanted to switch to the client configuration with the three map engines then our toc model would become something like:

Which makes the default map engine mapengine.vector, and changed the selection layers map engine to mapengine.selection and the aerial photography switched to mapengine.raster.

Then on the client side, the map panel will now contain three separate map layers, one for each map engine, which may improve performance because it cuts down on the number of layers that must be drawn on the server when the user toggles a single layers visibility.

For example, the selection layers are drawn a lot quicker in the above example because when the selection is changed only the selection layers need to be redrawn, not all of the other layers that are now in the mapengine.vector layer.

Transparency and multiple map engines

This may also make it clearer as to why transparency is now an issue, previously all of the map layers were drawn on the map server at once and the map server knew how to overlay the individual layers to ensure that lower layers show through the transparency of higher layers, but now that overlaying is performed on the client, so if the client doesn't support transparency properly (IE6 with 8-bit PNG images) or if the map engine doesn't provide full transparency support (ArcIMS) then the map panel on the client can look terrible. Sometimes that can be resolved by switching the image generation to 24 or 32-bit PNG or disabling anti-aliasing.

The following 2 images show the difference between using a single map engine, where the map server is retrieving the data, generating a single map image, and sending that to the client for display, and multiple map engines, where multiple images are sent to the client where they're overlayed.

In the above situation, since one map server is generating the map image it can produce the best image, making proper use of anti-aliasing and transparency, both full and partial. But because the image includes all map layers a change to any of the layers requires a whole new image to be drawn, which could mean that every map update is slow(er).

In this situation, multiple map servers are generating the images, which means that a change to one of the layers will result in the request for a map image that has fewer layers to draw, which should result in quicker response times. Of course, this is the case if you're toggling the visibility of a single layer, if you're panning or zooming the map then the same number of map layers will need to be drawn, but there could still be a performance advantage if the map servers are running on multiple physical servers, or a server has spare capacity, since they'll be able to generate the map images at the same time (3 map servers generating 3 images with 2 layers each will be quicker than 1 map server generating 1 image with 6 layers).

The downside to this arrangement is that the map server can't optimise the final image, and further, if the map server doesn't support transparency properly then any anti-aliasing around transparent areas can look terrible. Also, some map engines (ArcIMS I'm looking at you) don't support partial transparency, so if you, for example, specify a 50% transparent yellow fill for a polygon layer and there are no layers below that layer then rather than producing a final image that has the area filled with a transparent yellow fill it will instead produce an opaque fill that is 50% yellow and 50% whatever the background colour is set to. This means that when you overlay the image on top of another image rather than getting the bottom image showing through with a yellow tint, you instead don't see the bottom image at all and just see the yellow/background colour image.

Opacity and multiple map engines

This is assuming that the top image doesn't have its opacity altered to be less than 100%, which is a different issue altogether.
Since the map engine can have its opacity set to less than 100% in the client configuration it's possible to overlay a map image from a map server that doesn't support transparency at all and still have the underlying map image show through, for example setting the opacity to 0.5 (50%) would show a mix of 50% of the underlying image and 50% of the top image. The problem here is that the overall image appears washed out.

The images below show combining a raster image with a vector image that properly supports transparency (generated by GeoServer) with the vector images' opacity set to 1 (100%)

+ =

compared to combining a raster image with a vector that doesn't support transparency, but this time with the vector opacity set to 0.5 (50%)

+ =

Image Slider

An alternative for when you have multiple overlayed map engines on the client is that you can use a slider to transition between layers. The image transition slider allows the user to dynamically adjust the opacity of a single map engine.

Two options when using a single image slider are that if you have map engines that support transparency then you can transition the underlying image and still have the overlaying image visible, or if you don't have full transparency support then you can use it to transition the overlaying image and completely replace the underlying image.

The following 3 images show an example when the transition slider is attached to a raster image map engine that's overlayed on top of a vector map engine that does not support transparency (this could also be reversed with the vector map engine on top and the transition slider attached to it to accomplish exactly the same thing). The top image shows the slider at 10%, the second at 50% and the third at 100% (when the slider is at 0% you'll only see the vector image).

You can see that the vector image is gradually replaced entirely by the raster image (the area where the two images intersect is what the client would expect to see). And you can imagine if the map engines were reversed, with the raster below the vector and the slider attached to the vector, then the process would be the same, but with the vector layer replacing the raster rather than the raster replacing the vector (since the vector image is opaque). If the map engines were reversed but the slider was still attached to the raster map engine then there would be no visible effect from the slider since the opaque vector image on top would be occluding the raster image anyway, regardless of its opacity.

The following 3 images show an example with the transition slider again attached to the raster image, but in this case, the raster map engine is below the vector map engine, but in this case, the vector map engine supports transparency, so as the slider progresses from 10% to 50% to 100% the vector layer is still visible and the raster that shows through the transparent parts of the vector image (and again when the slider is at 0% you'll only see the vector image).

In this case, the raster image is gradually exposed through the vector image. If this configuration was kept (vector on top, raster below and image slider attached to raster image) but the vector images' map server didn't support transparency then moving the slider would have no visible effect, since the layer would be hiding the raster layer no matter what opacity the raster layer is set to.

The simplest example of this is to transition between a vector and a raster layer

Here we've kept the map engine configuration in the client the same as we have in the earlier example but we've added the image trans slider to allow the user to fade in and out the vector image. This example assumes that the vector image is opaque, if it were transparent you could attach the slider to the raster image instead and you'd always have the vector image visible.

You may have noticed that the Photography layer has been removed from the toc model, which means that the only way for the user to view the aerial photography is to use the slider since it doesn't make a lot of sense to allow the user to toggle the display of the layer via the toc panel and also use the slider to change its visibility.

If you had multiple raster layers that you wish to attach to the slider you could create something like the following toc model

Then depending upon the ordering of the map engines in the client configuration, you can attach the slider to the vector or raster map engines while also giving the user the ability to choose which raster layer to display.

Client-side map engines

All of the map engines configured in the client in the previous examples use the Weave server to generate the map images on behalf of the client, that is the Weave client is communicating with the Weave server to generate the map images and the Weave server is calling the map engine to create the images which are then sent back to the client.

An alternative to this is to have the client directly call the map engine to generate the images and bypass the Weave server altogether. Unfortunately at this stage, ArcIMS and ArcGIS SOAP are NOT directly supported in this configuration but can be used if accessed via WMS, which is supported by the client.

One reason for doing this would be to improve performance as it removes the extra layer of interaction with the Weave server, but it does mean that the client will require direct access to the map engine, whereas previously since it was the Weave server that was supplying the client with the images no access was required to the actual map engine by the client. So while performance may improve security will decrease and configuration complexity will increase.

Another limitation of this method is that as far as the user is concerned there is only a single layer coming from the map engine, even if the image generated by the map engine is composed of multiple feature layers. This means that if you add multiple map engines to the client configuration all pointing to client-side map engines then the toc model must be set up to include a single layer entry for each engine, and the user can only display or hide the whole layer, not individual layers within the map engine.

One issue that arises when using a map engine that only the client knows about is when it comes time to generate a report with a map embedded in it. Currently, this requires a duplicate map engine to be configured for the server to use and the client map engine configuration setup to tell Weave that it should use this map engine when it needs to generate a map on the server.

So for example let's look at what we'd need to set up the client with a very simple WMS map engine

All we've done here is set the map engine type to wms (the default is 'weave') and provided it with the URL that it needs to access the server. From there the client will directly interact with the WMNS server and not Weave when it needs to draw a map image.

From here if we want the user to be able to generate a report containing a map then we need to alter the client map engine configuration to tell it how the server can access this map engine.

To do this we need to first add a new map engine configuration pointing to the WMS server then alter the client map engine configuration to point to this new map engine

Here we've created a new server-side map engine that reflects the map engine used by the client and then set up the client to tell the server to use this map engine when it needs to generate a map image. We've also restricted the layers available through that map service to a single layer. The id used for the layers is taken from the WMS map service, in the example URL I used 0:2 is the id for a 2005 aerial photography layer.

Tiled map engines

The client-side map stuff is all well and good but the best reason for using a client-side map engine is that the client can then use a tiled map service. This is a map service where the map is generated in smaller tiles rather than as a single whole image, this provides large advantages in performance because once an individual tile is cached in the client browser they don't need to download or generate that tile again, which results in significant speed improvements for the client compared to generating a complete map image each time the user alter the map display.

The downside to tiled map engines is that they are fixed images and the user can not turn on and off the display of sub-layers within the map image. Whilst this generally isn't an issue for aerial photography-type map images or some other raster-based layers it can be a problem with vector layers.

For example, if you have a map engine composed of three vector layers and you want to give the user the option to turn on and off the display of each of the layers individually you would need to generate 8 tile caches. One with no layers, three for when only one