项目需要一个小型的gis。openlayers,geoserver,postgres组合是比较好的选择。
openlayers的marker层好像不支持拖动操作。通过研究api发现,可以利用vector层
达到这个目的,作出标注的效果。可以定位,搜索,拖动等效果,选中的时候可以
通过修改style达到动画效果。
基本做法如下:
1:定义marker显示的样式
2:扩展vector层,利用在扩展层上添加point与style,图片显示point就出现标注的
   效果
基本代码如下:
定义样式:

  1. $package("com.bct.map");
  2. com.bct.map.EncoderMarkerStyle = {
  3. 'bigEncoder':{
  4. graphicWidth:,
  5. graphicHeight : ,
  6. graphicXOffset : -,
  7. graphicYOffset : -,
  8. externalGraphic : "scripts/map/img/channel2.png"
  9. },
  10. 'smallEncoder':{
  11. graphicWidth:,
  12. graphicHeight : ,
  13. graphicXOffset : -,
  14. graphicYOffset : -,
  15. externalGraphic : "scripts/map/img/channel.gif"
  16. },
  17. 'selectStyle':{
  18. pointerEvents: "visiblePainted",
  19. border:"border:25 outset #ff88ff",
  20. cursor: "pointer",
  21. graphicWidth:,
  22. graphicHeight : ,
  23. graphicXOffset : -,
  24. graphicYOffset : -,
  25. externalGraphic : "scripts/map/img/channel2.png"
  26. },
  27. styleMap: new OpenLayers.StyleMap({
  28. "select": new OpenLayers.Style({pointRadius: })
  29. })
  30. }
  1. $package("com.bct.map");
  2. com.bct.map.EncoderMarkerStyle = {
  3. 'bigEncoder':{
  4. graphicWidth:24,
  5. graphicHeight : 24,
  6. graphicXOffset : -12,
  7. graphicYOffset : -24,
  8. externalGraphic : "scripts/map/img/channel2.png"
  9. },
  10. 'smallEncoder':{
  11. graphicWidth:16,
  12. graphicHeight : 16,
  13. graphicXOffset : -8,
  14. graphicYOffset : -16,
  15. externalGraphic : "scripts/map/img/channel.gif"
  16. },
  17. 'selectStyle':{
  18. pointerEvents: "visiblePainted",
  19. border:"border:25 outset #ff88ff",
  20. cursor: "pointer",
  21. graphicWidth:24,
  22. graphicHeight : 24,
  23. graphicXOffset : -12,
  24. graphicYOffset : -24,
  25. externalGraphic : "scripts/map/img/channel2.png"
  26. },
  27. styleMap: new OpenLayers.StyleMap({
  28. "select": new OpenLayers.Style({pointRadius: 24})
  29. })
  30. }

2:扩展向量层

  1. $package("com.bct.map");
  2. $import("com.bct.map.EncoderMarkerStyle");
  3. com.bct.map.MarkerVectorLayer = OpenLayers.Class(OpenLayers.Layer.Vector,{
  4. /**
  5. * parameters
  6. * attribute filer对象
  7. */
  8. getFeatureByAttribute :function(attributes){
  9. var feature = null;
  10. for(var i=;i<this.features.length; ++i){
  11. var attri = this.features[i].attributes;
  12. var find = false;
  13. for(var j in attributes){
  14. if(attributes[j] == attri[j]){
  15. find = true;
  16. }
  17. }
  18. if(find){
  19. return this.features[i];
  20. }
  21. }
  22. },
  23. //添加Feature,是point显示为图片
  24. addEncorderFeature:function(encNode,location){
  25. if(encNode&&this.repetitiveCheck(encNode.id)){
  26. return;
  27. }
  28. var attributes = OpenLayers.Util.extend({}, encNode.attributes);
  29. var enc_point = new OpenLayers.Geometry.Point(location.lon,location.lat);
  30. var enc_Feature = new OpenLayers.Feature.Vector(enc_point,attributes,com.bct.map.EncoderMarkerStyle['smallEncoder']);
  31. this.addFeatures([enc_Feature]);
  32. if(encNode.attributes['lon']&&encNode.attributes['lat']&&encNode.attributes['lon'].length>){
  33. return;
  34. }
  35. this.updateChannel(encNode.id,location.lon,location.lat);
  36. },
  37. repetitiveCheck:function(entity_id){
  38. if(this.getFeatureByAttribute({id:entity_id})){
  39. return true;
  40. }
  41. return false;
  42. },
  43. updateChannel:function(channel_id,lon,lat){
  44. Ext.Ajax.request({
  45. url: 'deviceVideoEncoder.do?method=updateLonlat&id='+channel_id+"&lon="+lon+"&lat="+lat
  46. });
  47. },
  48. channelMarkerClick:function() {
  49. var features = this.selectedFeatures;
  50. if(features.length >=&&features[]) {
  51. feature = features[];
  52. var treeNodeAttribute = feature.attributes;
  53. //显示信息
  54. }
  55. },
  56. cartoonFeature :function(feature){
  57. this.drawFeature(feature,com.bct.map.EncoderMarkerStyle['bigEncoder']);
  58. var runner = new Ext.util.TaskRunner();
  59. var task = {
  60. run:this.drawFeature,
  61. scope:this,
  62. args:[feature,com.bct.map.EncoderMarkerStyle['smallEncoder']],
  63. interval:
  64. }
  65. runner.start(task);
  66. },
  67. removeSelectFeature:function(){
  68. var features = this.selectedFeatures;
  69. for(var i=features.length-; i>=; i--) {
  70. feature = features[i];
  71. this.updateChannel(feature.attributes['id'],"","");
  72. }
  73. this.destroyFeatures(this.selectedFeatures);
  74. },
  75. monitorSelectFeature:function(){
  76. var features = this.selectedFeatures;
  77. if(features.length >=&&features[]) {
  78. feature = features[];
  79. var treeNodeAttribute = feature.attributes;
  80. var objId="mapAVShow"+treeNodeAttribute['id'];
  81. //弹出窗口
  82. }
  83. }
  84. });
  1. $package("com.bct.map");
  2. $import("com.bct.map.EncoderMarkerStyle");
  3. com.bct.map.MarkerVectorLayer = OpenLayers.Class(OpenLayers.Layer.Vector,{
  4. /**
  5. * parameters
  6. * attribute filer对象
  7. */
  8. getFeatureByAttribute :function(attributes){
  9. var feature = null;
  10. for(var i=0;i<this.features.length; ++i){
  11. var attri = this.features[i].attributes;
  12. var find = false;
  13. for(var j in attributes){
  14. if(attributes[j] == attri[j]){
  15. find = true;
  16. }
  17. }
  18. if(find){
  19. return this.features[i];
  20. }
  21. }
  22. },
  23. //添加Feature,是point显示为图片
  24. addEncorderFeature:function(encNode,location){
  25. if(encNode&&this.repetitiveCheck(encNode.id)){
  26. return;
  27. }
  28. var attributes = OpenLayers.Util.extend({}, encNode.attributes);
  29. var enc_point = new OpenLayers.Geometry.Point(location.lon,location.lat);
  30. var enc_Feature = new OpenLayers.Feature.Vector(enc_point,attributes,com.bct.map.EncoderMarkerStyle['smallEncoder']);
  31. this.addFeatures([enc_Feature]);
  32. if(encNode.attributes['lon']&&encNode.attributes['lat']&&encNode.attributes['lon'].length>0){
  33. return;
  34. }
  35. this.updateChannel(encNode.id,location.lon,location.lat);
  36. },
  37. repetitiveCheck:function(entity_id){
  38. if(this.getFeatureByAttribute({id:entity_id})){
  39. return true;
  40. }
  41. return false;
  42. },
  43. updateChannel:function(channel_id,lon,lat){
  44. Ext.Ajax.request({
  45. url: 'deviceVideoEncoder.do?method=updateLonlat&id='+channel_id+"&lon="+lon+"&lat="+lat
  46. });
  47. },
  48. channelMarkerClick:function() {
  49. var features = this.selectedFeatures;
  50. if(features.length >=0&&features[0]) {
  51. feature = features[0];
  52. var treeNodeAttribute = feature.attributes;
  53. //显示信息
  54. }
  55. },
  56. cartoonFeature :function(feature){
  57. this.drawFeature(feature,com.bct.map.EncoderMarkerStyle['bigEncoder']);
  58. var runner = new Ext.util.TaskRunner(1000);
  59. var task = {
  60. run:this.drawFeature,
  61. scope:this,
  62. args:[feature,com.bct.map.EncoderMarkerStyle['smallEncoder']],
  63. interval: 1000
  64. }
  65. runner.start(task);
  66. },
  67. removeSelectFeature:function(){
  68. var features = this.selectedFeatures;
  69. for(var i=features.length-1; i>=0; i--) {
  70. feature = features[i];
  71. this.updateChannel(feature.attributes['id'],"","");
  72. }
  73. this.destroyFeatures(this.selectedFeatures);
  74. },
  75. monitorSelectFeature:function(){
  76. var features = this.selectedFeatures;
  77. if(features.length >=0&&features[0]) {
  78. feature = features[0];
  79. var treeNodeAttribute = feature.attributes;
  80. var objId="mapAVShow"+treeNodeAttribute['id'];
  81. //弹出窗口
  82. }
  83. }
  84. });

addEncorderFeature是添加一个标注的地方。
利用这种方式,比原有的marker层拥有更多的功能

openlayers中利用vector实现marker的方式的更多相关文章

  1. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

  2. python中利用matplotlib绘图可视化知识归纳

    python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...

  3. 从0开始:Windows内核利用的另一种方式

    https://www.anquanke.com/post/id/91063 从0开始:Windows内核利用的另一种方式 阅读量    9168 |   稿费 200   分享到: 发布时间:201 ...

  4. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  5. Oracle中“行转列”的实现方式

    在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAM ...

  6. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  7. ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...

  8. .NET中的三种接口实现方式

    摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接 ...

  9. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

随机推荐

  1. Newtonsoft.Json 序列化小写首字母

    //json对象命名小驼峰式转换var json = JsonConvert.SerializeObject(newAccount, Formatting.Indented, new JsonSeri ...

  2. Java调试那点事[转]

    转自云栖社区:https://yq.aliyun.com/articles/56?spm=5176.100239.blogcont59193.11.jOh3ZG# 摘要: 该文章来自于阿里巴巴技术协会 ...

  3. Python——hmac

    该模块在Python中实现 RFC 2104 中规范的 HMAC 算法. 目录 一.HMAC 对象 1. HMAC.update() 2. HMAC.digest() 3. HMAC.hexdiges ...

  4. 转载: 让我们聊聊Erlang的nif中资源的安全释放

    让我们聊聊Erlang的nif中资源的安全释放 http://my.oschina.net/u/236698/blog/479221

  5. PHP进阶。

    老手段,百度“PHP进阶” 不过,今天运气不错,搜到一个“PHP特级内容讲解”,地址是:http://wenku.baidu.com/course/view/fd8e591b6bd97f192279e ...

  6. ubuntu安装phpVirtualBox web服务

    首先确保已经安装好了 virtualbox,打开了 vboxweb-service $ sudo ls /etc/init.d | grep vboxweb-service     然后, Insta ...

  7. Java多线程——线程范围内共享变量和ThreadLocal

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  8. vue的iview列表table render函数设置DOM属性值的方法

    { title: '负责人社保照片', key: 'leaderIdNumber', render: (h, params) => { return h('img',{domProps:{ sr ...

  9. ActiveMq持久化数据

    A:持久化为文件 这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了.涉及到的配置和代码有 <persistenceAdapter> <kahaDB direct ...

  10. HTML5标签embed详解

    摘要: <embed> 标签是 HTML 5 中的新标签,用来定义嵌入的内容,比如插件.类似于HTML 4.01 中的object和applet标签.我们要在网页中正常显示flash内容, ...