1

編集: SKMaps に問題があります。ボタン付きのメニューと、ボタンをクリックしたときにボタンの下に計算されたルートを表示するマップを表示しようとしています。クリックすると、gpx ファイルがダウンロードされ、それを使用してルートの計算が実行されます。初めて計算を実行すると、機能します(計算と焦点の両方)。ただし、次回関数を呼び出すたびに、ルートは実際に計算されますが、フォーカスははるかに離れています。

  • 私のコードは iOS ですが、Android でも同じ問題が発生します。
  • myrouting デリゲートは自分自身に設定されています。
  • サブビューとして再度追加する前に、mapView を削除します。
  • 焦点を当てていないだけでルートが表示されます。

私のクラスの関連部分は次のとおりです。

IOS :

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self requestFiles];
    fileData = [[NSMutableData alloc] init];
    self.mapView = [[SKMapView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame))];
    self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;    
    [SKRoutingService sharedInstance].mapView = self.mapView;
    [SKRoutingService sharedInstance].routingDelegate = self;
}


-(void) generateContent{
    self.container.contentSize = CGSizeMake(320, numberOfRoutes*65);
    for (int i = 0; i<numberOfRoutes; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0,i*50, 320, 55);
        [button addTarget:self action:@selector(displayRoute:) forControlEvents:UIControlEventTouchUpInside];
        [button setTag:i+1];
        [self.container addSubview:button];
    }

}


-(void)displayRouteFile:(NSString *) fname{
    if (downloadComplete) {
        for (UIView *item in self.container.subviews) {
            [item removeFromSuperview];
        }
        [self generateContent];
        downloadComplete = NO;
        self.mapView.frame = CGRectMake(0,(activeButtonNumber+1)*50+10, 320, 200);
        self.container.contentSize = CGSizeMake(320, self.container.contentSize.height+210);
        for (UIView *item in self.container.subviews) {
            if ([item isKindOfClass:[UIButton class]]) {
                UIButton *buttonToMove = (UIButton *) item;
                if (buttonToMove.tag>activeButtonNumber+1) {
                    [buttonToMove setCenter:CGPointMake(item.center.x, item.center.y+220)];
                }
            }
        }
        [[SKRoutingService sharedInstance]clearCurrentRoutes];
        [[SKRoutingService sharedInstance] clearAllRoutesFromCache];
        [[SKRoutingService sharedInstance] clearRouteAlternatives];
        [[SKRoutingService sharedInstance] startRouteFromGPXFile:fname];
        [self.container addSubview:self.mapView];
    }
}

-(IBAction)displayRoute:(UIButton *)sender{
    UIButton *button = (UIButton *)sender;
    [button setBackgroundImage:activeButtonBackground forState:UIControlStateNormal];
    int route = button.tag-1;
    activeButtonNumber = route;
    receiveFile = YES;
    //download route
    ...
    fileData = [[NSMutableData alloc] init];
}

- (void)routingService:(SKRoutingService *)routingService didFinishRouteCalculationWithInfo:(SKRouteInformation*)routeInformation{
    NSLog(@"Route is calculated with id: %u", routeInformation.routeID);
    [routingService zoomToRouteWithInsets:UIEdgeInsetsZero]; 
    // zoom to current route
    ^^^THIS PART DOES NOT WORK^^^
}

- (void)routingServiceDidFailRouteCalculation:(SKRoutingService *)routingService{
    NSLog(@"Route calculation failed.");
}

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[SKRoutingService sharedInstance]clearCurrentRoutes];
    activeButtonNumber = 0;
}

アンドロイド:

私は TestThis というアクティビティを複数回開いています (GPX ファイルにつながる別のファイルパスを指定するたびに)。アクティビティを初めて開いたときに、プロセス全体が正常に機能します。アクティビティに指定したファイルパスが何であれ、ルートが表示され、ズームされます。戻って別のファイルパスを選択して、新しいルートでアクティビティを作成すると、マップは別の場所にズームします。

それは物事が起こる順序です:

  • onCreate バンドルからファイルへのパスを取得します。
  • onSurfaceCreated currentRoute をクリアし、新しいルートの計算を開始します。
  • onRouteCalculationCompleted 新しいルートを現在のルートに設定しました。
  • onAllRoutesCompleted ズームしてみます。

public class TestThis extends Activity implement SKRouteListener, SKMapSurfaceListener {

private static SKMapSurfaceView mapView;
String path;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prazen);

    Bundle bundle = getIntent().getExtras(); 
    path = bundle.getString("filepath");

    RelativeLayout theArea = (RelativeLayout) findViewById(R.id.placeHere);
    SKMapViewHolder myMapHolder = new SKMapViewHolder(TestThis.this);       
    mapView = myMapHolder.getMapSurfaceView();
    mapView.setMapSurfaceListener(this);
    mapView.getMapSettings().setCurrentPositionShown(false);
    theArea.addView(myMapHolder);

    SKRouteManager.getInstance().setRouteListener(TestThis.this);               
}

@Override
public void onRouteCalculationCompleted(final int statusMessage, final int routeDistance, final int routeEta,  final boolean thisRouteIsComplete, final int id) {

    //SKRouteManager.getInstance().zoomToRoute((float)1.2, (float)1.2, 110, 8, 8, 8);
    if(SKRouteManager.getInstance().setCurrentRouteByUniqueId(id)){
        System.out.println("Current route selected!");          
    }

}

@Override
public void onAllRoutesCompleted() { 
    System.out.println("On all routes compl");
    SKRouteManager.getInstance().zoomToRoute((float)1.2, (float)1.2, 110, 8, 8, 8);
    //SKRouteManager.getInstance().zoomMapToCurrentRoute();
}

@Override
public void onSurfaceCreated() {
    // TODO Auto-generated method stub
    SKRouteManager.getInstance().clearCurrentRoute();
    SKRouteManager.getInstance().setRouteFromGPXFile(path, SKRouteSettings.SKROUTE_CAR_SHORTEST, false, false, false);      
}

}
4

1 に答える 1

1

IOS バグはクライアント側にあります。

問題は、ルートが計算されるときに、マップ ビューの前のフレームが使用されるため、ルートが中央に配置されないことです。[self.container addSubview:self.mapView];前に移動

[[SKRoutingService sharedInstance] clearCurrentRoutes]; 
[[SKRoutingService sharedInstance] clearAllRoutesFromCache]; 
[[SKRoutingService sharedInstance] clearRouteAlternatives]; 
[[SKRoutingService sharedInstance] startRouteFromGPXFile:fname]; 

問題を修正する必要があります。

Android: アクティビティの作成直後に zoomToRoute() への呼び出しが行われると、不適切なズームの問題が発生することがあります。この問題の回避策として、v2.2 オープン ソース デモと同じアプローチに従うことができます: アクティビティの再作成を回避し、マップを表示するアクティビティと同じアクティビティから GPX トラックを選択します。デモのメニュー。

元のバグ/原因は、将来のアップデートで対処されます。

于 2014-09-02T11:37:01.467 に答える