使用 Google Maps API 根据地址显示房屋的街景

2023-12-04

我正在尝试使用 Google 地图根据地址显示房屋的街景。我创建了一个jsfiddle基于此tutorial。小提琴正在显示默认的初始地址,但我不知道按下按钮时如何将新地址传递到街景代码中。

这是 HTML:

<h3>Enter an Address to view the street view</h3>
<form action="/" method="POST">
    <textarea name='new_address' class="address">150 Glen Road, Toronto</textarea>
    <input type="submit" id="change_street" value="Change Street View Address" />
</form>
<div class="map_container">
    <div id="map_canvas_cont">
        <div id="map_canvas"></div>
    </div>
    <div id="pano_cont">
        <div id="pano"></div>
    </div>
</div>

这是 JavaScript:

var panorama;
var addLatLng;
var showPanoData;
var panorama;

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

    panorama = new google.maps.StreetViewPanorama(document.getElementById("pano"));
    addLatLng = new google.maps.LatLng(lat, lng);
    var service = new google.maps.StreetViewService();
    service.getPanoramaByLocation(addLatLng, 50, showPanoData);

    var myOptions = {
        zoom: 14,
        center: addLatLng,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        backgroundColor: 'transparent',
        streetViewControl: false,
        keyboardShortcuts: false
    }

    var map = new google.maps.Map(document.getElementById(map_id), myOptions);
    var marker = new google.maps.Marker({
        map: map,
        animation: google.maps.Animation.DROP,
        position: addLatLng
    });

}

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;
    }
    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: false,
        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;
}

$(document).ready(function () {
    load_map_and_street_view_from_address("150 Glen Road, Toronto");

    $('#change_street').click(function () {
       alert("How do I pass the new address to the street view code?");
    });

});

有人可以向我解释一下如何解决这个问题吗jsfiddle这样我就可以通过按下按钮传递新地址?谢谢。


可能有多种解决方案,我建议存储地图、标记和全景实例,然后您只需在进一步调用时更新它们的属性,而不是创建新实例。

单击按钮时调用该函数:

load_map_and_street_view_from_address($('textarea[name="new_address"]').val());

替代create_map_and_streetview & showPanoData:

function create_map_and_streetview(lat, lng, map_id, street_view_id) {
    var goo=google.maps,
        map=$('#'+map_id),
        pano=document.getElementById("pano"),
        addLatLng = new goo.LatLng(lat, lng),
        myOptions = {
        zoom: 14,
        center: addLatLng,
        mapTypeId: goo.MapTypeId.ROADMAP,
        backgroundColor: 'transparent',
        streetViewControl: false,
        keyboardShortcuts: false
    }
    if(!map.data('gmap')){
      //store the instances per $.data
      map.data('gmap',new goo.MVCObject());
      map.data('gmap').set('panorama',new goo.StreetViewPanorama(pano));
      map.data('gmap').set('service',new goo.StreetViewService());
      map.data('gmap').set('map',new goo.Map(map[0], myOptions));
      map.data('gmap').set('marker',new goo.Marker({
                                                  map: map.data('gmap').get('map'),
                                                  animation: goo.Animation.DROP,
                                                  position: addLatLng
                                                })
                      );
    }else{
      map.data('gmap').get('map').setCenter(addLatLng);
      map.data('gmap').get('marker').setPosition(addLatLng);
      //always create a new panorama
      //otherwise the panorama will be broken as soon as there is no picture available 
      map.data('gmap').set('panorama',new goo.StreetViewPanorama(pano));
    }

    map.data('gmap').get('service')
      .getPanoramaByLocation(addLatLng, 50, function(panoData, status){ 
         if (status != google.maps.StreetViewStatus.OK) {
            $('#pano').html('No StreetView Picture Available')
              .attr('style', 'text-align:center;font-weight:bold').show();
            return;
        }
      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: false,
        visible: true
      };

      map.data('gmap').get('panorama').setOptions(panoOptions);
    });

}

Demo: http://jsfiddle.net/R59mB/4/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google Maps API 根据地址显示房屋的街景 的相关文章

随机推荐

  • StreamReader Read 方法未读取指定的字符数

    我必须解析一个大文件 所以不要这样做 string unparsedFile myStreamReader ReadToEnd takes 4 seconds parse unparsedFile takes another 4 secon
  • PHP 分页使用 glob 检索图像

    我正在尝试使用 glob 从文件夹中检索图像 并且希望对其进行分页 以便每页仅显示 3 个图像 通过在互联网和 S O 上进行挖掘我有下面的代码 问题是它只从目录中提取三个图像 当我单击下一页时 它会显示相同的 3 个图像 使用 glob
  • 类数据类型的 EasyMock 匹配器

    我对这个和 easymock 的语法做了噩梦 public void foo Class String class getClass 然而 当我拨打 foo String class 时 我得到 java lang IllegalState
  • Google表格公式:单元格范围内的子字符串求和

    我有两列 Col A Col B 01 02 2020 17 03 11 2020 24 03 11 2020 12 我尝试根据 A 列的子字符串对 B 列求和 如下所示 SUMIF A A MID A A 4 2 02 B B SUMIF
  • 如何使用时区格式化 url 日期时间参数

    我到处寻找但找不到答案 我想了解格式化日期时间 带时区 url 参数的方式 情况如下 调用程序具有带有 UTC 时区的 DateTime 值 接收器 Json WebAPI C 正在我的具有中央时区的本地电脑上运行 PoCreationDa
  • jMeter 中的 javax.net.ssl.SSLException

    我正在服务器上测试一些功能 直到昨天为止都运行良好 今天 他们已经启用了 ssl 到服务器 即从 http 到 https 现在 当我运行测试计划时 出现以下错误 我该如何解决这个问题 尽管我在请求中将协议值更改为 https 但我收到以下
  • SSL 证书未安装

    我在 IIS 中安装 SSL 证书时遇到问题 以下是从 CA 获取证书之前的步骤 使用 OpenSSL 生成私钥文件 openssl genrsa out key name key 2048 命令 生成的 csr 文件包含 openssl
  • 如何在 Windows 窗体中为标签添加边框?

    我正在尝试创建一个内部带有白色标签的表单 当我单击某些内容时 表单将消失并仅显示标签 到目前为止 我尝试将 TransparencyKey 放在 Lime 上 当我单击某些内容时 我将 BackColor 更改为 Lime 并将 FormB
  • Live555框架生成错误

    我正在尝试构建框架Live555图书馆 我从以下位置获取了库文件here按照这个SO的回答我已多次尝试根据该答案生成它 它只是给出以下错误 Applications Xcode app Contents Developer Platform
  • Spring Cloud Dataflow 类型转换在处理器组件中不起作用?

    我有一个可以转换的处理器byte 有效负载进入MyClass有效负载 Slf4j EnableBinding Processor class public class MyDecoder ServiceActivator inputChan
  • 如果 Observable 已完成,我是否需要取消订阅 Observable?

    假设我有一个Observable 热门 未完成 我订阅了它 通常当我完成时Subscription我必须取消订阅它以防止内存泄漏 let subject new Subject const sub subject subscribe Nee
  • 如何将 ObservableCollection 绑定到 WPF 中的复选框列表框

    让我先声明一下我对 C 和 WPF 都很陌生 我正在尝试连接一个集合Boolean值到包含 6 个复选框的容器 并在按下按钮时存储这些值的状态 我假设有一种简单的方法可以做到这一点 因为将复选框绑定到集合似乎是一件非常自然的事情 但到目前为
  • XSLT 将字段连接在一起

    我正在尝试过滤特定字段并连接另一个字段 Input
  • 如何使用Pivot_longer将宽类型数据重塑为具有多个变量的长类型数据

    我想问如何将以下数据框从宽类型重塑为长类型 宽类型数据如下 重塑前的宽类型数据 long 类型数据 即我想要获取的数据帧 如下所示 整形后的Long类型数据 如果您能给我使用更长的枢轴来完成此操作的提示 我将非常感激 我可以通过 BLS 和
  • 图表的中心

    给定一棵无向树 其无权边具有 N 个顶点和 N 1 个边 并且数量为 K 找到 K 个节点 以便树中的每个节点与 K 个节点中的至少一个节点的距离在 S 范围内 另外 S 必须是尽可能小的 S 因此 如果 S 我尝试解决这个问题 但是 我觉
  • 在现有 Java 7 代码中使用 Java 8 可选

    我有一项作业 需要将以下 Java 8 之前的代码转换为 Java 8 代码 以下只是一种让我很难完成的方法 public static List
  • 嵌套 mysql 查询的性能损失

    什么是性能损失SELECT FROM Table VS SELECT FROM SELECT FROM Table AS A AS B 我的问题是 首先 SELECT 是否涉及表中行的迭代 或者它只是将所有行作为一个块返回而不进行任何迭代
  • C 中是否有类似于 Java 字符串 'charAt()' 方法?

    我正在尝试将一段代码从 Java 转换为 C 但我被困在这里 试图在每个位置获取一个字符 char ch line while pos lt line length ch line charAt pos C 中有没有类似的东西可以转换行ch
  • django xlsxwriter 中的日期时间问题

    我正在尝试在 django 视图中创建导出到 Excel 的功能 如下所示 def export myreport request sd ed from xlsxwriter workbook import Workbook import
  • 使用 Google Maps API 根据地址显示房屋的街景

    我正在尝试使用 Google 地图根据地址显示房屋的街景 我创建了一个jsfiddle基于此tutorial 小提琴正在显示默认的初始地址 但我不知道按下按钮时如何将新地址传递到街景代码中 这是 HTML h3 Enter an Addre