Подтвердить что ты не робот

Как проверить, действительно ли позиция в StreetView на Android

У меня есть приложение, которое произвольно генерирует позиции в 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 не обязательно действительна в StreetView. Может случиться так, что эта случайная точка находится где-то в мире, еще не отображенном в StreetView. Мне также нужно, чтобы он был там действительным.

Я знаю, что вы можете это сделать, используя JavaScript API v3, следуя этой ссылке: https://developers.google.com/maps/documentation/javascript/reference#StreetViewService

Вы сделали бы что-то вроде этого:

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. Я использую API сервисов Google Play, и не Google Maps v2 Android.

Может ли кто-нибудь пролить свет?

EDIT: Следуя предложению ратана, это то, что у меня есть до сих пор:

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());
            }
        });
4b9b3361

Ответ 1

@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
    }
}
 });

EDIT: официальный ответ 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

Официальное решение включает использование официального API-интерфейса Google Street View Image (бесплатный, без ограничений - https://developers.google.com/maps/documentation/streetview/metadata) через HTTPS.

OLD (DEPRECATED) ОТВЕТ:

Я взломал обходной путь для этого, который является уродливым, но остается в API, пока Google не обновит его, чтобы разрешить просмотр панорамы так, как это делает SDK iOS.

Это включает в себя создание StreetViewPanoramaView, но не прикрепление его к макету и установку его положения в текущее местоположение. И затем проверьте, имеет ли место панорама следующее.

Это, похоже, сработает, но будет подавать запрос на Android Google Maps API V2 (который является частью API-интерфейсов служб Google Play), чтобы добавить это, поскольку IOS SDK имеет эту возможность.

// 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 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 location changes, query for street view panorama existence
private Handler mHandler = new Handler();
private static final int QUERY_DELAY_MS = 500;

// When the map 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 not been added to the layout?
        }
    }
}, QUERY_DELAY_MS);

EDIT: использовать новый вызов API Async:

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);

Ответ 2

Я много говорю по этому вопросу. Наконец, я получил одну полезную ссылку. Смотрите, нет прямого способа использования функции getPanoramaByLocation() javascript в android api. Но есть дело с этим.

Здесь я предоставляю URL:

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

Смотрите случаи:

  • Когда вы нажимаете этот URL, предоставляя действительные lat/lng. Вы получите уличное представление. Таким образом, вы можете использовать этот размер или содержимое изображения для проверки того, является ли оно пустым изображением или допустимым изображением.

Смотрите этот URL:

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

  • В приведенном выше URL-адресе, который я передал недействительным, lat/lng означает, что для этого lat/lng нет просмотра улиц, поэтому вы можете использовать "библиотеку извлечения текста" или путем проверки размера файла. Вы узнаете, доступно ли уличное представление или нет для этого пункта.

Отметьте эту ссылку для ответа, когда вы нажмете url для поиска улиц:

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

Ответ 3

Я создал небольшую библиотеку (на основе VVB answer), которая позволяет вам (довольно надежно) проверить, доступен ли StreetView для определенного места.

Не стесняйтесь проверить это.

StreetViewProbe

Ответ 4

Для моего приложения StreetView я создал приложение для соскабливания в качестве компаньона, это приложение для скремблирования проходит через все узлы lat/lng в заданном радиусе и запрашивает StreetView для панорамы.

Результат этого приложения - это небольшой текстовый файл локаций lat/lng с разрешением, подходящим для моих потребностей (5 градусов). Затем я использую этот файл данных в своем основном приложении в качестве источника для местоположений StreetView.

Используя метод setPostion (LatLng, radius), я гарантированно получаю результат каждый раз. Размер этого файла также довольно мал < 500кб.

Я сомневаюсь, что Google когда-нибудь выпустит набор данных, где был StreetView (я запускаю свое приложение для очистки до каждого обновления в основное приложение, чтобы убедиться, что у меня есть обновленные значения). Я не уверен, предоставят ли они метод, имеющий следующую подпись: boolean hasStreetView (LatLng, radius).