首页 > 技术文章 > 高德地图根据名称批量在线获取坐标

itzuoyou 2019-05-23 16:35 原文

功能主要是通过导入excel生成坐标,在把生成好的坐标导出excel
写这个功能之前应为公司要做离线地图,要把所有的企业标记在地图上,库里有好几万家企业,没有坐标,最笨的方法就是一个一个查,在一个一个更新,那完蛋了。所以就写了这个方法,先批量生成坐标,然后生成excel,再写一个存储过程更新数据库。(离线地图的开发等有时间写一下吧)

比较重要的几个js文件

html部分:











名称 x y


下面是代码:

        // 在线读入excel
      function readWorkbookFromLocalFile(file, callback) {
			var reader = new FileReader();
			reader.onload = function(e) {
				var data = e.target.result;
				var workbook = XLSX.read(data, {
					type: 'binary'
				});
				if(callback) callback(workbook);
			};
			reader.readAsBinaryString(file);
		}


                 $(function() {
			document.getElementById('file').addEventListener('change', function(e) {
				var files = e.target.files;
				if(files.length == 0) return;
				var f = files[0];
				if(!/\.xlsx$/g.test(f.name)) {
					alert('仅支持读取xlsx格式!');
					return;
				}
				readWorkbookFromLocalFile(f, function(workbook) {
					readWorkbook(workbook);
				});
			});
			//loadRemoteFile('./sample/test.xlsx');
		});

                   function readWorkbook(workbook) {
			var sheetNames = workbook.SheetNames; // 工作表名称集合
			var worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet
			var csv = XLSX.utils.sheet_to_csv(worksheet);
			csv2table(csv);
		}

		// 将csv转换成表格
		function csv2table(csv) {
			var rows = csv.split('\n');
			rows.pop(); // 最后一行没用的
			rows.forEach(function(row, idx) {
				var columns = row.split(',');

				columns.forEach(function(column) {
                                            
                                            // 每读到一个企业名称就查询一次,在回调函数中把值附在页面
					mapObj.plugin(["AMap.PlaceSearch"], function() {

						var msearch = new AMap.PlaceSearch(); //构造地点查询类
						AMap.event.addListener(msearch, "complete", placeSearch_CallBack1); //查询成功时的回调函数
						msearch.setCity("江苏");  // 根据自己需要选择城市
						msearch.search(column); //关键字查询查询
					});

				});

			});
		}
                    
                    // 回调函数 可自行打印data的值,里面有地址,名称,企业类型等一些数据
                    function placeSearch_CallBack1(data) {
			var poiArr = data.poiList.pois;
			//poiArr[0].location.getLng();  //X
			//poiArr[0].location.getLat();  //Y
			$("#tbody").append('<tr><td>' + poiArr[0].name + '</td><td>' + poiArr[0].location.getLng() + '</td><td>' + poiArr[0].location.getLat() + '</td></tr>');
		}


                    // ------------------------------导出---------------------------------------
                    function exportExcel() {
                            // 直接使用js中的方法,非常方便
			var sheet = XLSX.utils.table_to_sheet($('table')[0]);
			openDownloadDialog(sheet2blob(sheet), '导出.xlsx');
		}

                    // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
		function sheet2blob(sheet, sheetName) {
			sheetName = sheetName || 'sheet1';
			var workbook = {
				SheetNames: [sheetName],
				Sheets: {}
			};
			workbook.Sheets[sheetName] = sheet;
			// 生成excel的配置项
			var wopts = {
				bookType: 'xlsx', // 要生成的文件类型
				bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
				type: 'binary'
			};
			var wbout = XLSX.write(workbook, wopts);
			var blob = new Blob([s2ab(wbout)], {
				type: "application/octet-stream"
			});
			// 字符串转ArrayBuffer
			function s2ab(s) {
				var buf = new ArrayBuffer(s.length);
				var view = new Uint8Array(buf);
				for(var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
				return buf;
			}
			return blob;
		}

                     /**
		 * 通用的打开下载对话框方法,没有测试过具体兼容性
		 * @param url 下载地址,也可以是一个blob对象,必选
		 * @param saveName 保存文件名,可选
		 */
		function openDownloadDialog(url, saveName) {
			if(typeof url == 'object' && url instanceof Blob) {
				url = URL.createObjectURL(url); // 创建blob地址
			}
			var aLink = document.createElement('a');
			aLink.href = url;
			aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
			var event;
			if(window.MouseEvent) event = new MouseEvent('click');
			else {
				event = document.createEvent('MouseEvents');
				event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
			}
			aLink.dispatchEvent(event);
		}

推荐阅读