Blogger Template by Blogcrowds.

java web 开发学习(二)——google map开发小记

怎么说还是遥感专业,所以做开发至少也得跟地图扯上一点边吧,所以还是搞了一点地图开发,做地图开发有N多选择,比如百度地图,高德地图等等,但是最终还是选择了谷歌地图,为什么选谷歌地图呢?因为一切都是逼的….额 是逼格,为了突出高逼格所以选了google map,不要问我为什么没有被墙,我也不知道为什么 ….:D
好吧,闲话少说,其实关于Google Map Web API的教程很多,也很有用如:https://developers.google.com/maps/?hl=zh-cn  不能用?! 好吧怪我咯?,如果官方教程不能用的话就我估计你是用不了Google map了,还是投奔Baidu Map或者高德的怀抱吧,关于这个话题不能多说了不然要被查水表了。好了,根据教程我们可以开始我们的地图API开发了,其实就是一些jsp代码,结合html代码而已,什么你连jsp都不知道怎么用?!出门左转,步行2公里,到书店买本入门书籍看看先。其实网上的教程很多的,我也是个半吊子,但是我觉得jsp很简单,就是太随意了一点。
我们先来看看最基本的教程,如果使用Google Map,在官方教程上说得很明白,我们先来看看代码:
image
看到了么,没错你完全没有看错,一共不到30行代码,别问我怎么知道不到30行的,我数了…….好啦,不搞笑了,我们仔细分析一下上面的代码,除开html的框架主要部分有两个,首先是Google Map的jsp代码,我们定义了一个地图变量,然后定义一个函数,这个函数很简单就是新建一个初始化地图的变量,地图的中心点定位于center,zoom定义的是缩放的尺度。然后我们定义了一个标签,这个标签的id号与变量名一致。这样可以简单的生成一个google map,然后有一个地方要注意就是关于Google Map的使用必须要有一个API KEY,这个KEY必须自己申请,申请的方法很简单,有谷歌帐号那就更简单了,直接用谷歌帐号登录申请得到这个key就好了。到目前为止我们已经很简单的能够应用Google Map到自己的web应用中了,但是这个只有一个基本的功能,但是我需要的功能要比这个复杂,首先我需要能够在地图上添加标签,同时能够知道每个标签的位置和标签名,并用一个table显示出来,此外还要能够修改,删除,显示,隐藏这些标签,下面我将详细解释如果实现。
添加标签的实现:
简单的说,添加标签的过程我们可以通过一个很简单的示例实现,详细示例见:https://developers.google.com/maps/documentation/javascript/examples/marker-simple?hl=zh-cn这样我们就可以向地图上添加一个标签了,但是我们现在需要的是能够添加多个标签,这个如何做到呢?首先按照正常的编程风格和习惯,我们知道由于需要显示多个标签,所以至少得有一个地方存储这些标签,因此需要申请一个标签数组去存储我们每次添加的各个标签。这样每个标签都可以存储起来了,那么如何添加标签呢?我们总要设置一个触发事件去添加一个标签,根据这个朴素的思想我们添加一个按钮,这个按钮响应一个添加标签函数,通过每次响应这个函数则想标签数组中push一个标签,另外在map上显示出来,这样我们就得到一个一点击按钮就可以添加标签的动作,剩下的就是将标签坐标在列表中显示出来,这个其实也挺简单的,就是动态生成一个table标签,这个也困扰了我一段时间,为什么会有这样的困扰呢,主要是如果单纯的创建的话以前的标签也在列表框上显示,也就成了点击第一下有一个点,点击第二下则出现三个点的问题,应该将上次的table删除然后再显示,然后我们就有了如下效果:
若水GIF截图_2016年4月29日10点11分57秒
对于每一分节我们看看效果和示例代码就好了,具体代码我会在Git上共享。
添加标签的主要代码为:
image
可以看到我们使用一个markernumber基类marker的个数,infowindow是信息窗显示marker的名字,在这里对于每个marker我都attach了一个鼠标点击响应,这个响应的具体功能会在下文说明。
这样我们构建了一个点击添加点可以添加marker信息的功能。
然后我们要将数据删除,而数据删除也比较简单,我们只需要考虑四个方面:1.数组的删除;2.地图上图标的删除;3.数据个数设置为0,或者减1;4.最后更新显示列表。做到上面这四步就可以简单的将数据删除了,因此数据删除功能的实现也比较简单;在这里我就不展示源码了,大家到Git下载源码后一看便知。
接下来是数据的显示和隐藏,数据的显示和隐藏只做到地图层面,不需要在数据中将数据删除,所以table也不需要进行改变,因此总的来说就一个功能,将数据显示在当前的map上,或者将当前map上的数据删除,这个十分简单,在这里我也不做赘述。
下面要讲的是一个比较麻烦的问题,说它麻烦是因为如果不懂的话做起来确实挺麻烦,但是实际上很简单,那就是点击marker显示marker的title,如果整个影像上之后一个marker,这个是很好处理的,但是如果影像上存在多个marker呢,像我这样有一个marker数组应该怎么办呢?最开始我想的是获取地图点击的位置,然后通过为止判断是否点击到了marker,但是这样做似乎很傻逼,所以放弃了,后来看了一篇神文,将如何给marker绑定方法的,当然咯也是官方的一个教程:https://developers.google.com/maps/documentation/javascript/examples/event-closure?hl=zh-cn ,这个官方博客给我了一个思路,关于鼠标点击事件的一个思路,那就是attach功能,可以对每个marker都attach一个操作,这样就可以实现点击事件的响应了。
attach事件在上述代码中也有体现,但是具体实现见以下代码:

image
分析上述代码我们可以看到,输入参数为marker,对每个marker添加了两个事件响应,一个是点击事件响应,另一个是拖拽事件响应。鼠标点击marker弹出marker的title,而拖拽事件响应主要是因为marker拖拽之后坐标发生了变化,所以必须刷新对应的table更新点的坐标。到目前为止我们算是解决了两个最麻烦的问题,接下来就是几个简单的问题了,就是点的删除,点的删除主要是删除最后一个点和删除所有点。
点的删除:
在上文中我们提到过点的删除,主要有两个步骤,首先需要在数据中将点进行删除,另外需要在map上将点删除,数据集上将点删除很简单,用clear或者使用pop函数就可以了,在map上删除要删除对应的点所以稍微有一点点麻烦,但是相对前面的操作来说也比较简单,具体的操作可以查看代码:
image
删除marker主要是pop操作然后数据-1,最后创建表,清除表就是删除所有点,然后更新元素。
对点的操作还可以通过GMarkerMngr这个类来操作,有兴趣可以进行深入了解。

0 Comments:

Post a Comment



较新的博文 较早的博文 主页