27. GISツールで作ったデータを
Google Maps SDKで使うに
は
y座標が逆向きなので変換してやる必要がある
定型文で覚えれば無問題
y = (int)Math.Pow (2.0, (double)z) - y - 1;
このくらい覚えろ!
すみません覚えてください
27 2014/11/08
28. Xamarin iOS
URLConstructor constructor = new URLConstructor ();
…
MapView mapView = new MapView ();
…
var tmsProvider = UrlTileLayer.FromUrlConstructor ((uint x, uint y, uint zoom) => {
string url = constructor.GetUrl((int)x,(int)y,(int)zoom);
return new NSUrl(url);
});
tmsProvider.Map = mapView;
UrlTileLayer.FromUrlConstructorに
NSUrlを生成するラムダ式を食わせて
UrlTileLayerを生成し
MapプロパティにMapViewを指定するだけ
28 2014/11/08
29. Xamarin Android(1)
若干面倒くさい
class URLTilesProvider : UrlTileProvider
{
private URLConstructor constructor;
UrlTileProviderを継承
public URLTilesProvider () : base (256, 256) {
constructor = new URLConstructor ();
}
public override Java.Net.URL GetTileUrl (int x, int y, int z) {
var url = constructor.GetUrl (x, y, z);
return new Java.Net.URL (url);
}
}
Java.Net.URLを返すGetTileUrlメソッドを実装
29 2014/11/08
30. Xamarin Android(2)
protected override void OnResume ()
{
var mapView = ((MapFragment)FragmentManager.FindFragmentById
(Resource.Id.map)).Map;
MapViewはMapFragmentから取得
if (mapView != null) {
var tmsProvider = new URLTilesProvider ();
var mbOptions = new TileOverlayOptions();
mapView.AddTileOverlay( mbOptions.InvokeTileProvider(tmsProvider) );
}
} TileOverlayOptions#InvokeTileProviderに
作成したUrlTileProviderを食わせ、
TileOverlayを生成してMapViewにAddTileOverlay
30 2014/11/08
35. MBTilesのスキーマ
(私が今使ってるもの)
CREATE TABLE map ( zoom_level INTEGER, tile_column INTEGER, tile_row INTEGER, tile_id TEXT, grid_id
TEXT );");
正規化されたり
CREATE TABLE grid_key ( grid_id TEXT, key_name TEXT );");
他のデータも加わってるが、
CREATE TABLE keymap ( key_name TEXT, key_json TEXT );");
CREATE TABLE grid_utfgrid ( grid_id TEXT, grid_utfgrid BLOB );");
viewがあるのでSELECT
CREATE TABLE images ( tile_data blob, tile_id text );");
する分には1.0と同じ
CREATE TABLE metadata ( name text, value text );");
CREATE UNIQUE INDEX map_index ON map (zoom_level, tile_column, tile_row);");
CREATE UNIQUE INDEX grid_key_lookup ON grid_key (grid_id, key_name);");
CREATE UNIQUE INDEX keymap_lookup ON keymap (key_name);");
CREATE UNIQUE INDEX grid_utfgrid_lookup ON grid_utfgrid (grid_id);");
CREATE UNIQUE INDEX images_id ON images (tile_id);");
CREATE UNIQUE INDEX name ON metadata (name);");
CREATE VIEW tiles AS SELECT map.zoom_level AS zoom_level, map.tile_column AS tile_column, map.tile_row
AS tile_row, images.tile_data AS tile_data FROM map JOIN images ON images.tile_id = map.tile_id;");
CREATE VIEW grids AS SELECT map.zoom_level AS zoom_level, map.tile_column AS tile_column, map.tile_row
AS tile_row, grid_utfgrid.grid_utfgrid AS grid FROM map JOIN grid_utfgrid ON grid_utfgrid.grid_id =
map.grid_id;");
CREATE VIEW grid_data AS SELECT map.zoom_level AS zoom_level, map.tile_column AS tile_column,
map.tile_row AS tile_row, keymap.key_name AS key_name, keymap.key_json AS key_json FROM map JOIN
grid_key ON map.grid_id = grid_key.grid_id JOIN keymap ON grid_key.key_name = keymap.key_name;");
実は仕様の出所不明…
と最近気付いた
謎仕様!!!
35 2014/11/08
40. Shared Project (or PCL) MBTiles
ファイルのコピー処理
this.dbFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
this.dbPath = Path.Combine (this.dbFolder, this.dbFile);
Type type = this.GetType ();
Stream myInput = type.Assembly.GetManifestResourceStream ("JXUGMBTiles." + this.dbFile);
Stream myOutput = new FileStream(this.dbPath, FileMode.OpenOrCreate);
byte[] buffer = new byte[1024];
int b = buffer.Length;
int length;
while ((length = myInput.Read(buffer, 0, b)) > 0) {
myOutput.Write(buffer, 0, length);
}
myOutput.Flush();
myOutput.Close();
myInput.Close();
コピー先のフォルダを取得
40 2014/11/08
41. Shared Project (or PCL) MBTiles
ファイルのコピー処理
this.dbFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
this.dbPath = Path.Combine (this.dbFolder, this.dbFile);
Type type = this.GetType ();
Stream myInput = type.Assembly.GetManifestResourceStream ("JXUGMBTiles." + this.dbFile);
Stream myOutput = new FileStream(this.dbPath, FileMode.OpenOrCreate);
byte[] buffer = new byte[1024];
int b = buffer.Length;
int length;
while ((length = myInput.Read(buffer, 0, b)) > 0) {
myOutput.Write(buffer, 0, length);
}
myOutput.Flush();
myOutput.Close();
myInput.Close();
EmbededResourceのStreamを開く
コピー先のStreamも開く
41 2014/11/08
42. Shared Project (or PCL) MBTiles
ファイルのコピー処理
this.dbFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
this.dbPath = Path.Combine (this.dbFolder, this.dbFile);
Type type = this.GetType ();
Stream myInput = type.Assembly.GetManifestResourceStream ("JXUGMBTiles." + this.dbFile);
Stream myOutput = new FileStream(this.dbPath, FileMode.OpenOrCreate);
byte[] buffer = new byte[1024];
int b = buffer.Length;
int length;
while ((length = myInput.Read(buffer, 0, b)) > 0) {
myOutput.Write(buffer, 0, length);
}
myOutput.Flush();
myOutput.Close();
myInput.Close();
コピー処理
42 2014/11/08
43. Shared Project (or PCL)
xyzから画像の取得
public class tiles {
public int zoom_level { get; set; }
public int tile_column { get; set; }
public int tile_row { get; set; }
public byte[] tile_data { get; set; }
}
…
public byte[] GetTileImage(int x, int y, int z) {
byte[] image = null;
y = (int)Math.Pow (2.0, (double)z) - y – 1;
using (var conn = new SQLiteConnection(this.dbPath)) {
var query = conn.Table<tiles> ().Where (v => v.zoom_level == z && v.tile_column == x &&
v.tile_row == y);
if (query.Count () != 0) {
var tile = query.First ();
image = tile.tile_data;
}
}
return image;
}
SQLite.Netを使用、スキーマクラス
43 2014/11/08
44. Shared Project (or PCL)
xyzから画像の取得
public class tiles {
public int zoom_level { get; set; }
public int tile_column { get; set; }
public int tile_row { get; set; }
public byte[] tile_data { get; set; }
}
…
public byte[] GetTileImage(int x, int y, int z) {
byte[] image = null;
y = (int)Math.Pow (2.0, (double)z) - y – 1;
using (var conn = new SQLiteConnection(this.dbPath)) {
var query = conn.Table<tiles> ().Where (v => v.zoom_level == z && v.tile_column == x &&
v.tile_row == y);
if (query.Count () != 0) {
var tile = query.First ();
image = tile.tile_data;
}
}
return image;
}
SQLite.Netでx,y,zが一致する画像を検索
44 2014/11/08
45. Xamarin iOS
public class MBTilesProvider : SyncTileLayer {
public override UIImage Tile (uint x, uint y, uint zoom) {
var image = accessor.GetTileImage ((int)x, (int)y, (int)zoom);
SyncTileLayerを継承したTileLayerを作成し、
UIImageを返すTileメソッドを実装
if (image == null) {
return Constants.TileLayerNoTile;
} else {
return UIImage.LoadFromData (NSData.FromArray(image));
}
}
}
…
public override void ViewDidLoad () {
var mbProvider = new MBTilesProvider ();
mbProvider.Map = mapView;
}
TileLayerのMapプロパティに
MapViewを指定するだけ
45 2014/11/08
46. Xamarin Android
class MBTilesProvider : Java.Lang.Object, ITileProvider {
public Tile GetTile(int x, int y, int zoom) {
var image = accessor.GetTileImage (x, y, zoom);
Java.Lang.Object、ITileProviderを
継承したTileProviderを作成し、
Tileを返すGetTileメソッドを実装
if (image == null) {
return TileProvider.NoTile;
} else {
return new Tile(TILE_WIDTH, TILE_HEIGHT, image);
}
}
}
…
var mbProvider = new MBTilesProvider ();
var mbOptions = new TileOverlayOptions();
mapView.AddTileOverlay( mbOptions.InvokeTileProvider(mbProvider) );
TileOverlayOptions経由で生成した
TileOverlayをAddTileOverlayで
MapViewに追加
46 2014/11/08