Created
April 23, 2014 16:09
-
-
Save andygup/11221619 to your computer and use it in GitHub Desktop.
An old example js cluster layer with flaring
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
dojo.require("dojox.lang.functional"); | |
dojo.require("dojox.lang.functional.lambda"); | |
dojo.require("dojox.lang.functional.curry"); | |
dojo.require("dojox.lang.functional.fold"); | |
dojo.declare("esri.ux.layers.ClusterLayer", esri.layers.GraphicsLayer, { | |
constructor: function (a) { | |
if (typeof Object.create === "undefined") { | |
Object.create = function (d) { | |
function c() {} | |
c.prototype = d; | |
return new c() | |
} | |
} | |
this.displayOnPan = a.displayOnPan || false; | |
this._map = a.map; | |
this._dojoMap = a.dojoMap; | |
this.zoomhandler = dojo.connect(this._map, "onZoomStart", dojo.hitch(this, this.handleMapZoomStart)); | |
this.handleMapExtentChange = dojo.connect(this._map, "onExtentChange", dojo.hitch(this, this.handleMapExtentChange)); | |
this.spatialReference = new esri.SpatialReference({ | |
wkid: 102100 | |
}); | |
this.initialExtent = (this.fullExtent = new esri.geometry.Extent(-20037507.0671618, -19971868.8804086, 20037507.0671618, 19971868.8804086, this.spatialReference)); | |
this.levelPointTileSpace = []; | |
this._features = []; | |
try { | |
this.setFeatures(a.features) | |
} catch (b) {} | |
dojo.connect(this, "onLoad", this.handleLayerLoaded); | |
dojo.connect(this, "onMouseOver", this.handleMouseOver); | |
dojo.connect(this, "onMouseOut", this.handleMouseOut); | |
dojo.connect(this, "onMouseClick", this.handleMouseClick); | |
this.symbolBank = a.symbolBank; | |
this._flareDistanceFromCenter = a.flareDistanceFromCenter || 20; | |
this._flareLimit = a.flareLimit || 20; | |
this._infoTemplate = a.infoWindow.template || null; | |
this._infoWindowWidth = a.infoWindow.width || 150; | |
this._infoWindowHeight = a.infoWindow.height || 100; | |
this.loaded = true; | |
this.onLoad(this) | |
}, | |
handleMapZoomStart: function () { | |
this.clear() | |
}, | |
handleMapExtentChange: function (b, d, a, c) { | |
this.clusterFeatures() | |
}, | |
setFeatures: function (a) { | |
this._features = []; | |
var b = a[0].geometry.spatialReference.wkid; | |
if (b != 102100) { | |
if (b == 4326 || b == 4269 || b == 4267) { | |
dojo.forEach(a, function (c) { | |
point = esri.geometry.geographicToWebMercator(c.geometry); | |
point.attributes = c.attributes; | |
this._features.push(point) | |
}, this) | |
} else { | |
throw "Input Spatial Reference Must Be in Either WKID: 102110 or WKID: 4326"; | |
return | |
} | |
} else { | |
dojo.forEach(a, function (c) { | |
point = c.geometry; | |
point.attributes = c.attributes; | |
this._features.push(point) | |
}, this) | |
} | |
}, | |
handleLayerLoaded: function (a) { | |
this.clusterFeatures() | |
}, | |
disconnect: function () { | |
dojo.disconnect(this.zoomhandler); | |
dojo.disconnect(this.handleMapExtentChange) | |
}, | |
handleMouseOver: function (m) { | |
this._map.infoWindow.hide(); | |
var k = m.graphic; | |
if (k.symbol.type == "textsymbol" || k.symbol.type == "simplelinesymbol") { | |
if (k.attributes) { | |
if (k.attributes.baseGraphic && k.attributes.baseGraphic.task) { | |
k.attributes.baseGraphic.task.cancel() | |
} | |
} | |
return | |
} | |
if (k.attributes.isCluster) { | |
if (k.attributes.clustered) { | |
if (k.task) { | |
k.task.cancel() | |
} | |
return | |
} | |
} else { | |
if (k.attributes.baseGraphic) { | |
if (k.attributes.id) { | |
baseGraphic = k.attributes.baseGraphic; | |
var r = this._dojoMap.getContent(k.attributes, baseGraphic); | |
k.setAttributes(r); | |
k.attributes.baseGraphic.task.cancel() | |
} | |
} else { | |
if (k.attributes.id) { | |
var r = this._dojoMap.getContent(k.attributes, null); | |
k.setAttributes(r) | |
} | |
} | |
this.showInfoWindow(k); | |
return | |
} | |
k.clusterGraphics = []; | |
var w = k.attributes.clusterSize; | |
var d = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 1]), 1); | |
var h = new esri.geometry.Polyline(this._map.spatialReference); | |
h.addPath([k.geometry, new esri.geometry.Point(0, 0)]); | |
var c = new esri.Graphic(h, d); | |
if (w > 1 && w <= this._flareLimit) { | |
var A = k.attributes.clusterSize; | |
var a = this.getPixelDistanceFromCenter(k.geometry); | |
var t = k.geometry; | |
var z, b, g, e, o, f, n, s; | |
for (var v = 0; v < A; v++) { | |
z = Math.sin((Math.PI * 2) * (v / A)); | |
b = Math.cos((Math.PI * 2) * (v / A)); | |
g = t.x + a * b; | |
e = t.y + a * z; | |
o = new esri.geometry.Point(g, e, this._map.spatialReference); | |
var u; | |
if (this.symbolBank[k.attributes[v].Code] != null) { | |
u = this.symbolBank[k.attributes[v].Code] | |
} else { | |
u = this.symbolBank.single | |
} | |
f = new esri.Graphic(o, u, dojo.mixin(k.attributes[v], { | |
baseGraphic: k | |
}), this._infoTemplate); | |
var q = k.attributes[v]; | |
var j = this.symbolBank.single; | |
if (typeof (q.color) != "undefined") { | |
console.log(q.color); | |
j = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color(q.color), 1), new dojo.Color(q.color)) | |
} | |
f = new esri.Graphic(o, j, dojo.mixin(k.attributes[v], { | |
baseGraphic: k | |
}), this._infoTemplate); | |
n = this.add(f); | |
n.getDojoShape().moveToFront(); | |
h.setPoint(0, 1, o); | |
c = new esri.Graphic(h, d, { | |
baseGraphic: k | |
}); | |
s = this.add(c); | |
s.getDojoShape().moveToBack(); | |
k.clusterGraphics.push(n); | |
k.clusterGraphics.push(s) | |
} | |
k.attributes.clustered = true | |
} | |
}, | |
getPixelDistanceFromCenter: function (b) { | |
var e = this._flareDistanceFromCenter; | |
var c = esri.geometry.toScreenGeometry(this._map.extent, this._map.width, this._map.height, b); | |
c.x = c.x + e; | |
c.y = c.y + e; | |
var a = esri.geometry.toMapGeometry(this._map.extent, this._map.width, this._map.height, c); | |
var d = esri.geometry.getLength(b, a); | |
return d | |
}, | |
handleMouseOut: function (a) { | |
var c = a.graphic, | |
b; | |
if (c.symbol.type == "textsymbol") { | |
return | |
} | |
if (c.attributes.isCluster) { | |
b = new DelayedTask(function (d) { | |
this.removeFlareGraphics(d.clusterGraphics); | |
delete d.clusterGraphics; | |
d.attributes.clustered = false | |
}, this, [c]); | |
b.delay(900); | |
c.task = b | |
} else { | |
if (c.attributes.baseGraphic) { | |
b = new DelayedTask(function (d) { | |
this.removeFlareGraphics(d.attributes.baseGraphic.clusterGraphics); | |
delete d.attributes.baseGraphic.clusterGraphics; | |
d.attributes.baseGraphic.attributes.clustered = false | |
}, this, [c]); | |
b.delay(900); | |
c.attributes.baseGraphic.task = b | |
} | |
} | |
}, | |
handleMouseClick: function (a) { | |
var b = a.graphic; | |
this.keepinfowindow = true | |
}, | |
removeFlareGraphics: function (a) { | |
if (a && a.length) { | |
for (var b = 0; b < a.length; b++) { | |
this.remove(a[b]) | |
} | |
} | |
}, | |
showInfoWindow: function (b) { | |
if (this._map.infoWindow.isShowing) { | |
this._map.infoWindow.hide() | |
} | |
this._map.infoWindow.setContent(b.getContent()); | |
this._map.infoWindow.setTitle(b.getTitle()); | |
this._map.infoWindow.resize(this._infoWindowWidth, this._infoWindowHeight); | |
var a = esri.geometry.toScreenGeometry(this._map.extent, this._map.width, this._map.height, b.geometry); | |
this._map.infoWindow.show(a, this._map.getInfoWindowAnchor(a)) | |
}, | |
clusterFeatures: function (q) { | |
try { | |
this.clear(); | |
var t = dojox.lang.functional, | |
u = this._map, | |
a = this._map.getLevel() + 2, | |
l = this._map.extent; | |
var r = u.getLayer(u.layerIds[0]).tileInfo; | |
var p = t.lambda("point, tileWidth,tileHeight,oPoint -> [Math.floor((oPoint.y - point.y)/tileHeight),Math.floor((point.x-oPoint.x)/tileWidth), point]"); | |
var d = customLods[a].resolution; | |
var o = d * r.width; | |
var m = d * r.height; | |
var j = t.partial(p, t.arg, o, m, r.origin); | |
var i = t.map([new esri.geometry.Point(l.xmin, l.ymin), new esri.geometry.Point(l.xmax, l.ymax)], j); | |
var g = i[1][0]; | |
var b = i[0][0]; | |
var f = i[0][1]; | |
var n = i[1][1]; | |
if (!this.levelPointTileSpace[a] || q) { | |
var h = t.map(this._features, j); | |
var c = []; | |
dojo.forEach(h, function (v, e) { | |
if (c[v[0]]) { | |
var w = c[v[0]]; | |
if (w[v[1]]) { | |
w[v[1]].push(v[2]) | |
} else { | |
w[v[1]] = v[1]; | |
w[v[1]] = [v[2]] | |
} | |
} else { | |
var w = c[v[0]] = []; | |
w[v[1]] = v[1]; | |
w[v[1]] = [v[2]] | |
} | |
}); | |
this.levelPointTileSpace[a] = c | |
} | |
var k = t.lambda("cPt,nextPt->{x:(cPt.x+nextPt.x)/2,y:(cPt.y+nextPt.y)/2}"); | |
dojo.forEach(this.levelPointTileSpace[a], function (e, v) { | |
if ((v >= g) & (v <= b)) { | |
dojo.forEach(e, function (y, E) { | |
if (y) { | |
if ((E >= f) & (E <= n)) { | |
var B = []; | |
if (y.length > 1) { | |
var z = t.reduce(y, k); | |
var w; | |
if (y.length <= 20) { | |
w = this.symbolBank.less16 | |
} else { | |
if (y.length > 20 && y.length <= 30) { | |
w = this.symbolBank.less30 | |
} else { | |
if (y.length > 30 && y.length <= 50) { | |
w = this.symbolBank.less50 | |
} else { | |
w = this.symbolBank.over50 | |
} | |
} | |
} | |
var A = dojo.map(y, function (F) { | |
return F.attributes | |
}); | |
var D = dojo.mixin(A, { | |
isCluster: true, | |
clusterSize: y.length | |
}); | |
if (y.length <= 1) { | |
var C = 12; | |
dojo.forEach(y, function (F) { | |
var G; | |
if (F.attributes.Code) { | |
G = Object.create(this.symbolBank[F.attributes.Code]); | |
G.size = G.size + C; | |
C = C - 4 | |
} | |
this.add(new esri.Graphic(new esri.geometry.Point(z.x, z.y), G, D)) | |
}, this) | |
} else { | |
this.add(new esri.Graphic(new esri.geometry.Point(z.x, z.y), w, D)) | |
} | |
var x = new esri.symbol.Font("10pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_NORMAL, "Trebuchet MS"); | |
this.add(new esri.Graphic(new esri.geometry.Point(z.x, z.y), new esri.symbol.TextSymbol(y.length, x, new dojo.Color("#000000")).setOffset(0, -5))) | |
} else { | |
dojo.forEach(y, function (F) { | |
var G; | |
if (F.attributes.Code) { | |
G = this.symbolBank[F.attributes.Code] | |
} else { | |
G = this.symbolBank.single | |
} if (F.attributes.color) { | |
G = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 0]), 1), new dojo.Color(F.attributes.color)) | |
} | |
this.add(new esri.Graphic(F, G, dojo.mixin(F.attributes, { | |
isCluster: false | |
}), this._infoTemplate)) | |
}, this) | |
} | |
} | |
} | |
}, this) | |
} | |
}, this) | |
} catch (s) { | |
console.log(this.name) | |
} | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment