From 72d1235c09aeecdd9c20e32e6a989352d30a09cc Mon Sep 17 00:00:00 2001 From: PaulAlexander Date: Tue, 25 Oct 2011 06:28:45 +0000 Subject: [PATCH] Item11187: Additional Layer Forms git-svn-id: http://svn.foswiki.org/trunk/OpenLayersPlugin@12871 0b4bb1d4-4e5a-0410-9cc4-b2b747904278 --- .../OpenLayers/GoogleLayerForm.txt | 7 + data/Applications/OpenLayers/KMLLayerForm.txt | 9 + .../Applications/OpenLayers/LayerTypeForm.txt | 4 +- .../OpenLayers/WikiVectorForm.txt | 3 +- .../Applications/OpenLayers/WorldWindForm.txt | 14 + lib/Foswiki/Plugins/OpenLayersPlugin.pm | 294 +++++++++++++----- 6 files changed, 255 insertions(+), 76 deletions(-) create mode 100644 data/Applications/OpenLayers/GoogleLayerForm.txt create mode 100644 data/Applications/OpenLayers/KMLLayerForm.txt create mode 100644 data/Applications/OpenLayers/WorldWindForm.txt diff --git a/data/Applications/OpenLayers/GoogleLayerForm.txt b/data/Applications/OpenLayers/GoogleLayerForm.txt new file mode 100644 index 0000000..4b9f0df --- /dev/null +++ b/data/Applications/OpenLayers/GoogleLayerForm.txt @@ -0,0 +1,7 @@ +%META:TOPICINFO{author="BaseUserMapping_333" comment="reprev" date="1319510445" format="1.1" reprev="1" version="2"}% +| *Name* | *Type* | *Size* | *Values* | *Tooltips* | *Attributes* | +| Name | text | | | | | +| Type | select+values | | Road=google.maps.MapTypeId.ROADMAP,Terrain=google.maps.MapTypeId.TERRAIN,Hybrid=google.maps.MapTypeId.HYBRID,Satelite=google.maps.MapTypeId.SATELLITE | | | + +%META:FORM{name="LayerTypeForm"}% +%META:FIELD{name="LayerType" attributes="" title="LayerType" value="google"}% diff --git a/data/Applications/OpenLayers/KMLLayerForm.txt b/data/Applications/OpenLayers/KMLLayerForm.txt new file mode 100644 index 0000000..d0e2165 --- /dev/null +++ b/data/Applications/OpenLayers/KMLLayerForm.txt @@ -0,0 +1,9 @@ +%META:TOPICINFO{author="BaseUserMapping_333" date="1319517998" format="1.1" version="1"}% +| *Name* | *Type* | *Size* | *Values* | *Tooltips* | *Attributes* | +| Name | text | | | {String} | | +| URL | text | | | {String} Base URL | | +| ExtractAttributes | text | | | {Boolean} Extract attributes from KML. | | +| IsVisible | text | | | | | + +%META:FORM{name="LayerTypeForm"}% +%META:FIELD{name="LayerType" attributes="" title="LayerType" value="kml"}% diff --git a/data/Applications/OpenLayers/LayerTypeForm.txt b/data/Applications/OpenLayers/LayerTypeForm.txt index 35d56aa..ca8b3e8 100644 --- a/data/Applications/OpenLayers/LayerTypeForm.txt +++ b/data/Applications/OpenLayers/LayerTypeForm.txt @@ -1,4 +1,4 @@ -%META:TOPICINFO{author="BaseUserMapping_333" comment="save topic" date="1319438109" format="1.1" reprev="1" version="1"}% +%META:TOPICINFO{author="BaseUserMapping_333" comment="save topic" date="1319517743" format="1.1" reprev="1" version="3"}% %META:TOPICPARENT{name="WebPreferences"}% | *Name* | *Type* | *Size* | *Values* | *Tooltips* | *Attributes* | -| LayerType | select | | vector,wms,worldwind | | | +| LayerType | select | | google,kml,vector,wfs,wms,worldwind | | | diff --git a/data/Applications/OpenLayers/WikiVectorForm.txt b/data/Applications/OpenLayers/WikiVectorForm.txt index f3a99ee..96925b0 100644 --- a/data/Applications/OpenLayers/WikiVectorForm.txt +++ b/data/Applications/OpenLayers/WikiVectorForm.txt @@ -1,9 +1,10 @@ -%META:TOPICINFO{author="BaseUserMapping_333" comment="save topic" date="1319438062" format="1.1" reprev="1" version="1"}% +%META:TOPICINFO{author="BaseUserMapping_333" comment="save topic" date="1319520384" format="1.1" reprev="1" version="2"}% | *Name* | *Type* | *Size* | *Values* | *Tooltips* | *Attributes* | | Name | text | | | | | | URL | text | | | | | | Clustering | text | | | | | | Style | text | | | | | +| IsBaseLayer | select | | false,true | | | %META:FORM{name="LayerTypeForm"}% %META:FIELD{name="LayerType" attributes="" title="LayerType" value="vector"}% diff --git a/data/Applications/OpenLayers/WorldWindForm.txt b/data/Applications/OpenLayers/WorldWindForm.txt new file mode 100644 index 0000000..d4896d2 --- /dev/null +++ b/data/Applications/OpenLayers/WorldWindForm.txt @@ -0,0 +1,14 @@ +%META:TOPICINFO{author="BaseUserMapping_333" comment="save topic" date="1319503546" format="1.1" reprev="1" version="1"}% +%META:TOPICPARENT{name="WebTopicList"}% +| *Name* | *Type* | *Size* | *Values* | *Tooltips* | *Attributes* | +| Name | text | | | {String} | | +| URL | text | | | {String} Base URL | | +| TileSize | text | | | {Float} Level zero tile size degrees | | +| ZoomLevels | text | | | {Integer} number of zoom levels | | +| ServerParams | text | | | {Object} additional parameters | | +| ClientOptions | text | | | {Object} additional options | | +| IsBaseLayer | text | | | | | +| IsVisible | text | | | | | + +%META:FORM{name="LayerTypeForm"}% +%META:FIELD{name="LayerType" attributes="" title="LayerType" value="worldwind"}% diff --git a/lib/Foswiki/Plugins/OpenLayersPlugin.pm b/lib/Foswiki/Plugins/OpenLayersPlugin.pm index 26d111f..afbcc0a 100644 --- a/lib/Foswiki/Plugins/OpenLayersPlugin.pm +++ b/lib/Foswiki/Plugins/OpenLayersPlugin.pm @@ -42,6 +42,8 @@ our $NO_PREFS_IN_TOPIC = 1; my $pubUrlPath ; # my $hostUrl; +my $isGoogleLayer; +my $mapProjection; sub initPlugin { my ( $topic, $web, $user, $installWeb ) = @_; @@ -89,6 +91,65 @@ sub initPlugin { # Plugin correctly initialized return 1; } + +sub typehandler_worldwind { + my ($layerObject, $layerFormObject) = @_; + my ($layerweb, $layertopic) = ($layerObject->web(), $layerObject->topic()); + my @fields = $layerObject->find('FIELD'); + my %data; + my @returnString; + + foreach my $field (@fields) { + $data{$field->{name}} = $field->{value}; + } + if ($data{URL} and $data{URL} =~ /\w/) { + if (not $data{URL} =~ /^(\/|$Foswiki::cfg{LinkProtocolPattern})/) { + my ($dataweb, $datatopic) = Foswiki::Func::normalizeWebTopicName($layerweb, $data{URL}); + $data{URL} = Foswiki::Func::getScriptUrl($dataweb, $datatopic, qw(view skin text section json)); + } + } else { + return "[[$layerweb.$layertopic]] does not contain a URL"; + } + + push @returnString, <<"HERE"; + var wwlayer$layertopic = new OpenLayers.Layer.WorldWind( "$data{Name}", + "$data{URL}", $data{TileSize}, $data{ZoomLevels}, + {$data{ServerParams}}, {$data{ClientOptions}}); + map.addLayers([wwlayer$layertopic]); +HERE + + my $returnString = "\n".join("\n", @returnString)."\n"; + + return $returnString; + +} + +sub typehandler_google { + my ($layerObject, $layerFormObject) = @_; + my ($layerweb, $layertopic) = ($layerObject->web(), $layerObject->topic()); + my @fields = $layerObject->find('FIELD'); + my %data; + my @returnString; + $isGoogleLayer = 'true'; + + foreach my $field (@fields) { + $data{$field->{name}} = $field->{value}; + } + + push @returnString, <<"HERE"; + var googlelayer$layertopic = new OpenLayers.Layer.Google.v3( + "$data{Name}", + {type: $data{Type}, numZoomLevels: 22} + ); + map.addLayers([googlelayer$layertopic]); +HERE + + my $returnString = "\n".join("\n", @returnString)."\n"; + + return $returnString; + +} + sub typehandler_wms { my ($layerObject, $layerFormObject) = @_; my ($layerweb, $layertopic) = ($layerObject->web(), $layerObject->topic()); @@ -105,7 +166,7 @@ sub typehandler_wms { $data{URL} = Foswiki::Func::getScriptUrl($dataweb, $datatopic, qw(view skin text section json)); } } else { - return "$layerweb.$layertopic does not contain a URL"; + return "[[$layerweb.$layertopic]] does not contain a URL"; } push @returnString, <<"HERE"; @@ -121,14 +182,69 @@ HERE return $returnString; } +sub typehandler_kml { + my ($layerObject, $layerFormObject) = @_; + my ($layerweb, $layertopic) = ($layerObject->web(), $layerObject->topic()); + my @fields = $layerObject->find('FIELD'); + my %data; + my @returnString; + + my $isBaseLayer = $data{IsBaseLayer}; + $isBaseLayer = 'false' unless defined $isBaseLayer; + $isBaseLayer = ($isBaseLayer eq 'true')?'true':'false'; + + foreach my $field (@fields) { + $data{$field->{name}} = $field->{value}; + } + if ($data{URL} and $data{URL} =~ /\w/) { + if (not $data{URL} =~ /^(\/|$Foswiki::cfg{LinkProtocolPattern})/) { + my ($dataweb, $datatopic) = Foswiki::Func::normalizeWebTopicName($layerweb, $data{URL}); + $data{URL} = Foswiki::Func::getScriptUrl($dataweb, $datatopic, qw(view skin text section json)); + } + } else { + return "[[$layerweb.$layertopic]] does not contain a URL"; + } + + push @returnString, <<"HERE"; + var kmllayer$layerweb$layertopic = new OpenLayers.Layer.Vector( + "$data{Name}", + { strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Cluster()], + protocol: new OpenLayers.Protocol.HTTP({ + url: "$data{URL}", + format: new OpenLayers.Format.KML({ + extractStyles: true, + extractAttributes: false + }) + }), + styleMap: new OpenLayers.StyleMap({ + "default": style, + "select": { + fillColor: "#8aeeef", + strokeColor: "#32a8a9" + } + }) + isBaseLayer:$isBaseLayer + }); + + map.addLayers([kmllayer$layerweb$layertopic]); +HERE + my $returnString = "\n".join("\n", @returnString)."\n"; + + return $returnString; + +} sub typehandler_vector { my ($layerObject, $layerFormObject) = @_; my ($layerweb, $layertopic) = ($layerObject->web(), $layerObject->topic()); my @fields = $layerObject->find('FIELD'); my %data; - my @returnString; + my @returnString; + + my $isBaseLayer = $data{IsBaseLayer}; + $isBaseLayer = 'false' unless defined $isBaseLayer; + $isBaseLayer = ($isBaseLayer eq 'true')?'true':'false'; foreach my $field (@fields) { $data{$field->{name}} = $field->{value}; @@ -139,7 +255,7 @@ sub typehandler_vector { $data{URL} = Foswiki::Func::getScriptUrl($dataweb, $datatopic, qw(view skin text section json)); } } else { - return "$layerweb.$layertopic does not contain a URL"; + return "[[$layerweb.$layertopic]] does not contain a URL"; } push @returnString, <<"HERE"; @@ -148,8 +264,10 @@ sub typehandler_vector { url: '$data{URL}', format: new OpenLayers.Format.GeoJSON({}) }), + isBaseLayer:$isBaseLayer, strategies: [new OpenLayers.Strategy.Fixed()] }); + map.addLayers([wikilayer$layerweb$layertopic]); HERE @@ -187,6 +305,12 @@ sub _OPENLAYERSMAP { "", "OPENLAYERSPLUGIN" ); +# Foswiki::Func::addToZone( +# "script", +# "OPENLAYERSPLUGIN::OPENLAYERMAP::OPENLAYERS", +# "", +# "OPENLAYERSPLUGIN" +# ); Foswiki::Func::addToZone( "script", @@ -195,24 +319,25 @@ sub _OPENLAYERSMAP { ); my @mapMetadata; + my @scriptVariable; my $mapHeight = $params->{mapheight}; $mapHeight = '600' unless defined $mapHeight; $mapHeight = $mapHeight.'px'; - push @mapMetadata, "mapHeight:$mapHeight"; +# push @mapMetadata, "mapHeight:$mapHeight"; my $mapWidth = $params->{mapwidth}; $mapWidth = 'my800' unless defined $mapWidth; $mapWidth = $mapWidth.'px'; - push @mapMetadata, "mapHeight:$mapWidth"; +# push @mapMetadata, "mapHeight:$mapWidth"; my $mapViewPort = $params->{viewport}; $mapViewPort = '159,-32' unless defined $mapViewPort; - push @mapMetadata, "mapViewPort:$mapViewPort"; +# push @mapMetadata, "mapViewPort:$mapViewPort"; my $mapViewPortZoom = $params->{viewportzoom}; $mapViewPortZoom = '1' unless defined $mapViewPortZoom; - push @mapMetadata, "mapViewPortZoom:$mapViewPortZoom"; +# push @mapMetadata, "mapViewPortZoom:$mapViewPortZoom"; my @layerScripts; @@ -221,12 +346,6 @@ sub _OPENLAYERSMAP { my $mapsTopic = Foswiki::Func::getPreferencesValue('OPENLAYERSPLUGIN_DEFAULTMAP') || 'Applications/OpenLayers/Layers/DefaultMap'; - push @layerScripts, <<"HERE"; - // Rendering Default Base Map - var mapOptions = { maxResolution: 45/512, numZoomLevels: 11, fractionalZoom: true}; - map = new OpenLayers.Map(mapOptions); -HERE - # Default Base MAP # push @layerScripts, <<"HERE"; @@ -249,7 +368,7 @@ HERE # return 'No layer topics specified!'; # Assign a Default Map - push @layers, $mapsTopic; +# push @layers, $mapsTopic; } foreach my $layername (@layers) { @@ -269,10 +388,10 @@ HERE if (ref($layertype) eq 'HASH' and $layertype->{value}) { $layertype = $layertype->{value}; } else { - return "$layerweb.$layertopic form $formweb.$formtopic didn't have a LayerType field[[$layerweb.$layertopic]] form [[$formweb.$formtopic]] didn't have a LayerType field$layerweb.$layertopic didn't have a form attached"; + return "[[$layerweb.$layertopic]] didn't have a form attached"; } if (scalar(@fields)) { my %data; #= map { $_->{name} => $_->{value} } @{$fields}; @@ -280,7 +399,6 @@ HERE if (defined &{$typehandler}) { my $result; - { no strict 'refs'; $result = &{$typehandler}($topicObject, $formObject); @@ -288,20 +406,41 @@ HERE } push @layerScripts, $result; } else { - return "$layerweb.$layertopic form $formweb.$formtopic: no handler for '$layertype' type"; + return "[[$layerweb.$layertopic]] form [[$formweb.$formtopic]]: no handler for '$layertype' type"; } } else { - return "$layerweb.$layertopic doesn't contain any formfield values" + return "[[$layerweb.$layertopic]] doesn't contain any formfield values" } - - my $mapLayerSwitcher = $params->{layerswitcher}; - $mapLayerSwitcher = 'off' unless defined $mapLayerSwitcher; - $mapLayerSwitcher = ($mapLayerSwitcher eq 'on')?'true':'false'; - if ($mapLayerSwitcher) { - push @layerScripts, 'map.addControl(new OpenLayers.Control.LayerSwitcher({}));'; - } } + +# push @scriptVariable, <<"HERE"; +# // Rendering Default Base Map +# //var mapOptions = {allOverlays: true}; +# var mapOptions = { maxResolution: 45/512, numZoomLevels: 11, fractionalZoom: true}; +# //map = new OpenLayers.Map(mapOptions); +# +# +# //mapOptions = { +# // projection: "EPSG:900913", +# // units: "m", +# // maxExtent: new OpenLayers.Bounds( -20037508, -20037508, 20037508, 20037508) +# // }; +# +# var map = new OpenLayers.Map(mapOptions); +# HERE + + push @scriptVariable, <<"HERE"; + var mapOptions = { maxResolution: 45/512, numZoomLevels: 11, fractionalZoom: true}; + var map = new OpenLayers.Map(mapOptions); +HERE + + my $mapLayerSwitcher = $params->{layerswitcher}; + $mapLayerSwitcher = 'off' unless defined $mapLayerSwitcher; + $mapLayerSwitcher = ($mapLayerSwitcher eq 'on')?'true':'false'; + if ($mapLayerSwitcher) { + push @scriptVariable, 'map.addControl(new OpenLayers.Control.LayerSwitcher({}));'; + } my $mapMaxResolution = $params->{mapmaxresolution} || '45/512'; my $mapMinResolution = $params->{mapminresulution} || 'auto'; @@ -311,31 +450,31 @@ HERE my $mapProjection = $params->{mapprojection} || 'EPSG:4326'; my $mapUnits = $params->{mapunits} || 'degrees'; # my $mapFractionalZoom = $params->{fractionalzoom} || 'on'; +# +# my $baseLayerName = $params->{name} || 'Base Layer'; +# my $baseLayerMinZoomLevel = $params->{baselayerminzoomlevel} || '23'; +# my $baseLayerMaxZoomLevel = $params->{baselayermaxzoomlevel} || '23'; +# my $baseLayerURL = $params->{url} || 'http://vmap0.tiles.osgeo.org/wms/vmap0'; +# my $baseLayerParams = $params->{params} || 'layers: \'basic\''; +# my $baseLayerOptions = $params->{options} || '23'; +# my $extraProjections = $params->{extraprojections} || 'don\'t include Proj4js if only basic functions required'; +# +# my $vectorLayerName = $params->{vectorlayername} || 'Vector Layer'; +# my $vectorLayerCluster = $params->{vectorLayerCluster} || 'on' ; +# my $mapVectorLayerEditingToolbar = $params->{mapvectorlayereditingtoolbar} || 'off'; +# +# my $vectorLayerFeatures = $params->{vectorlayerfeatures} || 'filename or GEOJSON'; - my $baseLayerName = $params->{name} || 'Base Layer'; - my $baseLayerMinZoomLevel = $params->{baselayerminzoomlevel} || '23'; - my $baseLayerMaxZoomLevel = $params->{baselayermaxzoomlevel} || '23'; - my $baseLayerURL = $params->{url} || 'http://vmap0.tiles.osgeo.org/wms/vmap0'; - my $baseLayerParams = $params->{params} || 'layers: \'basic\''; - my $baseLayerOptions = $params->{options} || '23'; - my $extraProjections = $params->{extraprojections} || 'don\'t include Proj4js if only basic functions required'; - - my $vectorLayerName = $params->{vectorlayername} || 'Vector Layer'; - my $vectorLayerCluster = $params->{vectorLayerCluster} || 'on' ; - my $mapVectorLayerEditingToolbar = $params->{mapvectorlayereditingtoolbar} || 'off'; - - my $vectorLayerFeatures = $params->{vectorlayerfeatures} || 'filename or GEOJSON'; - - my $kmlLayer = $params->{kmllayerfilename} || 'filename'; - - my $osmLayerName = $params->{osmlayername}|| 'OSM Layer'; - my $osmLayerAttribution = $params->{osmlayerattribution} || '23'; - - my $wmsLayerName = $params->{wmslayername} || 'WMS Layer'; - my $wmsLayerURL = $params->{wmslayerurl} || 'http://vmap0.tiles.osgeo.org/wms/vmap0'; - my $wmsLayerParams = $params->{wmslayerparams}|| 'default'; - my $wmsIsBaseLayer = $params->{wmsisbaselayer} || 'isBaseLayer:true'; - my $wmsLayerOpacity = $params->{wmslayeropacity} || 'opacity: .5'; +# my $kmlLayer = $params->{kmllayerfilename} || 'filename'; +# +# my $osmLayerName = $params->{osmlayername}|| 'OSM Layer'; +# my $osmLayerAttribution = $params->{osmlayerattribution} || '23'; +# +# my $wmsLayerName = $params->{wmslayername} || 'WMS Layer'; +# my $wmsLayerURL = $params->{wmslayerurl} || 'http://vmap0.tiles.osgeo.org/wms/vmap0'; +# my $wmsLayerParams = $params->{wmslayerparams}|| 'default'; +# my $wmsIsBaseLayer = $params->{wmsisbaselayer} || 'isBaseLayer:true'; +# my $wmsLayerOpacity = $params->{wmslayeropacity} || 'opacity: .5'; my $mapFractionalZoom = $params->{fractionalzoom}; @@ -346,20 +485,11 @@ HERE my @layerList = (); my @jsFragments; - my @scriptVariable; # my @createMap; - my $isGoogleLayer; +# my $isGoogleLayer; my $mapLayers = $params->{layers}; - push @layerScripts, <<"HERE"; - var viewportcorner = new OpenLayers.LonLat($mapViewPort); - if (map.isValidLonLat(viewportcorner) && $mapViewPortZoom) { - map.moveTo(viewportcorner,$mapViewPortZoom); - } -HERE - - push @scriptVariable, @layerScripts; my $mapDiv=''; my $mapElement = $params->{mapelement}; @@ -395,30 +525,48 @@ HERE } }); HERE +# +# push @scriptVariable, <<"HERE"; +# var strategy = new OpenLayers.Strategy.Cluster(); +# strategy.distance= 20; +# strategy.threshold=2; +# var styleselect = new OpenLayers.Style({fillColor: "#8aeeef",strokeColor: "#32a8a9"}); +# +# var styleMap= new OpenLayers.StyleMap({ +# "default": style, +# "select": styleselect }); +# HERE - push @scriptVariable, <<"HERE"; - var strategy = new OpenLayers.Strategy.Cluster(); - strategy.distance= 20; - strategy.threshold=2; - var styleselect = new OpenLayers.Style({fillColor: "#8aeeef",strokeColor: "#32a8a9"}); - - var styleMap= new OpenLayers.StyleMap({ - "default": style, - "select": styleselect }); -HERE +# push @scriptVariable, <<"HERE"; +# if(!map.getCenter()){ +# map.zoomToMaxExtent(); +# } +# map.render('$mapElement'); +# HERE push @scriptVariable, <<"HERE"; - if(!map.getCenter()){ - map.zoomToMaxExtent(); + // if (map.isValidLonLat(viewportcorner) && $mapViewPortZoom) { + // map.moveTo(viewportcorner,$mapViewPortZoom); + // } + var viewportcorner = new OpenLayers.LonLat($mapViewPort); + + var proj = new OpenLayers.Projection("EPSG:4326"); + if (map.isValidLonLat(viewportcorner) && $mapViewPortZoom) { + var point = new OpenLayers.LonLat(133, -28); + point.transform(proj, map.getProjectionObject()); + map.setCenter(point, 4); + //map.moveTo(viewportcorner,$mapViewPortZoom); } + map.render('$mapElement'); + HERE if ($isGoogleLayer eq 'true') { Foswiki::Func::addToZone( "script", "OPENLAYERSPLUGIN", - "" + "" ); }