16

如今,越来越多的企业使用街景从室内展示公寓。

我的程序提供了根据所选业务显示街景的能力。但我不想在室内展示。仅限户外。因为 Indoors 阻止我移动,只能 360 度旋转。

如果我要在室内或室外展示,有谁知道如何从街景 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 度左右最近地点的距离。

4

3 回答 3

11

我似乎找不到任何正式的 API(也许将来他们会实现一个),而且我认为你不能确定室内瓷砖的描述是空的。

我发现对我有用的是使用这个API:运行一个HTTP GET到这个地址:“ http://cbk0.google.com/cbk?output=xml&ll=52.358445,4.88103 ”和ll=LONG,LAT

这是用于查找目标位置 pano_id 的内部 API。它还为我们提供了一些关于我们可以用它做什么的信息:缩放级别、您所在的街道等。

我注意到具有室内街景图像的坐标的所有结果都包含scene="_number" level_id="_id" 在全景图的data_properties标签中。因此,对于每个位置,您都可以运行此请求并在结果 XML 的 data_properties 中查找这些值

一些例子:

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

资料来源:黑客谷歌街景

更新

似乎要让本地企业正确 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
于 2013-02-22T08:16:23.867 回答
4

这是我向 Google 提交的功能请求:
“禁用室内街景的选项”
https://code.google.com/p/gmaps-api-issues/issues/detail?id=4831

随意给票加注星标,以帮助它获得一些关注

(这在礼仪方面可以吗?...不是一个真正的答案(还),但似乎值得在这里分享,所以有兴趣的人可以加注/跟踪票)

于 2013-04-11T22:30:31.500 回答
3

过滤掉室内街景全景图的功能是前段时间在 Google Maps JavaScript API 中实现的。

您可以使用 StreetViewService 仅搜索室外全景图。在请求中,您应该将源指定为户外

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>

我希望这有帮助!

于 2018-03-19T13:34:34.917 回答