openlayers中利用vector实现marker的方式
项目需要一个小型的gis。openlayers,geoserver,postgres组合是比较好的选择。
openlayers的marker层好像不支持拖动操作。通过研究api发现,可以利用vector层
达到这个目的,作出标注的效果。可以定位,搜索,拖动等效果,选中的时候可以
通过修改style达到动画效果。
基本做法如下:
1:定义marker显示的样式
2:扩展vector层,利用在扩展层上添加point与style,图片显示point就出现标注的
效果
基本代码如下:
定义样式:
- $package("com.bct.map");
- com.bct.map.EncoderMarkerStyle = {
- 'bigEncoder':{
- graphicWidth:,
- graphicHeight : ,
- graphicXOffset : -,
- graphicYOffset : -,
- externalGraphic : "scripts/map/img/channel2.png"
- },
- 'smallEncoder':{
- graphicWidth:,
- graphicHeight : ,
- graphicXOffset : -,
- graphicYOffset : -,
- externalGraphic : "scripts/map/img/channel.gif"
- },
- 'selectStyle':{
- pointerEvents: "visiblePainted",
- border:"border:25 outset #ff88ff",
- cursor: "pointer",
- graphicWidth:,
- graphicHeight : ,
- graphicXOffset : -,
- graphicYOffset : -,
- externalGraphic : "scripts/map/img/channel2.png"
- },
- styleMap: new OpenLayers.StyleMap({
- "select": new OpenLayers.Style({pointRadius: })
- })
- }
- $package("com.bct.map");
- com.bct.map.EncoderMarkerStyle = {
- 'bigEncoder':{
- graphicWidth:24,
- graphicHeight : 24,
- graphicXOffset : -12,
- graphicYOffset : -24,
- externalGraphic : "scripts/map/img/channel2.png"
- },
- 'smallEncoder':{
- graphicWidth:16,
- graphicHeight : 16,
- graphicXOffset : -8,
- graphicYOffset : -16,
- externalGraphic : "scripts/map/img/channel.gif"
- },
- 'selectStyle':{
- pointerEvents: "visiblePainted",
- border:"border:25 outset #ff88ff",
- cursor: "pointer",
- graphicWidth:24,
- graphicHeight : 24,
- graphicXOffset : -12,
- graphicYOffset : -24,
- externalGraphic : "scripts/map/img/channel2.png"
- },
- styleMap: new OpenLayers.StyleMap({
- "select": new OpenLayers.Style({pointRadius: 24})
- })
- }
2:扩展向量层
- $package("com.bct.map");
- $import("com.bct.map.EncoderMarkerStyle");
- com.bct.map.MarkerVectorLayer = OpenLayers.Class(OpenLayers.Layer.Vector,{
- /**
- * parameters
- * attribute filer对象
- */
- getFeatureByAttribute :function(attributes){
- var feature = null;
- for(var i=;i<this.features.length; ++i){
- var attri = this.features[i].attributes;
- var find = false;
- for(var j in attributes){
- if(attributes[j] == attri[j]){
- find = true;
- }
- }
- if(find){
- return this.features[i];
- }
- }
- },
- //添加Feature,是point显示为图片
- addEncorderFeature:function(encNode,location){
- if(encNode&&this.repetitiveCheck(encNode.id)){
- return;
- }
- var attributes = OpenLayers.Util.extend({}, encNode.attributes);
- var enc_point = new OpenLayers.Geometry.Point(location.lon,location.lat);
- var enc_Feature = new OpenLayers.Feature.Vector(enc_point,attributes,com.bct.map.EncoderMarkerStyle['smallEncoder']);
- this.addFeatures([enc_Feature]);
- if(encNode.attributes['lon']&&encNode.attributes['lat']&&encNode.attributes['lon'].length>){
- return;
- }
- this.updateChannel(encNode.id,location.lon,location.lat);
- },
- repetitiveCheck:function(entity_id){
- if(this.getFeatureByAttribute({id:entity_id})){
- return true;
- }
- return false;
- },
- updateChannel:function(channel_id,lon,lat){
- Ext.Ajax.request({
- url: 'deviceVideoEncoder.do?method=updateLonlat&id='+channel_id+"&lon="+lon+"&lat="+lat
- });
- },
- channelMarkerClick:function() {
- var features = this.selectedFeatures;
- if(features.length >=&&features[]) {
- feature = features[];
- var treeNodeAttribute = feature.attributes;
- //显示信息
- }
- },
- cartoonFeature :function(feature){
- this.drawFeature(feature,com.bct.map.EncoderMarkerStyle['bigEncoder']);
- var runner = new Ext.util.TaskRunner();
- var task = {
- run:this.drawFeature,
- scope:this,
- args:[feature,com.bct.map.EncoderMarkerStyle['smallEncoder']],
- interval:
- }
- runner.start(task);
- },
- removeSelectFeature:function(){
- var features = this.selectedFeatures;
- for(var i=features.length-; i>=; i--) {
- feature = features[i];
- this.updateChannel(feature.attributes['id'],"","");
- }
- this.destroyFeatures(this.selectedFeatures);
- },
- monitorSelectFeature:function(){
- var features = this.selectedFeatures;
- if(features.length >=&&features[]) {
- feature = features[];
- var treeNodeAttribute = feature.attributes;
- var objId="mapAVShow"+treeNodeAttribute['id'];
- //弹出窗口
- }
- }
- });
- $package("com.bct.map");
- $import("com.bct.map.EncoderMarkerStyle");
- com.bct.map.MarkerVectorLayer = OpenLayers.Class(OpenLayers.Layer.Vector,{
- /**
- * parameters
- * attribute filer对象
- */
- getFeatureByAttribute :function(attributes){
- var feature = null;
- for(var i=0;i<this.features.length; ++i){
- var attri = this.features[i].attributes;
- var find = false;
- for(var j in attributes){
- if(attributes[j] == attri[j]){
- find = true;
- }
- }
- if(find){
- return this.features[i];
- }
- }
- },
- //添加Feature,是point显示为图片
- addEncorderFeature:function(encNode,location){
- if(encNode&&this.repetitiveCheck(encNode.id)){
- return;
- }
- var attributes = OpenLayers.Util.extend({}, encNode.attributes);
- var enc_point = new OpenLayers.Geometry.Point(location.lon,location.lat);
- var enc_Feature = new OpenLayers.Feature.Vector(enc_point,attributes,com.bct.map.EncoderMarkerStyle['smallEncoder']);
- this.addFeatures([enc_Feature]);
- if(encNode.attributes['lon']&&encNode.attributes['lat']&&encNode.attributes['lon'].length>0){
- return;
- }
- this.updateChannel(encNode.id,location.lon,location.lat);
- },
- repetitiveCheck:function(entity_id){
- if(this.getFeatureByAttribute({id:entity_id})){
- return true;
- }
- return false;
- },
- updateChannel:function(channel_id,lon,lat){
- Ext.Ajax.request({
- url: 'deviceVideoEncoder.do?method=updateLonlat&id='+channel_id+"&lon="+lon+"&lat="+lat
- });
- },
- channelMarkerClick:function() {
- var features = this.selectedFeatures;
- if(features.length >=0&&features[0]) {
- feature = features[0];
- var treeNodeAttribute = feature.attributes;
- //显示信息
- }
- },
- cartoonFeature :function(feature){
- this.drawFeature(feature,com.bct.map.EncoderMarkerStyle['bigEncoder']);
- var runner = new Ext.util.TaskRunner(1000);
- var task = {
- run:this.drawFeature,
- scope:this,
- args:[feature,com.bct.map.EncoderMarkerStyle['smallEncoder']],
- interval: 1000
- }
- runner.start(task);
- },
- removeSelectFeature:function(){
- var features = this.selectedFeatures;
- for(var i=features.length-1; i>=0; i--) {
- feature = features[i];
- this.updateChannel(feature.attributes['id'],"","");
- }
- this.destroyFeatures(this.selectedFeatures);
- },
- monitorSelectFeature:function(){
- var features = this.selectedFeatures;
- if(features.length >=0&&features[0]) {
- feature = features[0];
- var treeNodeAttribute = feature.attributes;
- var objId="mapAVShow"+treeNodeAttribute['id'];
- //弹出窗口
- }
- }
- });
addEncorderFeature是添加一个标注的地方。
利用这种方式,比原有的marker层拥有更多的功能
openlayers中利用vector实现marker的方式的更多相关文章
- 在JAVA中利用public static final的组合方式对常量进行标识
在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...
- python中利用matplotlib绘图可视化知识归纳
python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...
- 从0开始:Windows内核利用的另一种方式
https://www.anquanke.com/post/id/91063 从0开始:Windows内核利用的另一种方式 阅读量 9168 | 稿费 200 分享到: 发布时间:201 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Oracle中“行转列”的实现方式
在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAM ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...
- .NET中的三种接口实现方式
摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接 ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...
随机推荐
- asp InStr
<script type="text/vbscript"> txt="This is a beautiful day!"document.write ...
- Spring Boot Controller相应JSP页面 错误whitelabel error page
在学习SpringBoot显示JSP页面的时候出现了错误,Controller可以正常调用,但是JSP页面就是不能正常显示. whitelabel error page 解决:注释掉scope < ...
- Json与bean的相互转换
本文使用json-lib jar包实现Json与bean的相互转换 1.将字符串转为JSON 使用JSONObject.fromObject(str)方法即可将字符串转为JSON对象 使用JSONOb ...
- unity--------------------四元数的旋转与原理
[Unity技巧]四元数(Quaternion)和旋转 原文:http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应 ...
- 了解ASP.NET Core 依赖注入,看这篇就够了 于2017年11月6日由jesseliu发布
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- memcached监控工具
最简单和最直接的方式是在启动memcached的时候加入-vv参数,从而在控制台打印每次客户端的请求和相应,这非常适合开发.另外一种较为直接的方式是通过telnet进行查看,例如:若server为本机 ...
- Peckham添加引用文件模糊匹配智能提示
下载地址:https://github.com/markohlebar/Peckham 跟VVDocumenter规范注释生成器的安装方式一样: 下载开源工程在Xcode重新编译运行会自动安装此插 ...
- python06 深浅拷贝原理
preface 这里主要说深浅拷贝的原理.首先说说数字与字符串作为内存对象的重用,请看代码: a1=12345 b1=12345 a2=a1 print(id(a1),id(b1),id(a2)) 打 ...
- oracle自定义类型 示例
) ); ---自定义类型传参给存储过程,示例如下: create or replace procedure dropWf is cursor c_tenant is and t.id not in ...
- python的初始化运行了哪些?
下面的3个print一个是在模块下面,一个是函数里面,一个是类名下面(不在方法里面) 1. 运行这段代码可以发现第3行和11行可以打印出来.第7行没有打印出来.所以可以放心,函数或者方法里面就算有错误 ...