对一个之前一直做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的更多相关文章

  1. FK JavaScript之:ArcGIS JavaScript API之地图动画

    地图要素动画应用场景:动态显示地图上的要素的属性随着时间的改变而改变,并根据其属性的变化设置其渲染.比如:某水域项目中,随着时间的变化,动态展现水域的清淤进度 本文目的:对ArcGIS JavaScr ...

  2. FK JavaScript之:ArcGIS JavaScript添加Graphic,地图界面却不显示

    使用ArcGIS JavaScript,往地图中添加几个Graphic,基本是与官网示例代码一致.绘制的图形一闪而过之后,就没了 核心代码如下: iniToolBar: function () { t ...

  3. 使用ArcGIS JavaScript API 3.18 加载天地图

    对于中国开发者在创建GIS应用的时候,往往比较头疼的是底图资源的缺乏.其实国家测绘地信局就提供一个很好的免费资源:天地图.使用ArcGIS API的开发人员可以直接利用该资源作为地图应用的底图. Ar ...

  4. 如何正确响应ArcGIS JavaScript API中图形的鼠标事件

    在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...

  5. ArcGIS JavaScript + 天地图API之显示混乱

     异常描述: (1)ArcGIS JavaScript 调用天地图WMTS服务,出现了这种混乱的效果,加载不完整. (2)昨天是相关瓦片的请求,Google浏览器显示的是请求失败.当时怀疑是无线网络的 ...

  6. FK JavaScript:ArcGIS JavaScript类库加载不成功而导致的程序异常

    现象:页面加载时,有时候成功,有时候出错,出错的地方为init.js 加载esri的类库 经过仔细对比,发现出错时dojo加载的类库中,对象的很多属性都为undefined,而加载成功时,该对象的相关 ...

  7. arcgis javascript dojo

    一.为什么说ArcGIS API for JavaScript是构建于Dojo之上的? 1. 编写ArcGIS API for JavaScript的ESRI开发者使用Dojo来简化他们的开发过程,同 ...

  8. 理解ArcGIS Javascript Viewer Widget及编程模型

    一个ArcGIS Javascript Viewer for JavaScript Widget是一组可以共享.迁移及部署到JavaScript View程序中的的文本文件.通常,一个程序员如果要开发 ...

  9. ArcGIS JavaScript API本地部署离线开发环境[转]

    原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...

随机推荐

  1. 【leetcode】String to Integer (atoi)

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  2. ECharts2.2.0 兼容IE8

    IE 8,ECharts2.2.0 版本,demo的各个功能均正常显示在IE8上面, 但是我在真正做的时候,我的html却不能显示,画面乱了,而且function也不能用, 都准备用1.4.1版本了, ...

  3. mysql lower,upper实现大小写

    mysql的lower和uppper函数可以将指定字符串转换为小写和大写 select lower('OutSpringTd') as lowerCase, upper('OutSpringTd') ...

  4. iOS 中的Push Notifications简单实现(APNS)

    Android中的通知只有一种,就是Local Notifications,而iOS中除了Local Notifications外,还有一种Push Notifications.ios的这2种noti ...

  5. iOS 网络请求中的challenge

    这里有一篇文章,请阅读,感谢作者!http://blog.csdn.net/kmyhy/article/details/7733619 当请求的网站有安全认证问题时,都需要通过 [[challenge ...

  6. HDU 2147 kiki's game(博弈)

    kiki's game Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit S ...

  7. Shallow Size 和 Retained Size

    所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size. ...

  8. Session的使用(登录例案+其它页面访问)

    本程序功能是使用Session将用户输入的用户名保存在Session中(登录成功情况下,登录失败不会有Session值),其它页面想访问时会先判断是否有之前存的Session值. 登录Login.ht ...

  9. Mysql sql查询性能侦查

    Mysql 服务性能优化配置:http://5434718.blog.51cto.com/5424718/1207526[该文章很好] Sql查询性能优化 对Sql进行优化,肯定是该Sql运行未能达到 ...

  10. java equals 和 "==" 比较

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...