S-mapは,新たに地図描画エンジンを追加したり,コントローラ,ジオコーダを追加したりといった拡張が可能です.
ここでは,これらの拡張を行う際に必要となる情報を提供します.
地図描画エンジンを実装する場合に最低限必要な作業は,新しいエンジン名を決めることと,マップ生成関数を提供することです.マップ生成関数は,「Smap.engine.エンジン名」に代入してください.この命名法に従うこことによりSmapがエンジンを探し出して使うことができるようになります.
以下に新しい地図描画エンジン名を"myleaflet"とした場合の例を示します.
Smap.engine.myleaflet = function( map ) { map.original = new L.Map( map.owner, { center: map.center, zoom: map.zoom } ); ... return map; };
S-mapは,様々な前処理を行い,メソッド等を追加した後でこのマップ生成関数を呼び出します.マップ生成関数は,Mapオブジェクトを引数にとり,必要な処理を加えて戻り値として返します.地図描画エンジンがエンジン固有のオブジェクトを生成した際には,上記の例のようにmap.originalに設定してくさい(必須ではありません)
※すなわち,マップ生成関数はMapオブジェクト自身を生成しているわけではありません.しかし,Mapオブジェクトの中心的な機能がここで実装され,地図描画エンジン固有のマップオブジェクトも生成されますのでこう呼んでいます.
以下は,Mapオブジェクトにタイルレイヤーを生成するメソッド _tileLayer() を追加する例です.この例のように,地図描画エンジンで追加すべきメソッドはすべてアンダーバー"_"で始める規則になっています.なお,アンダーバーをつけない同名のメソッドがMapオブジェクトに存在することも多いですが,引数の仕様等が若干異なるので注意してください.
Smap.engine.myleaflet = function( map ) { map.original = new L.Map( map.owner, { ... } ); map._tileLayer = function( aLayer ) { aLayer.original = new L.TileLayer( aLayer.url ); for ( var key in aLayer ) { if ( aLayer.url.indexOf( '{' + key + '}' ) >= 0 ) { aLayer.original.options[ key ] = aLayer[ key ]; } }; aLayer.original.addTo( map.original ); } ... return map; };
マップ生成関数が返すオブジェクトでは,必要に応じて以下のプロパティおよびメソッドを設定してください.
プロパティ | 型 | デフォルト | 説明 |
---|---|---|---|
original | Object | なし | 地図描画エンジンが生成するオブジェクトがあれば設定 |
メソッド | 引数 | 戻り値 | 説明 |
---|---|---|---|
_on( type, handler ) | String, Function | this | typeで指定したイベントに,handlerで指定したイベ関数を登録 未知のイベントタイプについては,可能な場合は,元のとなる地図描画ライブラリのオブジェクトのイベントハンドラにそのまま渡してください. _addEventLlistener(やaddEventListener)メソッドを地図描画エンジン側で実装する必要はありません.プラットフォーム内でこの_on()メソッドへ読み替えられます. |
_addBase( layer ) | Layer | Layer | 指定したレイヤーを背景地図に追加します. |
_image( layer ) | Layer | なし | 地図画像レイヤーを追加します. |
_addOverlay( layer ) | Layer | Layer | オーバーレイレイヤーを追加 引数にはMap.layer()メソッドで生成されたLayerオブジェクトが渡されます. |
_polyline( polyline ) | Polyline | なし | ポリラインオブジェクトを追加します. |
_popup( popup ) | Popup | Object | 指定した位置にポップアップウィンドウを追加 |
_layerControl( show ) | Boolean | なし | レイヤーコントロールを表示( showがtrueのとき )または非表示( showがfalseのとき ) |
_marker( marker ) | Marker | なし | マーカーオブジェクトを生成します |
_removeMareker() | なし | なし | 最後に追加したマーカーを削除 |
_removeOverlay( layer ) | Layer | なし | 指定したオーバーレイレイヤーを削除 引数を省略すると最後に追加したオーバーレイレイヤが削除されます. |
_removelPopup() | なし | なし | 最後に追加したポップアップを削除 |
_tileLayer( layer ) | Layer | Layer | layer引数をもとに実際の描画機能を持ったLayerオブジェクトを生成 layer引数には,デフォルトの処理を実装したものが渡されます. 外部地図描画ライブラリのオリジナルLayerオブジェクトがある場合は,layer.originalに設定します. |
_removeBase( layer ) | Layer | なし | 指定したレイヤーをベースマップから削除します |
_removeImage( image ) | Layer | なし | 指定した画像レイヤーを削除します. |
_removePolyline( polyline ) | Polyline | なし | 指定したポリラインを削除します. |
_scaleControl( show ) | Boolean | なし | スケールコントロールを表示( showがtrueのとき)または非表示( showがfalseのとき) |
_setBase( layer ) | Layer | Layer | 背景レイヤーをlayerに変更 すでに背景として登録されているもののみが指定できます layerを省略すると,現在表示されている背景レイヤーを返します |
_setBounds( bbox ) | [LatLng, LatLng] | [LatLng, LatLng] | null | 南西および北西の緯度経度を指定して,その範囲が収まりかつ最大になるように描画位置と範囲を変更,最終的な範囲を取得. boundsは省略することができ,その場合は現在の範囲が返されます マップエンジンの状態により情報取得に失敗することがあり,その場合はnullを返します. |
_setCenter( latLng ) | LatLng | LatLng | 地図の中心を,latLngで指定した地理上の位置に変更することを試み,最終的な地理上の位置を取得. centerは省略することができ,省略すると現在の中心位置が返されます. |
_setDraggable( draggable ) | Boolean | なし | マウスで地図をドラッグ可能にするか |
_setHf( f ) | Number | Number | 高さ誇張係数を指定 fは省略でき,省略すると現在の誇張係数が返されます. |
_setView( view, options ) |
Object, Object |
Object | 地図の中心位置とズームレベルを同時に設定します. 引数は,{ centetr: LatLng, zoom: Number }で指定し,フィールドが省略された場合は現在の値となります.引数自体を省略すると現在の表示設定を返します. optionsに{ animate: false }を指定するとアニメーションを抑止します. デフォルトではsetCenter()とsetZoom()を使って動作しますが,地図描画園エンジンが専用のメソッドを持つ場合は,このメソッドを実装することにより利用できます. |
_setScale( scale, options ) |
Number, Object |
Nmber | スケール(1ピクセルあたりのメートル)を設定することを試み,最終的なスケールを取得 1つの地図描画エンジンでは,_setScaleか_setZoomのいずれかをじっそするだけで構いません. |
_setZoom( zoom, options ) |
Number, Object |
Number | ズームレベルをzoomに変更することを試み,最終的なズームレベルを取得 1つの地図描画エンジンでは,_setScaleか_setZoomのいずれかをじっそするだけで構いません. zoomに実数が渡される可能性があります.実装上は四捨五入するなどして整数のみを扱うだけでも構いません. |
_startLocate( params ) | Object | this | GPS等による現在位置取得を開始します |
_stopLocate() | なし | this | GPS等による現在位置取得を中止します |
_move( dx, dy, dz ) |
Number, Number, Number |
なし | 地図をx軸方法,y軸方向, z軸方向にそれぞれdx, dy, dzピクセルずつ動かします. |
_roll( s, t ) |
Number, Number |
なし | 注視点を中心に,水平方向にs, 鉛直方向にt回転させます. |
_rollCamera( s, t ) |
Number, Number |
なし | カメラを中心に,水平方向にs, 鉛直方向にt回転させます |
_near( dz ) | Number | なし | カメラを地図に近づけ(負の時は離れさせ)ます. dzは相当するズームレベルの差を指定します. デフォルトでは内部変数に値を蓄積させ,1を超えたとき(または-1を下回ったとき)にズームレベルを変更します.この動作を変えたいときはこのメソッドを実装します. (dzの考え方が_move()と異なりますので注意してください) |
Mapオブジェクトの_tileLayer()メソッドや_addImage()メソッドが返すLayerオブジェクトでは,以下のプロパティおよびメソッドを必要に応じて実装します.
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
original | Object | 無し | 外部地図描画ライブラリが提供するオリジナルのレイヤーオブジェクト |
メソッド | 引数 | 戻り値 | 説明 |
---|---|---|---|
_redraw() | なし | なし | レイヤーを再描画します |
_set( key, value ) | String, Eney | Eney | レイヤーのプロパティをセットし,最終的な値を取得します. valueは省略でき,省略すると現在の値のみが返されます. この関数内でredraw()を呼ぶ必要はありません. この関数は,Layerオブジェクのset()メソッドで未知のプロパティが設定されたときに呼び出されます. |
_setOpacity( opacity ) | Number | Number | 不透明度を設定し,最終的な不透明度を取得 opacityは省略でき,省略すると現在の値が返されます. |
_setVisibility( visibility ) | Boolean | Boolean | レイヤーの表示・非表示をセットし,最終的な値を取得 vsibilityは省略でき,省略すると現在の状態が返されます. |
Map._marker()が返すMarkerオブジェクトでは,以下のメソッドを必要に応じて実装します.
メソッド | 引数 | 戻り値 | 説明 |
---|---|---|---|
_closePopup() | なし | なし | ポップアップウィンドウを閉じます |
_openPopup() | なし | なし | ポップアップウィンドウを表示します |
_setLatLng( latLng ) | LatLng | LatLng | 表示する位置を変更し,最終的な位置を返します. 引数は省略するできます. |
_setOpacity( opacity ) | Number | Number | 不透明度を設定し,最終的な不透明度を返します. opacityは省略でき,省略すると現在の値が返されます. |
_setPopup( popup ) | String | String | ポップアップで表示するhtml文字列を設定します. 引数は省略することができ,省略すると現在設定されている文字列を返します |
_setVisibility( visibility ) | Boolean | Boolean | レイヤーの表示・非表示をセットし,最終的な値を返します. vsibilityは省略でき,省略すると現在の状態が返されます. |
Map._addPolyline()が返すPolylineオブジェクトでは,以下のプロパティおよびメソッドを必要に応じて実装します.
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
original | Object | 無し | 外部地図描画ライブラリが提供するオリジナルのポリラインオブジェクト |
メソッド | 引数 | 戻り値 | 説明 |
---|---|---|---|
_addLatLng( latLng ) | LatLng | なし | 地理座標を追加します. |
_on( type, handler ) |
String, Function |
なし | イベントリスナーを登録します. |
_setLatLngs( latLngs ) | [ LatLings, ... ] | なし | 地理座標の配列を設定します. |
_setVisibility( visibility ) | Boolean | Boolean | ポリラインの表示・非表示をセットし,最終的な値を取得します. vsibilityは省略でき,省略すると現在の状態が返されます. |
独自のコントローラを実装するには,Controllerオブジェクトを返す関数を,「Smap.controller.コントローラ名」にセットします.この名前規則に従うことにより,Map.addControle(
'コントローラ名' ) でコントローラに追加できるようになります.
コントローラに関しては,S-mapであらかじめオブジェクトを生成する必要はありません.任意のオブジェクトに,プロパティやメソッドを適宜実装してください.
プロパティ | 型 | デフォルト | 説明 |
---|---|---|---|
active | Boolean | なし | コントローラを有効にするか否か |
id | String | なし | コントローラー名.'gamepad'または'leap' |
rollSpeed | Number | なし | 回転速度,1秒あたりの回転ラジアン角 |
rollAxisSpeed | Number | なし | 回転速度スティック用,1秒あたりの回転ラジアン角 |
nearSpeed | Number | なし | 近づいたり離れたりする速度,1秒あたりのズームレベル相当 |
moveSpeed | Number | なし | 移動速度,1秒あたりのピクセル数 |
moveAxisSpeed | Number | なし | 移動速度スティック用,1秒あたりのピクセル数 |
メソッド | 引数 | 戻り値 | 説明 |
---|---|---|---|
check() | Number | なし | Mapオブジェクト内のループの中から呼び出されます. コントローラの状態が変化があった場合はMapの状態変更用メソッド(near, move, roll, rollCamera )をコールして状態を変更してください |
ジオコーダは,通常の使用法でもgeocode()メソッドをオーバーライドすることにより独自ジオコーダを作成,利用することができます.
さらに,新しいGeocoder()オブジェクトを返す関数を実装して,Smap.geocoder.ジオコーダ名にセットすると,Smap.geocoder( ジオコーダ名 )で取得して利用できるようになります.
2015年7月21日更新