編集: 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);
}
}