地球上的点【经纬度】到几个点形成的折现或者直线最短的距离和折现上点的坐标【经纬度】
情景
本人在工作的原因需要计算批量地球坐标上一个点【经纬度】到另外由好几个点【经纬度形成的折现或者直线】之间的最短距离和在折现上的点的坐标【经纬度】
如图:
以下为已经存在的点坐标点:
以下图为多个折线组成的点的坐标
上面的折现可能是2,3,4,5个点组成的
要计算的每个点到折现的最短距离和最短距离时候折线上点的坐标
最终生成的效果如下:
步骤
做法:利用高德JSAPI提供的函数计算
高德地图JPAPI地址:https://lbs.amap.com/demo/jsapi-v2/example/calcutation/calcute-distance-from-marker-to-line
过程
1,看示例代码可以知道核心逻辑调用如下图:
主要用了AMap.GeometryUtil.closesOnLine(pos.path);计算最近的点
用AMap.GeometryUtil.distanceToLine(pos,path);计算距离最近的点的最短距离
2,在示例代码中加上自己的逻辑封装一个自己的逻辑代码,用js实现将本地的两个excel文件上传然后批量调用得到closestPositionOnLine 和 distance
function execute() {
out = "";
json_poslist = JSON.parse(poslist);
json_pathlist = JSON.parse(pathlist);
for (var i = 0; i < json_poslist.length; i++) {
address = json_poslist[i]["地点"]
pos = [parseFloat(json_poslist[i]["坐标"].replace("[","").replace("]","").split(",")[0]),parseFloat(json_poslist[i]["坐标"].replace("[","").replace("]","").split(",")[1])]
for (var j = 0; j < json_pathlist.length; j++) {
line = json_pathlist[j]["折线"]
path = to_array(json_pathlist[j]["折线坐标集合"])
ret = compute2(pos,path)
console.log(address,line,pos,path,ret)
out = out + address + '##' + line + '##' + JSON.stringify(pos) + '##' + JSON.stringify(path) + '##' + ret + "$$"
}
}
var blob = new Blob([JSON.stringify(out)], { type: "text/plain;charset=utf-8" });
saveAs(blob, "export.txt");
}
3,用xlsx.core.min.js界面上传两个文件到js中处理,绑定调用2中的execute方。xlsx.core.min.js用读入上传的xlsx文件。
4,用FileSaver.js 将数据输出到本地txt文件中。FileSaver.js 用来生成本地的txt文件。
代码:链接:https://pan.baidu.com/s/1A8Fm9U7i3eLxfleQtJR23A
提取码:t221
产物截图
代码截图
界面截图
点击执行会生成export.txt文件
利用写好的t.py 能 生成csv文件
思考
1,这种一般网上有人整理公式,但是我看了下公式表复杂,而且坐标跨度比较大的时候不准确;
2,可以找到已经实现的API接口调用计算,但是我找了很久没找到。有类似实现思路的可以交流下。