MkMapView に線を描画していますが、その幅をメートル単位で指定したいと考えています。
私はこのようなことを試しました:
-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>) overlay
{
if([overlay isKindOfClass:[MKPolyline class]])
{
MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
double ppm = MKMapPointsPerMeterAtLatitude(myLatitude);
renderer.lineWidth = ppm * myMetersValue;
...
これにより、myMetersValue よりもはるかに広い線が生成され、ズームインおよびズームアウトしてもスケーリングされません。
ppmは約で一定のままです。地図を拡大縮小しても9.49。myLatitude が有効な緯度 (約 45 度) であることを確認しました。myMetersValue が妥当な # (約 18m) であることを確認しました。
(編集)
MKMapPointsPerMeterAtLatitude によって返される MapPoints がスクリーン ポイントではないことを発見したため、その関数を使用できません。
したがって、私の基本的な問題は、mkMapView でメーターをスクリーン ポイントに変換する方法です。もっと簡潔に言うと、コードで ppm の値を取得するにはどうすればよいですか? 私はこれを試しました(SOの他の場所にあります):
MKCoordinateRegion myRegion = MKCoordinateRegionMakeWithDistance(mapView.centerCoordinate, 400, 0);
CGRect myRect = [mapView convertRegion: myRegion toRectToView: nil];
double ppm = myRect.size.width / 400.0;
それはうまくいきませんでした。
それから私はこれを試しました:
CLLocationCoordinate2D l1 = [mapView convertPoint:CGPointMake(0,0) toCoordinateFromView:mapView];
CLLocation *ll1 = [[CLLocation alloc] initWithLatitude:l1.latitude longitude:l1.longitude];
CLLocationCoordinate2D l2 = [mapView convertPoint:CGPointMake(0,500) toCoordinateFromView:mapView];
CLLocation *ll2 = [[CLLocation alloc] initWithLatitude:l2.latitude longitude:l2.longitude];
double ppm = 500.0 / [ll1 distanceFromLocation:ll2];
ここでの考え方は、500 スクリーン ポイント離れた 2 つのポイントの緯度/経度を取得することです。次に、それらの間の距離をメートル単位で取得して、ppm を計算できるようにします。この種の動作はしましたが、結果の ppm が正しくないように見えるので、これが正しいとは確信できません。また、マップをズームすると、マップ上の既存の線が再レンダリングされないため、ズーム後も同じ幅のままになります (ただし、これは別の問題です)。
(編集)
私のppmの計算は正しいようです。問題は、ユーザーがズームを終了する前にレンダラーが呼び出されるため、線が最終的なズーム スケールでレンダリングされないことです。最終的なズームスケールが決定されたら再レンダリングを強制すると、ppm が正しくなり、コードが機能します。