Как узнать, находится ли street view panorama в помещении или на открытом воздухе



Сегодня все больше и больше компаний используют street view для показа квартир изнутри.



Моя программа предоставляет возможность показывать вид на улицу в соответствии с выбранным бизнесом. Но я не хочу показываться в помещении. Только На Улице. Потому что внутри помещения блокирует мне двигаться, только чтобы повернуть на 360 градусов.



Кто-нибудь знает, как извлечь из street view API некоторую ценность, если я собираюсь показать в помещении или на открытом воздухе?



Большое Спасибо,



Это мои фрагменты кода до сих пор, что открыть вид на улицу в соответствии с выбранным адресом:



function load_map_and_street_view_from_address(address) {

var geocoder = new google.maps.Geocoder();
geocoder.geocode( {
'address': address
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var gps = results[0].geometry.location;
create_map_and_streetview(gps.lat(), gps.lng(), 'map_canvas', 'pano');
}
});
}


function create_map_and_streetview(lat, lng, map_id, street_view_id) {
var googlePos = new google.maps.LatLng(lat,lng);

addLatLng = new google.maps.LatLng(lat,lng);
var service = new google.maps.StreetViewService();
service.getPanoramaByLocation(addLatLng, 50, showPanoData);

}

function showPanoData(panoData, status) {
if (status != google.maps.StreetViewStatus.OK) {
$('#pano').html('No StreetView Picture Available').attr('style', 'text-align:center;font-weight:bold').show();
return;
}
$('#pano').show();
var angle = computeAngle(addLatLng, panoData.location.latLng);

var panoOptions = {
position: addLatLng,
addressControl: false,
linksControl: false,
panControl: false,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.SMALL
},
pov: {
heading: angle,
pitch: 10,
zoom: 1
},
enableCloseButton: true,
visible:true
};

panorama.setOptions(panoOptions);

}

function computeAngle(endLatLng, startLatLng) {
var DEGREE_PER_RADIAN = 57.2957795;
var RADIAN_PER_DEGREE = 0.017453;

var dlat = endLatLng.lat() - startLatLng.lat();
var dlng = endLatLng.lng() - startLatLng.lng();

var yaw = Math.atan2(dlng * Math.cos(endLatLng.lat() * RADIAN_PER_DEGREE), dlat)
* DEGREE_PER_RADIAN;
return wrapAngle(yaw);
}

function wrapAngle(angle) {
if (angle >= 360) {
angle -= 360;
} else if (angle < 0) {
angle += 360;
}
return angle;
};


Основная идея состояла в том, чтобы получить панорамное местоположение и проверить расстояние до ближайших мест на 360 градусов.
657   3  

3 ответов:

Я не могу найти никакого формального API для этого (возможно, в будущем они его реализуют), и я не думаю, что вы можете быть уверены, что внутренние плитки будут с пустым описанием.

То, что я обнаружил, работает для меня, это использование этого API: Запустите HTTP GET по этому адресу: "http://cbk0.google.com/cbk?output=xml&ll=52.358445,4.88103 " С ll=LONG, LAT

Это внутренний API, используемый для поиска целевого местоположения pano_id. Это также дает нам некоторую информацию о том, что мы можно сделать с ним: уровни масштабирования, на каких улицах вы находитесь и т. д.

Я заметил, что все результаты для координат, которые имеют изображения с видом на улицу в помещении, имеют scene="_number" level_id="_id" в теге data_properties панорамы. И так, для каждого местоположения вы можете запустить этот запрос и искать эти значения в data_properties результата XML

Некоторые примеры:

indoors:
http://cbk0.google.com/cbk?output=xml&ll=52.358445,4.88103
http://maps.google.com/cbk?output=xml&ll=32.051626,34.7613

outdoors:
http://cbk0.google.com/cbk?output=xml&ll=52.358766,4.880494
http://maps.google.com/cbk?output=xml&ll=32.07782,34.785789

Источник: взлом google street view

Обновить

Похоже, чтобы получить местные предприятия правильно pano_id вам нужно добавить &it=all в запрос пример:

http://cbk0.google.com/cbk?output=xml&hl=x-local&ll=34.058593,-118.240673&it=all

Это правильный pano_id для этого места, вы можете проверить его с помощью этого API

http://cbk0.google.com/cbk?output=tile&panoid=70o9Pukc2KSjO-PfeHussw&zoom=3&x=5&y=1

Вот запрос на функцию, который я подал в Google:
"опция отключения внутренних видов улиц"
https://code.google.com/p/gmaps-api-issues/issues/detail?id=4831

Не стесняйтесь помечать билет там, чтобы помочь ему привлечь внимание

(это нормально с точки зрения этикета? ...не настоящий ответ (пока), но кажется достойным поделиться здесь, так что заинтересованные стороны могут начать / отслеживать билет)

Возможность отфильтровывать внутренние панорамы улиц была реализована в Google Maps JavaScript API некоторое время назад.

Вы можете использовать StreetViewService для поиска только наружных панорам. В запросе вы должны указать источник как outdoor

Https://developers.google.com/maps/documentation/javascript/reference/3/#StreetViewSource

Посмотрите на следующий пример кода, который демонстрирует, как получить только открытый панорамы

var panorama;
function initialize() {
    var svService = new google.maps.StreetViewService();
    var panoRequest = {
        location: new google.maps.LatLng(37.800953,-122.436738),
        preference: google.maps.StreetViewPreference.NEAREST,
        radius: 50,
        source: google.maps.StreetViewSource.OUTDOOR
    };

    svService.getPanorama(panoRequest, function(panoData, status){
        if (status === google.maps.StreetViewStatus.OK) {
            panorama = new google.maps.StreetViewPanorama(
                document.getElementById('street-view'),
                {
                    pano: panoData.location.pano,
                    pov: {
                        heading: 10,
                        pitch: 10
                    }
                });
        } else {
            //Handle other statuses here
        }
    });
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#street-view {
  height: 100%;
}
<div id="street-view"></div>
<script async defer
         src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDztlrk_3CnzGHo7CFvLFqE_2bUKEq1JEU&callback=initialize">
    </script>

Надеюсь, это поможет!

Comments

    Ничего не найдено.