百度API参考:http://developer.baidu.com/map/reference/index.php?title=Class:%E6%80%BB%E7%B1%BB/%E6%A0%B8%E5%BF%83%E7%B1%BB
1、申请百度API基于浏览器的AK,现在是2.0版本
2、编写脚本代码获取公交点位信息,关键类是BMap.BusLineSearch,以及其回调函数onGetBusListComplete和onGetBusLineComplete,onGetBusListComplete为获取搜索结果时调用,参数为BusListResult类型,onGetBusLineComplete获取具体公交线路时调用(getBusLine),参数为BusLine类型
var busline = new BMap.BusLineSearch(map,{
renderOptions:{map:map,panel:"results"},
onGetBusListComplete: function(result){
if(result) {
var fstLine = result.getBusListItem(0);//获取第一个公交列表显示到map上
busline.getBusLine(fstLine);
}
},
onGetBusLineComplete: function(busline){
if(busline)
{
var array = busline.getPath();
var points = new Array();
//console.log(array.length);
for(var i=0;i<array.length;i++)
{
var p = array[i];
points.push(p.lng+'-'+p.lat);
}
console.log(points.join(','));
}
}
});
function busSearch(){
var busName = document.getElementById("busId").value;
busline.getBusList(busName);
}
BusLine类型的对象可以获取公交线路节点数组和站点信息,效果如下:
3、将结果保存为txt文件,根据格式内容编写Java代码,导入GeoDatabase数据库,我采用的ArcSDE SDK Java来做的,比较简单,当然也可以用ArcObjects
public void insertPoints(String name,String[] fields,String shapeField,List<Map<String,Object>> datas,Map<String,Integer> types)
{
SeConnection conn = getConn();
if (conn != null) {
try {
SeInsert insert = new SeInsert(conn);
insert.intoTable(name, fields);
insert.setWriteMode(true);
SeLayer layer = new SeLayer(conn, name, shapeField);
SeCoordinateReference cr = layer.getCoordRef();
for(Map<String,Object> data:datas)
{
SeRow row = insert.getRowToSet();
SeShape shape = new SeShape(cr);
String wkt = "POINT("+data.get("x").toString()+" " + data.get("y").toString()+")";
//System.out.println(wkt);
shape.generateFromText(wkt);
System.out.println(fields.length);
for(int i=0;i<fields.length;i++)
{
System.out.println(fields[i]);
System.out.println(types.get(fields[i]));
if(fields[i].equals(shapeField))
row.setShape(i, shape);
else
{
switch(types.get(fields[i]))
{
case 1:row.setNString(i, data.get(fields[i]).toString());break;
case 2:row.setShort(i, Short.valueOf(data.get(fields[i]).toString()));break;
default:System.out.println(fields[i]);
}
}
}
System.out.println("zhixing1");
insert.execute();
}
insert.flushBufferedWrites();
insert.close();
}
catch (SeException e) {
e.printStackTrace();
}finally {
try { conn.close(); } catch (SeException e) { e.printStackTrace(); }
}
}
}
4、这次都是以点的形式导入的,当然也可以直接生成线导入,下面是用ArcMap简单符号化后的效果
5、百度地图效果图
6、距离测算对比,通过百度的测距工具线路距离为15.5公里,可恶的百度没提供测距函数,只有测距控件,深入的数据处理只能采用粗劣的方法,测距就先要把大地坐标转为投影坐标,转为西安80高斯投影就别想了,解密算法和公共控制点都没有,直接上粗糙点的WGS_1984_UTM_50N投影,北京在北半球50度带(117度左右,带号的算法网上有),投影后在ArcGIS中测距为15.9公里,对于普通分析和应用精度已经够了
7、通过数据处理终于发现误差的一个重要原因,获取的坐标点里面很多重复点,通过去掉重复点生成线计算长度为15526米(约15.5公里),逼近百度计算结果
注意:百度的坐标是经过二次加密的,一次是国标加密,二次是自己加密的,因此获取的数据最好只结合百度的数据进行使用
感谢:感谢其他网友贡献的百度API的JS代码,学习了很多,只做了点修改
附件:
<!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" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ndFDDvBRWAVFgnsTIGjTZ0jj"></script>
<title>Hello, World</title>
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;} @media (max-device-width: 780px){#golist{display: block!important;}}#golist {display: none;}
</style>
</head>
<body>
<p><img src="http://map.baidu.com/img/logo-map.gif" /><span style="display:inline-block;width:200px;"> </span><input type="text" value="331" id="busId" />路公交 <input type="button" value="查询" onclick="busSearch();" /></p>
<div style="clear:both"> </div>
<div style="float:left;width:600px;height:500px;border:1px solid gray" id="container"></div>
<div id="results" style="float:left;width:300px;height:500px;font-size:13px;"></div>
</body>
</html>
<script type="text/javascript">
var map = new BMap.Map("container");
map.centerAndZoom(new BMap.Point(117.191006, 39.122219), 12);
map.enableScrollWheelZoom();
var array = new Array();
map.addEventListener("click", function(e){
array.push(e.point.lng + " " + e.point.lat);
console.log(array.join(','));
});
var busline = new BMap.BusLineSearch(map,{
renderOptions:{map:map,panel:"results"},
onGetBusListComplete: function(result){
if(result) {
var fstLine = result.getBusListItem(0);//获取第一个公交列表显示到map上
busline.getBusLine(fstLine);
console.log(fstLine.name);
}
},
onGetBusLineComplete: function(busline){
if(busline)
{
var array = busline.getPath();
var stationNumber = busline.getNumBusStations();
var points = new Array();
console.log(array.length);
for(var i=0;i<array.length;i++)
{
var p = array[i];
points.push('line-'+i+'-'+p.lng+'-'+p.lat);
}
for(var j=0;j<stationNumber;j++)
{
var station = busline.getBusStation(j);
var p = station.position;
points.push('station-'+station.name+'-'+p.lng+'-'+p.lat);
}
console.log(points.join(','));
}
}
});
function busSearch(){
var busName = document.getElementById("busId").value;
busline.getBusList(busName);
}
</script>