navigator.geolocation的应用 - 将定位信息显示在百度地图上

  在学习navigator.geolocation的时候,有一个实例是获取坐标后显示在谷歌地图上。众所周知,谷歌地图国内并不能直接访问,得用特殊手段,那我要测试的时候还要开着梯子挺麻烦的,想给别人用也得那个人能访问谷歌地图先。

  地图不止谷歌一家有嘛,咱国内还是可以用用百度地图、必应地图、高德地图这些。这篇文章记录如何在百度地图上显示使用navigator.geolocation返回的定位坐标。

  首先我们要在百度地图开放平台上注册开发者,这样才能申请百度地图的秘钥,有了秘钥才能够使用百度地图的服务,这里就不吧过程写出来了。

  我们需要在网页中使用百度地图,那我们就创建一个浏览器端的百度地图应用,选择自己想要的服务(因为我第一次接触这个,不知道哪些服务对应啥功能,就先全勾上了),白名单因为我是在本地测试的,网页不在服务器上运行,自然也没有域名,所以Referer白名单就设置成了*。

  创建好后我们就可以在应用列表中看到我们刚刚创建的应用了:

  这里的AK号非常重要,我们是要用这个AK号来链接百度地图的。

  百度地图官方有提供实例和开发文档来帮助我们熟悉它家的产品,本篇文章涉及到内容的官方文档会放在下面的参考链接中。

     因为我使用Chrome在本地运行包含使用navigator.geolocation定位的文件,它压根定位不了,Firefox却能正常定位,那就在Firefox上运行本次的实例吧。

  我们来写个简单的页面。这个页面有两个<div>区域,一左一右,左边的用来显示一些获取到的坐标信息以及放操作按钮,右边就是显示百度地图啦。

 1 <head>
 2     <meta charset="UTF-8" />
 3     <title>定位显示在百度地图上</title>
 4     <style>
 5         body {
 6             margin:0px;
 7             padding:0px;
 8         }
 9         /* 显示详细信息的区域 */
10         #detail {
11             width:30%;
12             height:750px;
13             background-color:#DDDDDD;
14             position:absolute;
15             left:0px;
16             top:0px;
17             padding-left:10px;
18         }
19         /* 百度地图区域的样式 */
20         #baiduMap {
21             width:70%;
22             height:750px;
23             position:absolute;
24             right:0px;
25             top:0px;
26         }
27     </style>
28 </head>
29 
30 <body>
31     <div id="detail">
32         <p id="positionState">定位状态:停止</p>
33         <p id="positionInformation">定位信息:<br />经度:<br />纬度:</p>
34         <button onclick="getPos()">获取定位</button>
35     </div>
36     <div id="baiduMap"></div>
37 </body>
网页结构

   在<head>中引入百度地图API文件,标橙的部分就是我们上面创建应用的AK号了: 

1 <head>
2     <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=rj3D8rKFVj3QqNVKNYBFipdA3XMtfN4v"></script>
3 </head>

  在<body>中的<script>中创建百度地图的实例(BMap.Map),传递的参数就是我们用来显示百度地图的区域,本例中使用一个id=baiduMap的<div>区域作为显示区域,所以传递的参数就是这个<div>区域的id:

1 //创建Map实例
2 var map = new BMap.Map("baiduMap");

  之后我们初始化地图的位置,初始化地图的位置需要设置经纬度来设置地图中心定位的坐标(BMap.Point),这里设置成经度116.404,纬度39.915(天安门的坐标),设置地图缩放级别,值越大地图比例就越小。据官方API文档上的介绍,当地图的类型的BMAP_NORMAL_MAP时(可以使用setMapType()方法设置)时,需要在调用centerAndZoom之前要用setCurrentCity()来设置你设置坐标的城市,这里我们就设置成北京:

1 //设置地图显示的城市
2 map.setCurrentCity("北京");
3 //设置地图中心点的坐标
4 var centerPoint = new BMap.Point(116.404,39.915);
5 //初始化地图,设置缩放级别为15
6 map.centerAndZoom(centerPoint,15);

  这个时候我们就能够看到地图了:

  

  但是这个地图此时并不能放大缩小,放大缩小功能呢是需要我们设置开启的,默认是不启动的。

  我们通过Bmap.enableScrollWheelZoom()函数可以开启和关闭地图的放大缩小功能,传递true开启放大缩小功能,传递false关闭放大缩小功能:

1 //开启鼠标滚轮缩放
2 map.enableScrollWheelZoom(true);

  这个时候就可以放大缩小了:

  

  在地图API示例中,有在右上角添加了一个控件:切换地图显示模式,可以选择地图模式和混合模式(实景+地图坐标)。

  创建BMap.MapTypeControl对象,设置能切换的类型有哪些(BMAP_NORMAL_MAPH地图模式 和 BMAP_HYBRID_MAP混合模式),然后使用addControl来添加这个控件:

1 //创建切换地图显示类型的控件
2 var mapTypeCon = new BMap.MapTypeControl({
3     mapTypes:[
4         BMAP_NORMAL_MAP,
5         BMAP_HYBRID_MAP
6         ]        
7 });
8 //添加切换地图显示类型的控件
9 map.addControl(mapTypeCon);

  效果如下:

  这个时候,百度地图导入的部分就暂时告一段落落了,接下来就是结合navigator.geolocation将获取到的定位信息显示在地图上了。

  我希望当我点击旁边的“获取定位”按钮,百度地图就会定位获取到的定位位置,并且显示一个标记。

  我们先获取展示信息的两个元素

1 //获取显示定位状态的元素
2 var posState = document.getElementById("positionState");
3 //获取显示定位信息的元素
4 var posInformation = document.getElementById("positionInformation");

  然后写三个函数,一个是点击按钮获取一次定位的事件,一个是定位成功时回调的函数,一个是定位失败时回调的函数。

  获取一次定位的事件我们绑定在上面的上面的<button>的onclick事件上,因为偷懒所以我在网页结构的时候就给<button>绑上啦(你个懒鬼)

 1 //点击按钮获取定位
 2 function getPos() {
 3     //判断用户是否支持定位
 4     if(navigator.geolocation) {
 5         //支持则获取定位,获取成功回调showPosition,失败回调showError
 6         navigator.geolocation.getCurrentPosition(showPosition,showError);
 7     }
 8     else {
 9         //不支持则修改提示信息告知用户
10         posInformation.innerHTML = "您的浏览器不支持定位";
11     }
12 }

  定位失败时执行的回调函数showError中,我们获取错误代码,然后用个switch来获取并修改提示信息,代码对应的错误信息可以看MDN中PositionError的条目,或者发生错误时调用PositionError.message查看:

 1 //获取定位信息失败时执行的函数
 2 function showError(error) {
 3     //在控制台直接打印错误代码和错误信息
 4     console.log("错误代码:"+error.code + "\n错误信息:" + error.message);
 5 
 6     //使用switch对error的错误代码进行判断,然后修改提示信息
 7     switch(error.code){
 8         //用户拒绝请求
 9         case error.PERMISSION_DENIED:
10             posInformation.innerHTML = "用户拒绝获取地理位置的请求";
11             break;
12         //位置信息不可用
13         case error.POSITION_UNAVAILABLE:
14             posInformation.innerHTML = "位置信息不可用";
15             break;
16         //请求超时
17         case error.TIMEOUT:
18             posInformation.innerHTML = "请求用户地理位置超时";
19             break;
20         //未知错误
21         case error.UNKNOWN_ERROR:
22             posInformation.innerHTML = "未知错误";
23             break;                
24     }
25 }

  定位成功时回调的函数showPosition中,我们吧经纬度信息写在左侧,并且在百度地图上定位我们输入的坐标,并在上面添加一个遮蔽物(在百度地图上出现的定位点啊、路线图啊被称作遮蔽物)标明它定位到的位置。

 1 //成功获取定位
 2 function showPosition(Position) {
 3     //修改左侧坐标信息
 4     posInformation.innerHTML = "定位信息:<br />经度:" + Position.coords.longitude + 
 5                                "<br />纬度:" + Position.coords.latitude;
 6     //创建一个变量储存坐标
 7     var myPos = new BMap.Point(Position.coords.longitude,Position.coords.latitude);
 8     //在百度地图上定位
 9     map.centerAndZoom(myPos,15);
10     //创建遮蔽物
11     var marker = new BMap.Marker(myPos);
12     //将遮蔽物绘制到地图上
13     map.addOverlay(marker);
14 }

  这个时候我们就可以点击按钮获取定位。。。

  啦?不对啊,这定位不是我获取定位的地方啊!怎么偏了呢???

  其实,在百度地图开放平台的开发文档中,有这样一个条目,它是这么说的:

   

  原来如此龙一,不是GPS采集真实的经纬度啊!

   官方在地图API示例中有将GPS坐标转换成百度坐标的的实例,里面有详细的实例。先将坐标储存到数组中,然后创建一个BMap.Convertor对象,使用Convertor对象中的translate()方法进行转换。translate方法需要回调一个函数,我们再在这个函数中将获取到的坐标定位在百度地图中,这个时候的showPosition()函数应该是这样的:

 1 //成功获取定位
 2 function showPosition(Position) {
 3     //创建一个变量储存坐标
 4     var myPos = new BMap.Point(Position.coords.longitude,Position.coords.latitude);
 5     //创建一个数组,用于储存坐标
 6     var pointArr = [];
 7     //将坐标放入数组中
 8     pointArr.push(myPos);
 9     
10     //创建convertor对象,用于将坐标转换成百度地图的坐标
11     var convertor = new BMap.Convertor();
12     //进行坐标转换,转换完成后回调函数translateCallback,可以传递第四个参数来延迟执行
13     convertor.translate(pointArr,1,5,translateCallback);
14 }

  convertor.translate的语法在官方的JavaScript v3.0类参考中看到,善用页面内搜索功能(F3或者Ctrl+F),然后它就会告诉你参数2和参数3的具体含义在Web服务API中(心情复杂.jpg):

  在坐标转化的回调函数中,我们获取转换后的坐标,然后在地图上定位以及创建遮蔽物,修改网页中的提示信息:

 1 //坐标转换后回调的函数
 2 function translateCallback(data) {
 3     //data.status记录本次访问api状态,返回0为成功,失败则为返回其它数字
 4     if(data.status === 0) {
 5         //在百度地图上定位获取到的坐标
 6         map.centerAndZoom(data.points[0],20);
 7         //创建覆盖物
 8         var marker = new BMap.Marker(data.points[0]);
 9         //在地图上绘制覆盖物
10         map.addOverlay(marker);
11         //修改左侧坐标信息
12         posInformation.innerHTML = "定位信息:<br />经度:" + data.points[0].lng +
13                                     "<br />纬度:" + data.points[0].lat;
14     }
15 }

  这个时候定位就比较精准啦:

  基本上我们想要实现的效果就搞完啦,功能并不是很完善,比如我点两次获取定位它会标记两个点,不会删掉上一个点,这个部分就不放出来了(懒)。

  可能删删改改有些朋友做到后面会有点懵逼,我就放出完整的内容在这里啦:

  1 <!DOCTYPE html>
  2 <html>
  3 
  4 <head>
  5     <meta charset="UTF-8" />
  6     <title>定位显示在百度地图上</title>
  7     <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=rj3D8rKFVj3QqNVKNYBFipdA3XMtfN4v"></script>
  8     <style>
  9         body {
 10             margin:0px;
 11             padding:0px;
 12         }
 13         /* 显示详细信息的区域 */
 14         #detail {
 15             width:30%;
 16             height:750px;
 17             background-color:#DDDDDD;
 18             position:absolute;
 19             left:0px;
 20             top:0px;
 21             padding-left:10px;
 22         }
 23         /* 百度地图区域的样式 */
 24         #baiduMap {
 25             width:70%;
 26             height:750px;
 27             position:absolute;
 28             right:0px;
 29             top:0px;
 30         }
 31     </style>
 32 </head>
 33 
 34 <body>
 35     <div id="detail">
 36         <p id="positionState">定位状态:停止</p>
 37         <p id="positionInformation">定位信息:<br />经度:<br />纬度:</p>
 38         <button onclick="getPos()">获取定位</button>
 39     </div>
 40     <div id="baiduMap"></div>
 41     <script type="text/javascript">
 42         //创建Map实例
 43         var map = new BMap.Map("baiduMap");
 44         //设置地图显示的城市
 45         map.setCurrentCity("北京");
 46         //设置地图中心点的坐标
 47         var centerPoint = new BMap.Point(116.404,39.915);
 48         //初始化地图,设置缩放级别为15
 49         map.centerAndZoom(centerPoint,15);
 50         //开启鼠标滚轮缩放
 51         map.enableScrollWheelZoom(true);
 52         //创建切换地图显示类型的控件
 53         var mapTypeCon = new BMap.MapTypeControl({
 54             mapTypes:[
 55                 BMAP_NORMAL_MAP,
 56                 BMAP_HYBRID_MAP
 57                 ]        
 58         });
 59         //添加切换地图显示类型的控件
 60         map.addControl(mapTypeCon);
 61         
 62         //获取显示定位状态的元素
 63         var posState = document.getElementById("positionState");
 64         //获取显示定位信息的元素
 65         var posInformation = document.getElementById("positionInformation");
 66         
 67         
 68         //点击按钮获取定位
 69         function getPos() {
 70             //判断用户是否支持定位
 71             if(navigator.geolocation) {
 72                 //支持则获取定位,获取成功回调showPosition,失败回调showError
 73                 navigator.geolocation.getCurrentPosition(showPosition,showError);
 74             }
 75             else {
 76                 //不支持则修改提示信息告知用户
 77                 posInformation.innerHTML = "您的浏览器不支持定位";
 78             }
 79         }
 80         
 81         //成功获取定位
 82         function showPosition(Position) {
 83             //创建一个变量储存坐标
 84             var myPos = new BMap.Point(Position.coords.longitude,Position.coords.latitude);
 85             //创建一个数组,用于储存坐标
 86             var pointArr = [];
 87             //将坐标放入数组中
 88             pointArr.push(myPos);
 89             
 90             //创建convertor对象,用于将坐标转换成百度地图的坐标
 91             var convertor = new BMap.Convertor();
 92             //进行坐标转换,转换完成后回调函数translateCallback,可以传递第四个参数来延迟执行
 93             convertor.translate(pointArr,1,5,translateCallback);
 94         }
 95         
 96         //获取定位信息失败时执行的函数
 97         function showError(error) {
 98             //在控制台直接打印错误代码和错误信息
 99             console.log("错误代码:"+error.code + "\n错误信息:" + error.message);
100             
101             //使用switch对error的错误代码进行判断,然后修改提示信息
102             switch(error.code){
103                 //用户拒绝请求
104                 case error.PERMISSION_DENIED:
105                     posInformation.innerHTML = "用户拒绝获取地理位置的请求";
106                     break;
107                 //位置信息不可用
108                 case error.POSITION_UNAVAILABLE:
109                     posInformation.innerHTML = "位置信息不可用";
110                     break;
111                 //请求超时
112                 case error.TIMEOUT:
113                     posInformation.innerHTML = "请求用户地理位置超时";
114                     break;
115                 //未知错误
116                 case error.UNKNOWN_ERROR:
117                     posInformation.innerHTML = "未知错误";
118                     break;                
119             }
120         }
121         
122         //坐标转换后回调的函数
123         function translateCallback(data) {
124             //data.status记录本次访问api状态,返回0为成功,失败则为返回其它数字
125             if(data.status === 0) {
126                 //在百度地图上定位获取到的坐标
127                 map.centerAndZoom(data.points[0],20);
128                 //创建覆盖物
129                 var marker = new BMap.Marker(data.points[0]);
130                 //在地图上绘制覆盖物
131                 map.addOverlay(marker);
132                 //修改左侧坐标信息
133                 posInformation.innerHTML = "定位信息:<br />经度:" + data.points[0].lng +
134                                             "<br />纬度:" + data.points[0].lat;
135             }
136         }
137     </script>
138 </body>
139 
140 </html>
全部内容

  

 


参考资料:

MDN - 使用地理位置定位:https://developer.mozilla.org/zh-CN/docs/Web/API/Geolocation/Using_geolocation

百度地图开放平台 - JavaScript API v3.0类参考:http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html

百度地图开放平台 - 地图API演示 - 地图展示:http://lbsyun.baidu.com/jsdemo.htm#a1_2

MDN - PositionError:https://developer.mozilla.org/zh-CN/docs/Web/API/PositionError

MDN - PositionError.message:https://developer.mozilla.org/zh-TW/docs/Web/API/PositionError/message

百度地图开放平台 - 开发文档 - JavaScript API v2.0 - 坐标转换声明:http://lbsyun.baidu.com/index.php?title=jspopular/guide/coorinfo

百度地图开放平台 - 地图API演示 - 原始坐标转成百度坐标:http://lbsyun.baidu.com/jsdemo.htm#a5_2

百度地图开放平台 - Web服务API - 坐标转换:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition

转载于:https://www.cnblogs.com/cwsb/p/10863215.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 mysql数据库安装和配置

2019独角兽企业重金招聘Python工程师标准>>> 一、系统环境 yum update升级以后的系统版本为 [rootyl-web yl]# cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) 二、mysql安装 一般网上给出的资料都是 #yum install mysql #yum install mysql-serve…

5种聪明工作法

1、每天最多做三件事 请拿出你落落长的待办清单&#xff0c;圈出最重要的一~三件事&#xff0c;然后给自己一天的时间&#xff0c;卯足全力解决它! 你不需要因为还有很多事要做而焦虑&#xff0c;只需要专注今天、当下、以及最重要的问题。 《与成功有约》作者史蒂芬.柯维(Step…

【Quartz】Quartz概述及入门实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Quartz 在开源任务调度框架中的翘首&#xff0c;它提供了强大任务调度机制&#xff0c;难能可贵的是它同时保持了使用的简单性。Quartz 允…

python中del语句

有一种方式可以从列表按照给定的索引而不是值来移除一个元素: 那就是 del 语句。 它不同于会返回一个值的 pop() 方法。 del 语句也可以用来从列表中移除切片或者清空整个python列表&#xff08;我们之前用过的方式是将一个空列表赋值给指定的切片&#xff09;。 例如: >>…

偷时间的孩子

从事临床心理工作已有十三、四年(至一九九五年)&#xff0c;真的有很多话想跟父母们敞开心扉的谈谈。 忙碌的现代社会&#xff0c;让我窥探到了许许多多的杰出角色&#xff0c;他们偷取家庭时间去换取自己的功成名就&#xff0c;他们的心随着公司的企划案四处流浪&#xff0c;孩…

关于openstack 专业博主地址.后续更新

首先官方文档要放的https://docs.openstack.org/ 关于导入镜像方面说的很详细的.https://www.cnblogs.com/liawne/p/9322221.html 每天5分钟系列,有docker openstack等,而且还出书了.https://www.cnblogs.com/CloudMan6/p/5384923.html 转载于:https://www.cnblogs.com/lovesKe…

Java第一章java语言的概述

一、java语言的概述&#xff1a; 1.1dos命令 常用的dos命令&#xff1a; dir&#xff1a;列出当前目录下的文件以及文件夹 md&#xff1a;创建目录 rd&#xff1a;删除目录 cd&#xff1a;进入指定目录 cd..&#xff1a;退回到上一级目录 cd\&#xff1a;退回到根目录 del&…

【Quartz】深入Job、JobDetail、JobDataMap、Trigger

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Quartz API核心接口有&#xff1a; Scheduler – 与scheduler交互的主要API&#xff1b;Job – 你通过scheduler执行任务&#xff0c;你…

Apache Accumulo 1.9.3 发布,高性能 K/V 存储方案

Apache Accumulo 1.9.3 发布了&#xff0c;Apache Accumulo 是一个可靠的、可伸缩的、高性能的排序分布式的 Key-Value 存储解决方案&#xff0c;基于单元访问控制以及可定制的服务器端处理。使用 Google BigTable 设计思路&#xff0c;基于 Apache Hadoop、Zookeeper 和 Thrif…

图形界面上机作业

1、 制作一个如图所示的界面&#xff08;使用FlowLayout布局&#xff09;&#xff0c;不要求实现功能。 2、设计一个用标签、文本行与按钮来登录的界面&#xff08;用GridLayout布局方式&#xff09;。如图所示。 转载于:https://www.cnblogs.com/quan-2723365710/p/10881691.h…

【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例

一、工程创建 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、新建一个工程&#xff0c;导入相应的包Spring3.2.9Quqrtz2.2.1commons-logging 集成起来比较简单,对线程无需任何理解&a…

第七次发博不知道用什么标题好

一、this关键字,想起之前总是搞不懂this.name是where.name,嗯&#xff01;第二个name就是形参name,所以这句话就是讲形参name的值传给成员变量name private void setName(String name ){ this.namename; } 二、构造方法&#xff1a;1.没有返回值 2.名称要与本类名称相同&#x…

Django框架之Filters(过滤器)、母版的使用

在Django的模板语言中&#xff0c;通过使用 过滤器 来改变变量的显示。 过滤器的语法&#xff1a; {{ value|filter_name:参数 }} 使用管道符"|"来应用过滤器。 注意事项&#xff1a; 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。过滤器可以…

不花钱就补足营养的8妙招

如今&#xff0c;人们越来越注重保健&#xff0c;为了补充营养&#xff0c;一些人不惜花重金买各种名贵保健品食用。其实&#xff0c;人体所需要的很多营养素就在我们身边&#xff0c;它们既不昂贵&#xff0c;也不稀缺&#xff0c;只需我们信手拈来。 叶酸 每人每日应补充…

PostgreSQL 自定义复合类型(composite type) deform引入的额外开销

标签 PostgreSQL , UDT , 自定义类型 背景 PG 允许用户自定义复合类型&#xff0c;自定义复合类型由多个类型组成&#xff0c;使用时会引入一些deform的开销。 例子 postgres# create unlogged table t(id int, c1 tp1, c2 int); CREATE TABLE postgres# insert into t sele…

第十二周作业

这个作业属于那个课程c语言这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3236我在这个课程的目标是学习掌握单向链表&#xff0c;掌握二级指针的概念&#xff0c;以及指针数组这个作业在哪个具体方面帮助我实现目标前面3道题…

职场上的「小人」教我的事

很多人的小指头都会带一个尾戒&#xff0c;不是白金就是黄金&#xff0c;大部份是简单的一环&#xff0c;没有太多装饰&#xff0c;也很少镶宝石&#xff0c;目的不在于当作饰品&#xff0c;而是保命之用。 也有人不习惯戴尾戒&#xff0c;而是把指甲留得长长的&#xff0c;长到…

【Quartz】插件的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点)&#xff0c;Quartz 变得很容易被扩…

自动化运维平台(前端vue)

前端的大体流程&#xff1a;首先是Login登录组件&#xff0c;当输入用户名和密码之后&#xff0c;发送post请求到后端&#xff0c;然后根据返回的数据的是否正常&#xff0c;如果正常&#xff0c;将返回的token以及用户名保存到sessionStorage中&#xff0c;并使用导航守卫进行…

老程序员的下场

长期从事编程活动的程序员都期望在50多岁时能爬到一个足够高的职位&#xff0c;或者能顺利的退休。 但我在这里讨论的可能是一个你还没有想过的问题&#xff1a;如果到那时你失业了呢&#xff1f; 50多岁时你的职业仕途会成为一个问题。如果你有很好的技术&#xff0c;有人雇…