Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

lizard-map

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.
https://secure.travis-ci.org/lizardsystem/lizard-map.png?branch=master

Translation status:

https://translations.lizard.net/projects/p/lizardsystem/resource/lizard-map/chart/image_png

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.

Collages

A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.

Interaction

Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.

Dependencies

Almost all dependencies are listed in our setup.py, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

[buildout]
...
parts =
sysegg
...
[sysegg]
recipe = osc.recipe.sysegg
force-sysegg = true
eggs =
PIL
matplotlib
simplejson
pyproj

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python bootstrap.py

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in setup.py or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python setup.py develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review urls.py for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your setup.py: install_requires)

  • Add 'lizard_map' to your settings.py: INSTALLED_APPS.

  • Add an entry in your urls.py:

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
    
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView
class MyAppView(AppView):
template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}
{% block subtitle %} (page name) {% endblock %}
{% block sidebar %}
<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
<h2>Apps</h2>
<ul>
<li>
<a href="/address/" class="lizard-map-link">
<img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />
<div>App</div>
</a>
</li>
</ul>
</div>
{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}
{% endblock %}
  • Add this view to your url.py:

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.

Settings

Some default date range settings can be set in settings.py. All settings are optional:

START_YEAR = 2000 # Defaults to today - 7 years
END_YEAR = 2010 # Defaults to today + 3 years.
# Define default period 1..5
# From daterange.py:
# PERIOD_DAY = 1
# PERIOD_TWO_DAYS = 2
# PERIOD_WEEK = 3
# PERIOD_MONTH = 4
# PERIOD_YEAR = 5
# PERIOD_OTHER = 6
DEFAULT_PERIOD = 5 # Defaults to 1
# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20 # Defaults to -1000
DEFAULT_END_DAYS = 1 # Defaults to 10

You can add google analytics to your site by adding the tracking code:

GOOGLE_TRACKING_CODE = 'AA-12345678-0'

About

Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.

Resources

Stars

6 stars

Watchers

12 watching

Forks

Releases

Packages

Contributors

Languages