好久没写博客了,贴一个很久以前为大姐的毕业论文而写一个小程序,还比较方便,比如说,我要得到上海市所有沃尔玛的经纬度坐标,并且将信息汇总到Excel中,操作如下:
1.将后文的代码保存到记事本(.txt),然后呢再把这个txt文档的后缀改为.htm
2.双击就可以啦(如果你的默认浏览器是IE,不是的话,选择打开方式为IE浏览器,我这个只支持IE浏览器),IE会请求允许之类的,总之都允许就好了
3. 更改保存路径,记得文件名的后缀一定是.xls/.xlsx。
4. 然后,单击开始查询
5.单击写入Excel,如下图
说明:
1.前两个功能大家一实便知,最后一个是坐标转换,天国所有的坐标都不允许使用真实坐标,要使用火星坐标,即GCJ-02,like 谷歌地图,而百度地图的坐标体系又自成一体,所以这个功能就是把百度坐标转成火星坐标。
2. 如果是想查询北京市的沃尔玛怎么办呢?天才的观众,你们一定猜得出来只要改改代码就好啦,相信你们一定知道改哪里。
3. 为方便广大群众,可以一次性查询很多关键词,Excel会自动添加新页
4. 如果你在全国范围内查询沃尔玛,会得到上海地区的沃尔玛数量不止74!!!!难倒我错了?程序没有错,当你单击上海市的沃尔玛,然后一个一个数的时候你会发现只有74个,不知道百度怎么回事!!呃,一数不知道,一数吓一跳,一you般来说,我的数目和你实际输出来的是一样的,可是这次居然我的数据还多了4个,特意核对了一下,妈蛋,有几个是重复的,比如田林路的那个沃尔玛,居然有几个不一样的地名,幸好我经常去那个沃尔玛,看来是不够严谨。很多 C多多(五角场沃尔玛店)、欧味多(祁连山沃尔玛店) 之类的地方,好吧,百度并没有按类别分类,也就是说查出来的可能不是超市,只是名字里面有沃尔玛,这就解释的通了,理论上是可以通过距离远近去掉一些,好吧,这个我也懒得处理了。换成沃尔玛超市之后会好一点,不纠结了,反正对于快递之类的是正确的,因为不会有 XX(顺丰快递店),对于沃尔玛之类的里面还包含了其它东西的就自己按照公司名检查一遍吧。
5. 算是第一次接触百度API,所以很多功能是实现了,但是方法很笨,比如自动翻页,因为我找不到对于的函数,见谅,说完了,
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
body, html {
width: 100%;
height: 100%;
margin: 0;
font-family: "微软雅黑";
}
#r-result {
float:up;
width: 100%;
height: 36px;
font-size: 14px;
line-height: 36px;
margin:auto;
}
#l-map {
float: left;
height: 95%;
width: 85%;
}
#r-result2 {
float: right;
width: 15%;
height: 100%;
font-size: 14px;
line-height: 20px;
background-color: #FFF;
text-align: center;
position: relative;
overflow: auto;
}
#text {
height: 20px;
vertical-align: middle;
line-height: 20px; /*line-height must be equal to height*/
font-size: 14px;
font-style: normal;
background-color: #CCC;
width: auto;
left: auto;
top: auto;
right: auto;
bottom: auto;
}
</style>
<title>东找找+西找找</title>
</head>
<body>
<div id="r-result" >保存路径
<input name="ex_path" type="text" id="ex_path" value="C:\Users\Chen\Desktop\out.xlsx" size="50">
<label for="ex_path"></label>
查询内容
<input type="text" id="kuaiDiName" size="10" value="沃尔玛"/>
<input type="button" value="开始查询" onClick="searchKey()"/>
<input type="submit" name="bt_sumbit" id="bt_sumbit" value="写入Excel" onClick="saveExcel()">
<input type="text" id="txt_numPerPages" value=50 size="3" maxlength="3"/>
每一页放多少个?
<input type="checkbox" name="checkbox1" id="cb_autoPaging" checked > 自动翻页不?
<input name="checkbox2" type="checkbox" id="cb_marker" > 要不要标记呀?
<input name="checkbox_cvt" type="checkbox" id="cb_cvt" checked > BD-09转GCJ-02?
</div>
<div id="l-map">
</div>
<div id="r-result2" >
</div>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=z1Oln4RBIe7oHRp9Yko17LA7"></script>
<script type="text/javascript">
// 百度地图API功能
var map = new BMap.Map("l-map");
//map.centerAndZoom(new BMap.Point(121.478945,31.236005), 11);//人民广场
map.centerAndZoom("上海市", 11);
map.enableScrollWheelZoom(true);
var kuaiDiName ; //查询内容
var outs ; //保存成txt的时候用的是它
var numPerPages = 10;//百度限制每一页最多只能有100个,无语,所以超过一百个时,咱们就得自动翻页了
//var cntPois;
var cntPages;//第几页
var indexOuts = 0;//网点序号,是以所有页的所有网点计数的
var outArray;// 最重要的数组,所有数据都在这里面
var captions =new Array("公司名","地址","经度","纬度","电话","link");
var XLObj = new ActiveXObject("Excel.Application");//创建Excel实例
var xlBook = XLObj.Workbooks.Add(); //创建工作簿,默认保存在我的文档目录
//var ExcelSheet = xlBook.Worksheets(1); //创建工作表
var sheetNum = 0;//手动记录 工作表序号
var SearchOptions = {
onSearchComplete:searchComplete,
renderOptions: {
map: map,
panel: "r-result2",
selectFirstResult: false
},
pageCapacity:numPerPages,
autoViewport: false
};
var autoPaging="off";
var local = new BMap.LocalSearch(map, SearchOptions);
//local.setPageCapacity(100);
local.disableFirstResultSelection();
//-----------------------------------
/*
var output = "从上地到西单驾车需要";
var searchDistanceComplete = function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS)
{
return ;
}
var plan = results.getPlan(0);
output += plan.getDuration(true) + "\n"; //获取时间
output += "总路程为:" ;
output += plan.getDistance(true) + "\n"; //获取距离
}
var distanceOptions={
renderOptions: {map: map},
onSearchComplete: searchDistanceComplete,
onPolylinesSet: function(){
setTimeout(function(){alert(output)},"1000");
}
}
var transit = new BMap.DrivingRoute(map, distanceOptions);
transit.search("上地", "西单");
*/
//--------------------------------
function searchComplete(results){
// 判断状态是否正确
if (local.getStatus() == BMAP_STATUS_SUCCESS){
//cntPois= results.getNumPois();
cntPages =results.getNumPages();
var curPages= results.getPageIndex();
//如果是第一页,那么先分配outs的空间
if(0==curPages)
{
//outs=[];
//outs = new Array(results.getNumPois());
outArray = [];
outArray = new Array(results.getNumPois());
}
if(curPages<cntPages-1)
{
//一页一页的存到我们的输出outs里面
getOut(results);
//不急,慢慢翻,翻到最后一页为止
if(true==document.getElementById('cb_autoPaging').checked)
{
setTimeout(local.gotoPage(curPages+1),2000);//2s翻一页
}
}
else//最后一页,可以收网了
{
getOut(results);
setTimeout("marAll(points,titles)",500);//为什么要延时加标记呢?因为如果先执行这一句,那么又会调用最后一页的mark函数,结果就会重叠了
//setTimeout("writeFile(outs)",1500);//嘎嘎,延时必须要加双引号,否则,直接执行了……
setTimeout("write2Excel(outArray,captions)",1500);//好了,现在直接写excel
}
}
}
//查询
function searchKey(){
indexOuts = 0;
kuaiDiName = document.getElementById("kuaiDiName").value;
numPerPages=parseInt(document.getElementById("txt_numPerPages").value);
local.setPageCapacity(numPerPages);
map.clearOverlays();
//DefaultFilePath</span>"C:\\Users\\Chen\\Documents"
//SheetsInNewWorkbook</span>1
// 真正开始检索
if(true==document.getElementById('cb_cvt').checked)
bcvt2GCJ = true;
else
bcvt2GCJ = false;
local.search(kuaiDiName);
}
//好吧,这两个数组的信息的确是冗余了,为了标记方便,忍了
var titles = new Array();
var points = new Array();
var fileOut;
var bcvt2GCJ = false;
function getOut(results){
fileOut = prefix+kuaiDiName+".txt";
for(var i=0;i<results.getCurrentNumPois();i++){
/*
outs[indexOuts]=
results.Vo[i].title+'\t'+
results.Vo[i].address+'\t' +
results.Vo[i].point.lat+'\t'+
results.Vo[i].point.lng+'\t'+
results.Vo[i].phoneNumber+'\t' +
results.Vo[i].url;<span style="white-space:pre">
*/
points[indexOuts]=results.getPoi(i).point;
titles[indexOuts]=results.getPoi(i).title;
outArray[indexOuts] = new Array();
outArray[indexOuts][0]=results.getPoi(i).title;
outArray[indexOuts][1]=results.getPoi(i).address;
outArray[indexOuts][2]=results.getPoi(i).point.lng;
outArray[indexOuts][3]=results.getPoi(i).point.lat;
outArray[indexOuts][4]=results.getPoi(i).phoneNumber;
outArray[indexOuts][5]=results.getPoi(i).url;
if (bcvt2GCJ)
{
var loc = bd2gcj(results.getPoi(i).point.lat,results.getPoi(i).point.lng);
outArray[indexOuts][2] = loc[1];
outArray[indexOuts][3] = loc[0];
}
// 直接操作数组固然好,可是百度会改名字的,之前还是用Vo,5.0版本就改成了np
/*
points[indexOuts]=results.np[i].point;
titles[indexOuts]=results.np[i].title;
outArray[indexOuts] = new Array();
outArray[indexOuts][0]=results.np[i].title;
outArray[indexOuts][1]=results.np[i].address;
outArray[indexOuts][2]=results.np[i].point.lng;
outArray[indexOuts][3]=results.np[i].point.lat;
outArray[indexOuts][4]=results.np[i].phoneNumber;
outArray[indexOuts][5]=results.np[i].url;
*/
indexOuts++;
}
}
//这个函数已经被我抛弃了
var prefix ='C:/Users/Chen/Desktop/';
function writeFile(outs){
var fso, f, s;
fso = new ActiveXObject("Scripting.FileSystemObject");
try{
f = fso.OpenTextFile(fileOut, 2, true, -1);
}
catch(e){
alert('说好的路径呢?'+'你仔细瞧瞧有木有'+'又坑我'+'\n'+fileOut);
}
for (var i = 0; i < outs.length; i++)
{
f.WriteLine(outs[i]);
}
f.Close();
copy2Excel(outs);
alert('大功告成!'+'总共'+outs.length+'个');
}
function addMarker(point,label){
var marker = new BMap.Marker(point);
map.addOverlay(marker);
marker.setLabel(label);
}
function marAll(points,labels)
{
map.clearOverlays();
for (var i = 0; i < points.length; i++)
{
if(true==document.getElementById('cb_marker').checked)
{
addMarker(points[i],new BMap.Label(labels[i],{offset:new BMap.Size(10,-10)}));
}
else{
addMarker(points[i]);
}
}
}
function write2Excel(outArray,captions) //写入excel,一个一个写,很慢的,先这样吧
{
if(0!=sheetNum)//新建工作簿的时候,会自动创建第一个工作表,所以第一次就不需要另外创建工作表了
{
xlBook.Worksheets.add();//再来一张工作表
}
sheetNum++;//
var ExcelSheet = xlBook.ActiveSheet;//获取刚刚新建的工作表
ExcelSheet.name = sheetNum+' '+ kuaiDiName;//工作表名
var rows = outArray.length;
var cols = outArray[0].length;
//先把表头加上
for(var i=0;i<cols;i++)
{
ExcelSheet.Cells(1,i+1).value = captions[i];
ExcelSheet.Cells(1,i+1).HorizontalAlignment = 3;//水平居中
}
//一个一个单元赋值,太慢了……
for (var i = 0; i < rows; i++)
{
//取得每行的列数
for (var j = 0; j < cols; j++)
{
ExcelSheet.Cells(i + 2, j + 1).value = outArray[i][j];
//赋值
}
}
//xlBook.Application.Quit();
Alert('现已查明,'+kuaiDiName+'共有'+outArray.length+'个窝点');
XLObj.Visible = true; // 这一行最好别加,加上去容易造成浏览器崩溃
}
function saveExcel()
{
var filePath = document.getElementById("ex_path").value;
var fso;
fso=new ActiveXObject("Scripting.FileSystemObject");
/*
if(fso.FileExists(filePath))
{
event.returnValue = confirm("已经有人把位置占了,哥哥权力不够,咱们换一个位置好吗?");
if(event.returnValue)
{
//fso.DeleteFile(filePath); //木有权限……
}
else{
return;
}
}
if(fso.FolderExists(filePath))
{ //判断目录是否存在
xlBook.SaveAs(filePath);
}
else
{
alert("说好的目录呢,怎么不存在呀");
}
*/
try{
if(xlBook.SaveAs(filePath))
alert("统统都到Excel了,妥妥的...");
}
catch(e){
alert('说好的路径呢?'+'你仔细瞧瞧有木有'+'又坑我'+'\n'+filePath);
}
}
window.οnbefοreunlοad=function (){
//xlBook.SaveAs(filePath+'\\outs.xlsx');
xlBook.Application.Quit();
Alert("过河拆桥...");
}
function Alert(str) {
var msgw,msgh,bordercolor;
msgw=350;//提示窗口的宽度
msgh=80;//提示窗口的高度
titleheight=25 //提示窗口标题高度
bordercolor="#336699";//提示窗口的边框颜色
titlecolor="#99CCFF";//提示窗口的标题颜色
var sWidth,sHeight;
//获取当前窗口尺寸
sWidth = document.body.offsetWidth;
sHeight = document.body.offsetHeight;
// //背景div
var bgObj=document.createElement("div");
bgObj.setAttribute('id','alertbgDiv');
bgObj.style.position="absolute";
bgObj.style.top="0";
bgObj.style.background="#E8E8E8";
bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75";
bgObj.style.opacity="0.6";
bgObj.style.left="0";
bgObj.style.width = sWidth + "px";
bgObj.style.height = sHeight + "px";
bgObj.style.zIndex = "10000";
document.body.appendChild(bgObj);
//创建提示窗口的div
var msgObj = document.createElement("div")
msgObj.setAttribute("id","alertmsgDiv");
msgObj.setAttribute("align","center");
msgObj.style.background="white";
msgObj.style.border="1px solid " + bordercolor;
msgObj.style.position = "absolute";
msgObj.style.left = "50%";
msgObj.style.font="12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";
//窗口距离左侧和顶端的距离
msgObj.style.marginLeft = "-225px";
//窗口被卷去的高+(屏幕可用工作区高/2)-150
msgObj.style.top = document.body.scrollTop+(window.screen.availHeight/2)-150 +"px";
msgObj.style.width = msgw + "px";
msgObj.style.height = msgh + "px";
msgObj.style.textAlign = "center";
msgObj.style.lineHeight ="25px";
msgObj.style.zIndex = "10001";
document.body.appendChild(msgObj);
//提示信息标题
var title=document.createElement("h4");
title.setAttribute("id","alertmsgTitle");
title.setAttribute("align","left");
title.style.margin="0";
title.style.padding="3px";
title.style.background = bordercolor;
title.style.filter="progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);";
title.style.opacity="0.75";
title.style.border="1px solid " + bordercolor;
title.style.height="18px";
title.style.font="12px Verdana, Geneva, Arial, Helvetica, sans-serif";
title.style.color="white";
title.innerHTML="禀报...";
document.getElementById("alertmsgDiv").appendChild(title);
//提示信息
var txt = document.createElement("p");
txt.setAttribute("id","msgTxt");
txt.style.margin="16px 0";
txt.innerHTML = str;
document.getElementById("alertmsgDiv").appendChild(txt);
//设置关闭时间
window.setTimeout("closewin()",2500);
}
function closewin() {
document.body.removeChild(document.getElementById("alertbgDiv"));
document.getElementById("alertmsgDiv").removeChild(document.getElementById("alertmsgTitle"));
document.body.removeChild(document.getElementById("alertmsgDiv"));
}
var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
var PI = 3.14159265358979324;
function bd2gcj(bdLat, bdLon)
{
var x = bdLon - 0.0065, y = bdLat - 0.006;
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
var gcjLon = z * Math.cos(theta);
var gcjLat = z * Math.sin(theta);
var locs = new Array();
locs[1] = z * Math.cos(theta);//gcjLon
locs[0] = z * Math.sin(theta);//gcjLat
return locs;
}
</script>
</body>
</html>