C# Monotouch で Mapkit のイメージ オーバーレイを追加するための優れたチュートリアルを探していました。
色付きの円または多角形のオーバーレイの例を多数見つけました。しかし、マップの上に PNG をロードしたいと考えています。私は MonoAndroid から来て、そこでそれを行いましたが、プログラムを iOS に転送する必要があります。
客観的な C の例でも役に立ちますが、Mono の方が優れています。
C# Monotouch で Mapkit のイメージ オーバーレイを追加するための優れたチュートリアルを探していました。
色付きの円または多角形のオーバーレイの例を多数見つけました。しかし、マップの上に PNG をロードしたいと考えています。私は MonoAndroid から来て、そこでそれを行いましたが、プログラムを iOS に転送する必要があります。
客観的な C の例でも役に立ちますが、Mono の方が優れています。
結局、ネイティブのObjective Cコードをダウンロードし、それをC#に変換するだけでした。関数名は非常に似ており、XamarinAPIリファレンスのドキュメントは非常に役立ちます。
そこで、アプリデリゲートの周りでいくつかのトリッキーなバンプに遭遇し、C#とObjectiveCでの処理方法が異なります。
変換するのが最も難しい2つの関数と私の解決策は次のとおりです。
1)マップオーバーレイクラスのDraw関数
public override void DrawMapRect (MKMapRect mapRect, float zoomScale, CGContext ctx)
{
InvokeOnMainThread(
() =>
{
UIImage image = UIImage.FromFile(@"indigo_eiffel_blog.png");
DrawImgRotated(image, 0, ctx);
}
);
}
public void DrawImgRotated(UIImage image, float rotDegree, CGContext c)
{
c.SaveState();
CGImage imageRef = image.CGImage;
//loading and setting the image
MKMapRect theMapRect = ((MapOverlay)this.Overlay).BoundingMapRect;//MKMapRect theMapRect = [self.overlay boundingMapRect];
RectangleF theRect = RectForMapRect(theMapRect);
//we need to flip and reposition the image
c.ScaleCTM( 1.0f, -1.0f);
c.TranslateCTM(-theRect.Width/8,-theRect.Height);
// Proper rotation about a point
var m = CGAffineTransform.MakeTranslation(-theRect.Width/2,-theRect.Height/2);
m.Multiply( CGAffineTransform.MakeRotation(DegreesToRadians(rotDegree)));
m.Multiply( CGAffineTransform.MakeTranslation(theRect.Width/2,theRect.Height/2));
c.ConcatCTM( m );
c.DrawImage(theRect, imageRef);
c.RestoreState();
}
2)MKOverlayをオーバーライドするmapOverlayクラスの境界mapRect関数。はい、位置はハードコーディングされています。単位変換atmに取り組んでいますが、これらは、使用したサンプルのオブジェクトcコードと同じように画像を描画するための正しい座標です。
public MKMapRect BoundingMapRect
{
[Export("boundingMapRect")]
get
{
var bounds = new MKMapRect(1.35928e+08, 9.23456e+07,17890.57, 26860.05);
return bounds;
}
}
私が変換したObjectiveCプロジェクトのソースコードは次のとおりです:https ://github.com/indigotech/Blog-MKMapOverlayView
Xamarin APIリファレンスドキュメント:http://iosapi.xamarin.com/
これを行う方法は、オーバーレイする画像の種類によって異なります。かなり小さい場合は、1 つの画像を使用するだけで済むはずです。ただし、ズームインできると予想されるより広い領域をカバーする場合は、パフォーマンスを向上させるために別のタイルに分割する必要がある場合があります。
スタック オーバーフローに関するその他の質問を次に示します。
画像オーバーレイを作成して MKMapView に追加するにはどうすればよいですか?
iPhone - 画像オーバーレイ MapKit フレームワーク?
Apple の WWDC2010 サンプル コード TileMap を参照 してください https://github.com/klokantech/Apple-WWDC10-TileMap (誰かによって GitHub に投稿されたもの)
これは Mono とは何の関係もありませんが、変換できるはずです…</p>