影像地图

长期以来,人们一直使用HTMLImageMaps以一种轻松的方式创建交互式图像。无需使用Flash、SVG或VML,您只需将不同的链接或工具提示与图像的不同区域相关联即可。为什么我们不能在Geoserver地图上使用这种技术来达到同样的效果?其想法是将栅格地图(png、gif、jpeg等)组合在一起使用HTML ImageMap覆盖将链接、工具提示或鼠标事件行为添加到地图。

ImageMap向地图添加工具提示的示例:

<img src="..." usemap="#mymap"/>
<map name="mymap">
     <area shape="poly" coords="536,100 535,100 534,101 533,101 532,102"  title="This is a tooltip"/>
     <area shape="poly" coords="518,113 517,114 516,115 515,114"  title="Another tooltip"/>
</map>

向地图添加链接的ImageMap示例:

<img src="..." usemap="#mymap"/>
<map name="mymap">
     <area shape="poly" coords="536,100 535,100 534,101 533,101 532,102"  href="http://www.mylink.com"/>
     <area shape="poly" coords="518,113 517,114 516,115 515,114"  href="http://www.mylink2.com"/>
</map>

添加鼠标事件交互行为的一个更复杂的示例:

<img src="..." usemap="#mymap"/>
<map name="mymap">
     <area shape="poly" coords="536,100 535,100 534,101 533,101 532,102"  onmouseover="onOver('<featureid>')" onmouseout="onOut('<featureid>')"/>
     <area shape="poly" coords="518,113 517,114 516,115 515,114"   onmouseover="onOver('<featureid>')" onmouseout="onOut('<featureid>')"/>
</map>

为了在Geoserver中实现这一点,一些伟大的社区贡献者为Geoserver开发了HTMLImageMap GetMapProducer,能够响应WMS GetMap请求呈现HTMLImageMap。

GetMapProducer与文本/html MIME类型相关联。它为每个请求的层生成一个<map>...</map>部分,其中包含层的几何图形作为不同的<Area>标记。由于<Area>标记支持的形状类型的限制,一个几何体可以拆分成多个几何体。通过这种方式,几乎可以渲染任何复杂的几何体,将其转换为更简单的几何体。

为了添加交互属性,我们使用样式。特别是,包含带有标签定义的TextSymbolizer的SLD规则可用于定义<Area>标记属性的动态值。规则名称将用作属性名称。

例如,要定义标题属性(将工具提示与层的几何图形相关联),可以使用如下规则:

<Rule>
   <Name>title</Name>
   <TextSymbolizer>
      <Label><PropertyName>MYPROPERTY</PropertyName></Label>
   </TextSymbolizer>
</Rule>

要呈现多个属性,只需定义具有不同名称(href、onMouseover等)的多个规则。

样式支持并不局限于TextSymbolizers,您目前可以使用其他符号化工具来细化<Area>渲染。例如,您可以:

  • 使用具有SIZE特性的PointSymbolizer来定义点大小。

  • 使用带有笔划宽度Css参数的LineSymbolizer来创建粗线。