4
0

clientlayer.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. define(["leaflet"],
  2. function (L) {
  3. return L.TileLayer.Canvas.extend({
  4. setData: function (d) {
  5. this.data = d
  6. this.redraw()
  7. },
  8. drawTile: function (canvas, tilePoint) {
  9. if (!this.data)
  10. return
  11. var tileSize = this.options.tileSize
  12. var s = tilePoint.multiplyBy(tileSize)
  13. var map = this._map
  14. function project(coords) {
  15. var p = map.project(new L.LatLng(coords[0], coords[1]))
  16. return {x: p.x - s.x, y: p.y - s.y}
  17. }
  18. var nodes = this.data
  19. var ctx = canvas.getContext("2d")
  20. var margin = 50
  21. ctx.beginPath()
  22. nodes.forEach(function (d) {
  23. var p = project([d.nodeinfo.location.latitude, d.nodeinfo.location.longitude])
  24. if (p.x + margin < 0 || p.y + margin < 0 || p.x - tileSize - margin > 0 || p.y - tileSize - margin > 0)
  25. return
  26. var clients = d.statistics.clients
  27. if (d.clients === 0)
  28. return
  29. var distance = 12
  30. var radius = 3
  31. var a = 1.2
  32. var startAngle = Math.PI
  33. var angle = startAngle
  34. for (var i = 0; i < clients; i++) {
  35. if ((angle - startAngle) > 2 * Math.PI) {
  36. angle = startAngle
  37. distance += 2 * radius * a
  38. }
  39. var x = p.x + distance * Math.cos(angle)
  40. var y = p.y + distance * Math.sin(angle)
  41. ctx.moveTo(x, y)
  42. ctx.arc(x, y, radius, 0, 2 * Math.PI)
  43. var n = Math.floor((Math.PI * distance) / (a * radius))
  44. var angleDelta = 2 * Math.PI / n
  45. angle += angleDelta
  46. }
  47. })
  48. ctx.fillStyle = "rgba(153, 118, 16, 0.5)"
  49. ctx.fill()
  50. }
  51. })
  52. })