项目需要一个小型的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. C# ?? 运算符是什么?

    ?? 运算符定义在将可空类型分配给非可空类型时返回的默认值. int? c = null; //若 c 为 null,则 d 为 -1,否则把 c 值赋予 dint d = c ?? -1;

  2. svn -- svn安装与配置

    1.SVN分为服务器端与客户端 l 服务器端:VisualSVN   SubVersion l 客户端:TortoiseSVN server http://www.visualsvn.com/ cli ...

  3. 笔记关闭fn功能

    使用笔记本在vs开发中调试需要加fn+10进行调试,一点都不方便,使用fn+esc(fnLock)这个功能就可以关闭fn功能

  4. Linux语言设置修改乱码

    1.system-config-language 命令语言改成英文.(安装yum install  system-config-language) 如何系统安装后,使用的语言不是自己想要的.但是在图形 ...

  5. CentOS 7 安装、配置、使用 PostgreSQL 10 安装及基础配置

    官网安装方法:https://www.postgresql.org/download/linux/redhat/ 卸载的话使用 yum remove 相应的安装 Install the reposit ...

  6. SQL SERVER重置自动编号列(标识列)

    两种方法: 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT ('table_na ...

  7. 在PC上运行安卓(Android)应用程序的几个方法

    三种方法: 1.在PC安装一个安卓模拟器,在模拟器里面运行apk: 2.虚拟机安装 Android x86 然后在此系统里运行: 3.利用谷歌chrome浏览器运行(这是一个新颖.有前途.激动人心的方 ...

  8. thinkphp 外部js语言包

    Thinkphp php文件也外部js文件公用同一个语言包 一 . php语言包转json数据格式 1.新建验证字段的语言包 application\common\lang\validate-cn.p ...

  9. SharePoint PowerShell使用Export-SPWeb和Import-SPWeb指令来导出和导入网站

    导出网站,例如: Export-SPWeb -Identity http://win2012sp2013:1000/Hopewell_Portal/ -Path "C:\KenmuTemp\ ...

  10. UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...