l_pixiOverlay_taxi.html 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!DOCTYPE html>
  2. <html style="height: 100%; margin: 0;">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title data-i18n="resources.title_pixiOverlay_taxi"></title>
  6. <script type="text/javascript" include="jquery,bootstrap,papaparse,widgets" src="../js/include-web.js"></script>
  7. </head>
  8. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  9. <div id="map" style="margin:0 auto;width: 100%;height: 100%" class="cartes"></div>
  10. <!-- 引入 pixi.js 、L.PixiOverlay.js等相关js -->
  11. <script type="text/javascript" include="pixi" src="../../dist/leaflet/include-leaflet.js"></script>
  12. <script>
  13. let host = window.isLocal ? window.server : 'https://iserver.supermap.io';
  14. var url = host + '/iserver/services/map-china400/rest/maps/China';
  15. var map = L.map('map', {
  16. center: [40.7594, -73.91426],
  17. maxZoom: 18,
  18. zoom: 11
  19. });
  20. // iclient-leaflet添加tilelayer
  21. L.supermap
  22. .tiledMapLayer(url, {
  23. attribution:
  24. "<a href='https://github.com/manubb/Leaflet.PixiOverlay' target='_blank' >© Leaflet.PixiOverlay</a>"
  25. })
  26. .addTo(map);
  27. widgets.loader.showLoader('data loading...');
  28. // pixi构建多marker图层
  29. var easing = BezierEasing(0, 0, 0.25, 1);
  30. var loader = new PIXI.loaders.Loader();
  31. loader.add('marker', 'img/marker-icon.png');
  32. document.addEventListener('DOMContentLoaded', function() {
  33. loader.load(function(loader, resources) {
  34. var texture = resources.marker.texture;
  35. // 请求纽约出租车上车点的数据
  36. $.get('../data/nyc-taxi.csv', function(csvstr) {
  37. widgets.loader.removeLoader();
  38. var nycData = Papa.parse(csvstr, { skipEmptyLines: true, header: true });
  39. var data = nycData.data;
  40. // 构建pixiLayer
  41. var pixiLayer = (function() {
  42. var zoomChangeTs = null;
  43. var pixiContainer = new PIXI.Container();
  44. var innerContainer = new PIXI.particles.ParticleContainer(data.length, { vertices: true });
  45. // add properties for our patched particleRenderer:
  46. innerContainer.texture = texture;
  47. innerContainer.baseTexture = texture.baseTexture;
  48. innerContainer.anchor = { x: 0.5, y: 1 };
  49. pixiContainer.addChild(innerContainer);
  50. var doubleBuffering = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
  51. var initialScale;
  52. return L.pixiOverlay(
  53. function(utils, event) {
  54. var zoom = utils.getMap().getZoom();
  55. var container = utils.getContainer();
  56. var renderer = utils.getRenderer();
  57. var project = utils.latLngToLayerPoint;
  58. var getScale = utils.getScale;
  59. var invScale = 1 / getScale();
  60. if (event.type === 'add') {
  61. var origin = project([(48.7 + 49) / 2, (2.2 + 2.8) / 2]);
  62. innerContainer.x = origin.x;
  63. innerContainer.y = origin.y;
  64. initialScale = invScale / 8;
  65. innerContainer.localScale = initialScale;
  66. for (var i = 0; i < data.length; i++) {
  67. var coords = project([data[i].lat, data[i].lng]);
  68. // our patched particleContainer accepts simple {x: ..., y: ...} objects as children:
  69. innerContainer.addChild({
  70. x: coords.x - origin.x,
  71. y: coords.y - origin.y
  72. });
  73. }
  74. }
  75. if (event.type === 'zoomanim') {
  76. var targetZoom = event.zoom;
  77. if (targetZoom >= 18 || zoom >= 18) {
  78. zoomChangeTs = 0;
  79. var targetScale =
  80. targetZoom >= 18 ? 1 / getScale(event.zoom) : initialScale;
  81. innerContainer.currentScale = innerContainer.localScale;
  82. innerContainer.targetScale = targetScale;
  83. }
  84. return;
  85. }
  86. if (event.type === 'redraw') {
  87. var delta = event.delta;
  88. if (zoomChangeTs !== null) {
  89. var duration = 17;
  90. zoomChangeTs += delta;
  91. var lambda = zoomChangeTs / duration;
  92. if (lambda > 1) {
  93. lambda = 1;
  94. zoomChangeTs = null;
  95. }
  96. lambda = easing(lambda);
  97. innerContainer.localScale =
  98. innerContainer.currentScale +
  99. lambda * (innerContainer.targetScale - innerContainer.currentScale);
  100. } else {
  101. return;
  102. }
  103. }
  104. renderer.render(container);
  105. },
  106. pixiContainer,
  107. {
  108. doubleBuffering: doubleBuffering,
  109. destroyInteractionManager: true
  110. }
  111. );
  112. })();
  113. pixiLayer.addTo(map);
  114. var ticker = new PIXI.ticker.Ticker();
  115. ticker.add(function(delta) {
  116. pixiLayer.redraw({ type: 'redraw', delta: delta });
  117. });
  118. map.on('zoomstart', function() {
  119. ticker.start();
  120. });
  121. map.on('zoomend', function() {
  122. ticker.stop();
  123. });
  124. map.on('zoomanim', pixiLayer.redraw, pixiLayer);
  125. });
  126. });
  127. });
  128. </script>
  129. </body>
  130. </html>