HTML5 Canvas Map-マップエンジンの実装

大規模なインタラクティブなWebベースのプロジェクトの一部として(詳細は別の投稿で可能です)、HTML5 CANVASに実装された地図作成エンジンを開発しています。 その開発はベータ段階に達し、私のリーダーシップの承認を得て、これらのカードを一般に公開したいという要望がありました。



画像



一般的な情報



エンジンは、特別なライブラリまたはフレームワークを使用せずに開発されました。 使用されるライブラリはjQueryのみです。



マップイメージ-タイル-は、ユーティリティを使用して生成されます。 まだ最適化に対処していないため、まだ努力が必要です。



追加のツールのパネルやラベルのポップアップなどの要素を除き、すべてがCANVASに描画されます(ただし、下のリンクのデモではまだ表示されていません)。



実装



実装はモジュール式であり、その名前から明らかなように、CanvasDragger、CanvasEventer、CanvasImgLoader、CanvasMapper、CanvasMarker、CanvasMiniMapper、CanvasResizer、CanvasTools、CanvasZoomerの主要な部分で構成されています。



カードを接続するには、適切な場所html'aに次の行を書くだけで十分です。

<canvas id="map2d"></canvas>
      
      





次に、JSコードで(例として)初期化します。

 $(function() { mWrap = new MapsWrapper({ mapDivId: "map2d" //   ID canvas'a,      }); }); MapsWrapper = function(properties) { this.initialize(properties); }; $.extend(MapsWrapper.prototype, { v2DMapDiv : null, v2DMapComponent : null, initialize: function(prop){ this.v2DMapDiv = prop.mapDivId; this.initMap(); }, initMap: function(){ var GlobalParams = { staticMapUrl: ["http://gate.looxity.ru:8088/map.html", "http://zain.looxity.ru:8088/map.html", "http://kaph.looxity.ru:8088/map.html"], initCrd : {x: 7445, y: 9925}, initZoom : 0.25, zoomList : [1, 0.5, 0.25, 0.1, 0.05, 0.025], miniMap : true, tools : {scaler: true, polygoner: true} }; this.v2DMapComponent = new CanvasMapper (this.v2DMapDiv); this.v2DMapComponent.initialize(GlobalParams); } });
      
      







パラメーターについてさらに詳しく説明します。



内部力学



または、これまたはそのユーザーアクションの背後に隠されているもの。 メインイベントを見ていきましょう。



始める


マップが初期化されると、キャンバスを完全にカバーするために、表示されるタイルの数が計算されます。 キャンバスのサイズがわかっている場合、タイルサイズが256x256の場合、この操作を実行します。



動いています


さらに、マップが移動するとき(ドラッグ)、新しいタイルをロードする必要があるほどマップを移動したかどうかを確認します。 また、すべてのタイルがスコープ内にあるかどうかを確認し、そうでない場合は、「ガベージコレクター」を起動します。

 unVisibleTilesCollector: function() { for(var cnt = 0; cnt < this.__TILES__.length; cnt++) { if( (this.__TILES__[cnt].canvX + this.tileSize) < 0 || this.__TILES__[cnt].canvX > this.canvas.width || this.__TILES__[cnt].canvY > this.canvas.height || (this.__TILES__[cnt].canvY + this.tileSize) < 0 ) { this.__TILES__.splice(cnt, 1); cnt--; } } }
      
      







スケーラブル(zoomIn、zoomOut)


「マウスホイール」イベントがトリガーされると、次の主なアクションが順番に発生します。

 $.extend(this.__ANIM_TILES__, this.mapper.__TILES__)
      
      





 for(cnt; cnt < this.animSteps; cnt++){ setTimeout(function(){ _this.ctx.clearRect(0,0,_this.canvas.width,_this.canvas.height); _this.ctxMarker.clearRect(0,0,_this.canvas.width,_this.canvas.height); animScale += scale*stepScale; _this.drawAllAnimTiles(evt, { animScale: animScale, stepCurrNum: Math.round(Math.abs(animScaleStart-animScale)/stepScale), stepScale: stepScale }); }, delay*cnt); }
      
      





 MapsWrapper.v2DMapComponent.update()
      
      







ブラウザで作業する



作業は、FireFox、Chrome、Safari、Opera、およびIEの最新バージョンでテストされました。

まだ知らない人のために、私は再び以下を強調します。 キャンバスが使用されているため、このテクノロジーをサポートしていないすべてのブラウザーは自動的に消えます。これはIEバージョン8以下で、上記のブラウザーの非常に古いバージョンです。



カード別TODOリスト



1.マップタイルのサイズを縮小します(速度が目に見えるほど向上します)。

2.ズームスライダー。

3.マップ上のポイントに関する情報(建物の住所、座標など)を取得するためのツール。

4. ???



デモshare.arkada-sw.ru/canvasmap



PSプログラムコードとマップに対するすべての権利は、私が働いている会社に属します。
ppsこの記事に興味があれば、私の次の投稿は地図データの実際の使用例の説明です



All Articles