Intereting Posts
Обновить индикатор выполнения в панели уведомлений Jodatime начало дня и конца дня Возможно ли переход от общего элемента в представление в RecyclerView? Невозможно обновить / обновить список в фрагменте из другого фрагмента в ViewPager WhereNear query не работает должным образом в Parse Установите виджет Android Gallery, чтобы показать конкретное начальное изображение Изображение, сохраненное на SD-карте, не отображается в приложении «Галерея Android» Как интегрировать Paypal в приложение для Android? Как открыть файл .db. Файл .db создается из формы eclipse (android) DDMS -> File explorer -> data —> data -> packagename -> database …? Как мне запустить событие, когда клик происходит за пределами диалогового окна Загрузка и извлечение Zip-файла в Android Журнал ошибок чтения Android из телефонной трубки Проблема закрытия камеры в Samsung Galaxy S3 версии 4.1.1 Включение поддержки WebGL для Android WebView Как определить, когда устройство BLE больше не находится в зоне действия?

Как проверить, действительно ли позиция в 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: Следуя предложению ratana, это то, что у меня есть до сих пор:

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

Solutions Collecting From Web of "Как проверить, действительно ли позиция в StreetView на Android"

 @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-апи-вопросы / вопросы / детали? ID = 4823

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

СТАРОЕ (ОТВЕРЖДЕННОЕ) ОТВЕТ:

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

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

Кажется, что это работает, но будет подавать заявку на Android Google Maps API V2 (который входит в состав API-интерфейсов Google Play Services), чтобы добавить это, поскольку 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'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); 

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

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

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

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

См. Случаи:

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

См. Этот URL:

http://maps.googleapis.com/maps/api/streetview?size=400×400&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

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

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

StreetViewProbe

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

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

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

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