诅咒JavaScript之----ArcGIS JavaScript 点聚合 ClusterLayer
对一个之前一直做winForm的 菜鸟来说,突然接触这么神奇的语言,基本上每天都会诅咒一下这门神奇的语言.
最近做了一个小网站,底图用的是天地图的服务,用ArcGIS JavaScript提供的一些GIS功能.个人觉得,天地图API简单易上手,连我这个菜鸟看几个示例代码都能快速的做出包含地图的网站.只是,目前的天地图,基本上只有数据,没有GIS.
GIS相关的,esri的东西.
网上看了esri的ClusterLayer的示例代码,网址如下: https://developers.arcgis.com/javascript/jssamples/layers_point_clustering.html
以及根据国内一些技术牛人写的文章,进行修改.
由于是相当菜的菜鸟,可能出问题的地方相当多,相当纠结的一点点排查.
问题1:天地图不显示
天地图的类库之前测试正常,在ClusterLayer中却不显示.经逐行调试,发现将天地图的类库与clusterLayer中的类库在一起require时,出现了奇怪的指向问题.
调试过程中,天地图的类库没有正确指向自己写的代码,却指向了未知的esri的代码.后来将天地图在独立的require块中添加,地图显示正常.
问题2:clusterLayer不显示
这个问题相当之蛋疼.逐行,基本上把esri的clusterLayer的代码都看了一遍之后,发现
问题2.1 在天地图页面中,无论怎么缩放,clusterLayer中clusters的个数与原始数据的个数是一致的,没有出现随着缩放而
聚合的效果(这里说的效果是数据层面的,既聚合的个数不是显示层面的,因为数据不显示....),经仔细调试,发现_clusterResolution值与ersi提供的示例代码
中的值差好很多个数量级.进一步追踪,发现是map.extent.getWidth()值相当之小,只有个位数.进一步核查发现,esri的示例代码中底图数据是arcgisonline的图,
其空间参考为webMercator,wkid:102100.而封装好的ArcGIS JavaScript版的天地图的空间参考为wgs84,wkid:4326.因此,在clusterLayer中,map.extent.getWdith()就出现了及其小的问题,导致了
后续的聚类异常
解决方法:在ClusterLayer中,将_clusterResolution改为如下:
if (map.spatialReference.isWebMercator()) {
                this._clusterResolution = map.extent.getWidth() / map.width; // probably a bad default...
            }
            else {
                //WGS 84坐标,转换为web Mercator
                var latlng1 = new Point(map.extent.xmax, map.extent.ymax, map.spatialReference); //右上角
                var latlng2 = new Point(map.extent.xmin, map.extent.ymin, map.spatialReference); //左下角
                var webMercator1 = webMercatorUtils.geographicToWebMercator(latlng1);
                var webMercator2 = webMercatorUtils.geographicToWebMercator(latlng2);
                this._clusterResolution = (webMercator1.x - webMercator2.x) / map.width;
            }
修改完成之后,再源数据层面,可以看到clusters的个数随着缩放而在动态的改变着.
问题2.2 clusterlayer不显示. 上述问题解决之后,地图中仍然没有出现聚合点.在代码中百般调试,百般推测,百般琢磨,并在界面中输出了clusterLayer中的核心的参数,比如graphics.length等,
发现结果都是正常的,就是没有显示聚合点.以为天地图的某种显示机制与Graphics有某种冲突,就自己添加了一些Graphics,图层中也是显示正常的.纠结了近一天,晚上突然想明白,还是坐标系的
问题!官方给的ClusterLayer是基于webMercator投影的,因此,聚合之后的点簇的坐标,仍然是WebMercator的,由于示例代码中给的ArcGISOnline的图也是基于webMercator的,所以,点能正常显示.
而网上的天地图封装类库是基于wgs84的经纬度坐标.所以,经过聚合之后的点簇坐标,就无法显示了,因为远远超出了经纬度的坐标范围.
解决方法:将聚合之后的点簇坐标,再转换为wgs84的坐标,即可.在ClusterLayer中修改如下函数:
_showAllClusters: function () {
            var tp;
            if (map.spatialReference.isWebMercator()) {
                //map为WebMercator坐标系
                tp="webm";
            }
            else {
                //map为非WebMercator坐标系
                tp="nowebm";
            }
            for (var i = 0, il = this._clusters.length; i < il; i++) {
                var c = this._clusters[i];
                this._showCluster(c,tp);
            }
        },
        _showCluster: function (c, tp) {
            var point
            if (tp == "webm") {
                point = new Point(c.x, c.y, this._sr);
            }
            else {
                var latlng = new Point(parseFloat(c.x), parseFloat(c.y), this._sr);
                point = webMercatorUtils.webMercatorToGeographic(latlng);
            }
            this.add(
                new Graphic(
                point,
                null,
                c.attributes
        )
      );
纠结了N久的问题,终于解决!
菜鸟好痛苦,javaScript刚入门,dojo基本不会,ArcGIS JavaScript只浏览了下几个文档.一出问题,基本上上述所有的技术都可能是问题.
诅咒JavaScript之----ArcGIS JavaScript 点聚合 ClusterLayer的更多相关文章
- FK JavaScript之:ArcGIS JavaScript API之地图动画
		
地图要素动画应用场景:动态显示地图上的要素的属性随着时间的改变而改变,并根据其属性的变化设置其渲染.比如:某水域项目中,随着时间的变化,动态展现水域的清淤进度 本文目的:对ArcGIS JavaScr ...
 - FK JavaScript之:ArcGIS JavaScript添加Graphic,地图界面却不显示
		
使用ArcGIS JavaScript,往地图中添加几个Graphic,基本是与官网示例代码一致.绘制的图形一闪而过之后,就没了 核心代码如下: iniToolBar: function () { t ...
 - 使用ArcGIS JavaScript API 3.18 加载天地图
		
对于中国开发者在创建GIS应用的时候,往往比较头疼的是底图资源的缺乏.其实国家测绘地信局就提供一个很好的免费资源:天地图.使用ArcGIS API的开发人员可以直接利用该资源作为地图应用的底图. Ar ...
 - 如何正确响应ArcGIS JavaScript API中图形的鼠标事件
		
在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...
 - ArcGIS JavaScript + 天地图API之显示混乱
		
异常描述: (1)ArcGIS JavaScript 调用天地图WMTS服务,出现了这种混乱的效果,加载不完整. (2)昨天是相关瓦片的请求,Google浏览器显示的是请求失败.当时怀疑是无线网络的 ...
 - FK JavaScript:ArcGIS JavaScript类库加载不成功而导致的程序异常
		
现象:页面加载时,有时候成功,有时候出错,出错的地方为init.js 加载esri的类库 经过仔细对比,发现出错时dojo加载的类库中,对象的很多属性都为undefined,而加载成功时,该对象的相关 ...
 - arcgis  javascript  dojo
		
一.为什么说ArcGIS API for JavaScript是构建于Dojo之上的? 1. 编写ArcGIS API for JavaScript的ESRI开发者使用Dojo来简化他们的开发过程,同 ...
 - 理解ArcGIS Javascript Viewer Widget及编程模型
		
一个ArcGIS Javascript Viewer for JavaScript Widget是一组可以共享.迁移及部署到JavaScript View程序中的的文本文件.通常,一个程序员如果要开发 ...
 - ArcGIS JavaScript API本地部署离线开发环境[转]
		
原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...
 
随机推荐
- MySQL入门书籍和方法分享
			
本文罗列了一些适用于MySQL及运维入门和进阶使用的书籍. 背景:各大论坛上总是有很多同学咨询想学习数据库,或者是为入行DBA做些准备.几年来作为一个MySQL DBA的成长过程有一些积累和感悟,特此 ...
 - Gym 100851G	Generators (vector+鸽笼原理)
			
Problem G. Generators Input file: generators.in Output file: generators.outLittle Roman is studying li ...
 - POSIX线程--同时执行
			
//#define _REENTRANT//#define _POSIX_C_SOURCE#include <iostream>#include <string>#includ ...
 - 学SEO你其实只需要半个钟
			
网站上线之前: 关键词的分析以及选择: 关键词在我们网站的每个页面:首页,栏目页,文章都存在,它定位了你的网站的这个页面是做什么的,有什么内容,也是SEO中的最重要的部分. 网站必须确定并且设置好关键 ...
 - phpStorm支持CodeIgniter代码提示/自动完成
			
下载这个文件phpstorm-ci-ac 或者去github下载解压里面的三个文件到ci根目录下然后找到这三个文件 system\core\Controller.phpsystem\core\Mode ...
 - WCF测试客户端的使用
			
进入vs安装目录下,C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE,找到WcfTestClient.exe程序,点击文件 ...
 - javascript散列表实现
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - oracle体系结构详细示意图
 - Sonar+Hudson+Maven构建系列之一:安装Sonar
			
摘要:本系列讲述Sonar在Linux下安装及配置过程,windows下的安装类似,会更简单. 本人经过一翻摸索,终于将Sonar+Hudson+Maven配置成功,并使用Hudson进行自动构建,发 ...
 - 不自动生成Android Dependencies的解决方式
			
今天遇到的奇怪问题是网上下载的demo导入第三方包运行后Android: NoClassDefFoundError的错误,原因是第三方的jar包并没有打包进apk里,运行是肯定要出错的. 网上百度了N ...