15

定義された境界に基づいて、GoogleMaps で位置をランダムに生成するアプリがあります。したがって、最初にランダムな LatLng を生成し、次にこのポイントが境界内にあるかどうかを確認します。であれば、有効です。

Builder builder = new LatLngBounds.Builder();

        double antartica[] = {-62.5670958528642, -59.92767333984375, -62.584805850293485, -59.98260498046875, -62.61450963659083};
        for (int i = 0; i < antartica.length; i++) {
            builder.include(new LatLng(antartica[i],antartica[++i]));
        }
        pAntarctica = builder.build();

LatLng point = generateRandomPosition();
    if(isWithinBoundaries(point))
        return point;
    else
        return getValidPoint();

したがって、この後、私は有効なポイントになります。私の問題は、Google マップで有効なポイントがストリートビューで有効であるとは限らないことです。

このランダムなポイントは、まだストリートビューにマッピングされていない地球上のどこかにある可能性があります。そこでも有効である必要があります。

このリンクに続く JavaScript API v3 を使用してこれを実現できることは承知しています。

次のようにします。

var latLng = new google.maps.LatLng(12.121221, 78.121212);
            streetViewService.getPanoramaByLocation(latLng, STREETVIEW_MAX_DISTANCE, function (streetViewPanoramaData, status) {
                if (status === google.maps.StreetViewStatus.OK) {
                    //ok
                } else {
                    //no ok
                }
            });

しかし、私はAndroidのみを使用してこれを行うことを望んでいます。ちなみに、 Google Maps v2 Android ではなく、Google Play Services API を使用しています。

誰でも光を当てることができますか?

編集: ラタナの提案に従って、これは私がこれまでに持っているものです:

svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
            @Override
            public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
                for(final LatLng point : points) {
                    System.out.println(point.latitude + " " + point.longitude);     
                    panorama.setPosition(point, 1000);

                    final CountDownLatch latch = new CountDownLatch(1);

                    mHandlerMaps.post(new Runnable() {
                        @Override
                        public void run() {
                            if (panorama.getLocation() != null) {
                                System.out.println("not null " + panorama.getLocation().position);
                                writeToFile(panorama.getLocation().position.toString());
                                l.add(point);
                            }
                            latch.countDown();
                        }
                    });

                    try {
                        latch.await(4, TimeUnit.SECONDS);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(l.toString());
            }
        });
4

5 に答える 5

6
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
    mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
@Override
public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
    if (streetViewPanoramaLocation != null && streetViewPanoramaLocation.links != null) {
        // location is present
    } else {
        // location not available
    }
}
 });

編集: Google の公式の回答はこちら ( https://code.google.com/p/gmaps-api-issues/issues/detail?id=7033 ) で、ここを指しています: https://code.google.com/p /gmaps-api-issues/issues/detail?id=4823

公式の解決策には、公式の Google Street View Image API (無料、制限なし - https://developers.google.com/maps/documentation/streetview/metadata ) を HTTPS 経由で使用することが含まれます。

古い(非推奨)回答:

iOS SDK のようにパノラマのクエリを実行できるように Google が API を更新するまで、醜いが API 内にとどまる回避策をハックしました。

これには、 の作成が含まStreetViewPanoramaViewれますが、レイアウトへのアタッチは行われず、その位置が現在の場所に設定されます。そして、それに続くパノラマの場所があるかどうかをテストします。

これは機能しているようですが、iOS SDK にはこの機能があるため、Android Google Maps API V2 (Google Play Services API の一部) トラッカーにこれを追加するリクエストを提出する予定です。

// Handle on the panorama view
private StreetViewPanoramaView svpView;

...

// create a StreetViewPanoramaView in your fragment onCreateView or activity onCreate method
// make sure to handle its lifecycle methods with the fragment or activity's as per the documentation - onResume, onPause, onDestroy, onSaveInstanceState, etc.
StreetViewPanoramaOptions options = new StreetViewPanoramaOptions();
svpView = new StreetViewPanoramaView(getActivity(), options);
svpView.onCreate(savedInstanceState);

...

// Snippet for when the map's location changes, query for street view panorama existence
private Handler mHandler = new Handler();
private static final int QUERY_DELAY_MS = 500;

// When the map's location changes, set the panorama position to the map location
svpView.getStreetViewPanorama().setPosition(mapLocationLatLng);

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if (svpView.getStreetViewPanorama().getLocation() != null) {
            // YOUR DESIRED ACTION HERE -- get the panoramaID, etc..
            // getLocation() -- a StreetViewPanoramaLocation -- will be null if there is no panorama
            // We have to delay this a bit because it may take some time before it loads
            // Note that adding an OnStreetViewPanoramaChangeListener doesn't seem to be reliably called after setPosition is called and there is a panorama -- possibly because it's not been added to the layout?
        }
    }
}, QUERY_DELAY_MS);

編集: 新しい非同期 API 呼び出しを使用するには:

svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
    @Override
    public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
        panorama.setPosition(mapLocationLatLng, DEFAULT_SEARCH_RADIUS);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (panorama.getLocation() != null) {
                    // your actions here
                }
            }
        }, QUERY_DELAY_MS);

于 2014-08-22T00:49:37.877 に答える
5

私はこの質問のためにたくさんグーグルします。最後に、便利なリンクを 1 つ取得しました。Android API で getPanoramaByLocation() JavaScript 関数を直接使用する方法はないことを確認してください。しかし、これには回避策があります。

ここで私はURLを提供しています:

http://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,-73.988354&fov=90&heading=235&pitch=10

ケースを見る:

  1. 有効な緯度/経度を指定してこの URL にアクセスしたとき。ストリートビューになります。したがって、その画像サイズまたはコンテンツを使用して、空白の画像か有効な画像かを確認できます。

この URL を参照してください。

http://maps.googleapis.com/maps/api/streetview?size=400x400&location=73.67868,-73.988354&fov=90&heading=235&pitch=10

  1. 上記の URL で無効な lat/lng を渡しましたが、これは、この lat/lng にはストリートビューがないことを意味するため、「テキスト抽出ライブラリ」を使用するか、ファイル サイズを確認してください。その時点でストリートビューが利用できるかどうかがわかります

ストリートビューを取得するための URL をヒットしたときの応答については、このリンクを確認してください。

https://developers.google.com/maps/documentation/geocoding/?hl=nl

于 2014-07-31T13:20:39.910 に答える
3

特定の場所でStreetViewが利用可能かどうかを(かなり確実に)確認できる小さなライブラリ( VVBの回答に基づく)を作成しました。

お気軽にチェックしてください。

ストリートビュープローブ

于 2015-06-01T08:25:43.297 に答える
1
  1. 利用可能なパノラマ ビューを検証します

    mStreetViewPanoramaView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
            //Using setPositionWithRadius
            streetViewPanorama.setPosition(new LatLng(latitud, longitud), 200);
            mPanorama = streetViewPanorama;
    
            mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
                @Override
                public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
                    if (streetViewPanoramaLocation == null) {                            
                        Log.e("StreetViewActivity","Panoramic view not available");                            
                    }
                }
            });
        }
    });
    
于 2019-03-19T21:56:05.640 に答える
0

私のストリートビュー アプリでは、コンパニオンとしてスクレイピング アプリを作成しました。このスクレイピング アプリは、指定された半径のすべての緯度/経度の場所を調べ、ストリートビューにパノラマをクエリします。

このアプリの出力は、私のニーズに適した解像度 (5 度) の緯度/経度の場所の小さなテキスト ファイルです。次に、このデータ ファイルをメイン アプリでストリートビュー ロケーションのソースとして使用します。

setPostion(LatLng, radius) メソッドを使用すると、毎回結果が得られることが保証されます。このファイルのサイズも非常に小さく、500kb 未満です。

Google が StreetView のデータセットを公開することはないと思います (私はメイン アプリを更新するたびにスクレイピング アプリを実行して、最新の値になっていることを確認しています)。boolean hasStreetView(LatLng, radius) のいずれかの署名を持つメソッドを提供するかどうかはわかりません。

于 2014-08-26T03:06:25.890 に答える