对一个之前一直做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. js:判断对象是否为空

    var list = []; var param = {}; ....... var hasProp = false; for (var prop in param){ hasProp = true; ...

  2. coco2dx实现翻拍效果

    昨天吃饭看见同事演示他做的翻牌效果,感觉不错,我心血来潮也来搞个,很简单直接上代码. class FlipCard : public CCNode { public: CREATE_FUNC(Flip ...

  3. Java for LeetCode 072 Edit Distance【HARD】

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  4. Extjs读取更改或者发送ajax返回请求的结果简单封装

    Extjs的submit()方法提交的数据:如下: this.formPanel.getForm().submit({                url:this.saveUrl,         ...

  5. Html标签<a>的target属性

    target属性规定了在何处打开超链接的文档. 如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者 ...

  6. 解决 jersey javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)

    检查是否Jar冲突 保留一个jersey-server-*.jar

  7. Win7中打开chm文件内容无法显示问题

    今天下载了一个linux的2.6.22.14中文文档,下载后发现显示异常   www.2cto.com  怀疑是API的问题,连续从几个网站下来了很多版本,发现都存在这个问题,然后就开始自己的身上找原 ...

  8. oracle 10g 学习之多表查询、分组函数(6)

    笛卡尔集 l  笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 l  为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件. 自连接 select m.las ...

  9. mac平台下面nodejs环境搭配

    方法一(pkg方式:下载链接http://nodejs.org/dist/v0.12.4/node-v0.12.4.pkg): 官网:https://nodejs.org/download/ 例子: ...

  10. hdu 1756 判断点在多边形内 *

    模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...