项目需要一个小型的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. 数据抓取的艺术(三):抓取Google数据之心得

    本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间     时间是一个与抓取规模相形而 ...

  2. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.【转】

    今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...

  3. InteliJ Idea pom.xml不自动提示的解决

    file–>Settings–>Build,Execute…–>Build Tools–>Maven–>Repositories 会看到类似表格的画面,内容是你的mave ...

  4. (转)OpenGL ES编程入门资源集合

     出自:http://blog.csdn.net/u013467442/article/details/44498125     OpenGL ES 2.0中文手册:http://www.dreami ...

  5. unity3d 调用Start 注意

    在unity3d中,同一个脚本被绑定到多个物体上的时候,只有active的物体才会调用void Start ()  方法, 如果物体是NO Active 的状态,则不会调用Start,Awake也不会 ...

  6. Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页 (留着用)

    存储过程: GetProductsCount1: GetProductsByPage: ) * @PageSize) +' id from test)' exec sp_executesql @sql ...

  7. 解决ESXi有虚拟机模版部署的CentOS虚拟机,网卡eth0找不到问题

    1,问题和虚拟机克隆后出现网卡找不到问题类似. 2,修改主机名hostname 修改 /etc/sysconfig/network文件 3,删除/etc/sysconfig/network-scrip ...

  8. 获取 SharpSvn 执行 svn 操作的实时日志

    1 获取 SharpSvn 操作日志的方式 之前一篇随笔(使用 SharpSvn 执行 svn 操作)讲到可以通过声称一个绑定到一个 SvnClient 对象的 SvnClientReport 对象. ...

  9. 在Unity中查找缺失的引用

    这篇博客是查找unity中缺失引用的一个简单简短的解决方案.你可以从GitHub上获取源码. 缺失引用 一个丢失引用与没有引用(在检视表显示“None”)是完全不同的概念.这些友各种原因造成,比如:把 ...

  10. springmvc 文件下载

    1.使用servlet的API实现 参考:http://my.oschina.net/u/1394615/blog/311307 @RequestMapping("/download&quo ...