高德地图 JS API—几何计算距离、长度、面积

高德地图 JS API—几何计算距离、长度、面积

JS API 为开发者提供了空间数据计算的函数库 AMap.GeometryUtil,可以帮助开发者计算点线面空间关系、长度、面积等函数。更多示例请查看 示例中心

本章我们将介绍一些常用的数学计算方法,包括:

  1. 计算两点间的实际距离 AMap.GeometryUtil.distance
  2. 计算点到线段的最短距离 AMap.GeometryUtil.distanceToSegment
  3. 计算点到路径的最短距离 AMap.GeometryUtil.distanceToLine
  4. 计算路径的实际长度 AMap.GeometryUtil.distanceOfLine
  5. 计算封闭区域的面积 AMap.GeometryUtil.ringArea

计算两点间的实际距离

当需要计算两个地理位置间的实际地面距离时,可以使用静态方法 AMap.GeometryUtil.distance,返回数据以米为单位。JavaScript

var p1 = [116.434027, 39.941037];
var p2 = [116.461665, 39.941564];
// 返回 p1 到 p2 间的地面距离,单位:米
var dis = AMap.GeometryUtil.distance(p1, p2);

计算点到线段的最短距离

当需要计算某一点到线段的最短地面距离时,可以使用静态方法 AMap.GeometryUtil.distanceToSegment,返回数据以米为单位。JavaScript

var p0 = [116.450378, 39.947585];
var p1 = [116.434027, 39.941037];
var p2 = [116.461665, 39.941564];
// 返回 p0 到线段 p1-p2 的最短地面距离,单位:米
var dis = AMap.GeometryUtil.distanceToSegment(p0, p1, p2);

计算点到路径的最短距离

当需要计算某一点到一段路径的最短地面距离时,可以使用静态方法 AMap.GeometryUtil.distanceToLine,返回数据以米为单位。该方法与上条的区别在于该方法支持多点组成的线段。JavaScript

var p0 = [116.450378, 39.947585];
var p1 = [116.434027, 39.941037];
var p2 = [116.461665, 39.941564];
var p3 = [116.466171, 39.937977];
// 返回 p0 到线段 p1-p2-p3 的最短地面距离,单位:米
var dis = AMap.GeometryUtil.distanceToSegment(p0, [p1, p2, p3]);

计算路径的实际长度

当需要计算某段路径的实际长度时,可以使用静态方法 AMap.GeometryUtil.distanceOfLine,返回数据以米为单位。JavaScript

var p0 = [116.450378, 39.947585];
var p1 = [116.434027, 39.941037];
var p2 = [116.461665, 39.941564];
// 返回线段 p0-p1-p2 的实际长度,单位:米
var dis = AMap.GeometryUtil.distanceOfLine([p0, p1, p2]);

计算封闭区域的面积

当需要计算指定路径围成的闭合区域面积时,可以使用静态方法 AMap.GeometryUtil.ringArea,返回数据以平方米为单位。JavaScript

var p0 = [116.450378, 39.947585];
var p1 = [116.434027, 39.941037];
var p2 = [116.461665, 39.941564];
// 返回点 p0-p1-p2 围成的闭合区域面积,单位:平方米
var area = AMap.GeometryUtil.ringArea([p0, p1, p2]);

数学计算库最后更新时间: 2021年01月22日

AMap.GeometryUtil

GeometryUtil为一组空间数据计算的函数库,v1.4.2新增。支持点线面的空间关系计算、长度、面积计算等等,包含的函数如下:

函数名返回值说明
distance(p1:LngLat, p2:LngLat) Number计算两个经纬度点之间的实际距离。单位:米
ringArea(ring:[LngLat])Number计算一个经纬度路径围成区域的实际面积。单位:平米
isClockwise(ring:[LngLat])Boolean判断一个经纬度路径是否为顺时针
distanceOfLine(ring:[LngLat])Number计算一个经纬度路径的实际长度。单位:米
ringRingClip(ring:[LngLat],ring:[LngLat])Number计算两个经纬度面的交叉区域。只适用于凸多边形,单位:平米
doesRingRingIntersect(ring:[LngLat],ring:[LngLat])Boolean判断两个经纬度面是否交叉
doesLineRingIntersect(line:[LngLat],ring:[LngLat])Boolean判断经纬度路径和经纬度面是否交叉
doesLineLineIntersect(line:[LngLat],line:[LngLat])Boolean判断两个经纬度路径是否相交
doesSegmentPolygonIntersect(p1:LngLat, p2:LngLat, rings:[ring[LngLat]])Boolean判断线段和多个环是否相交
doesSegmentRingIntersect(p1:LngLat, p2:LngLat, ring:[LngLat])Boolean判断线段和一个环是否相交
doesSegmentLineIntersect(p1:LngLat, p2:LngLat, line:[LngLat])Boolean判断线段和一个路径是否相交
doesSegmentsIntersect(p1:LngLat, p2:LngLat,p3:LngLat, p4:LngLat)Boolean判断两个线段是否相交
isPointInRing(p:LngLat,ring:[LngLat])Boolean判断点是否在环内
isRingInRing(ring:[LngLat],ring:[LngLat])Boolean判断环是否在另一个环内
isPointInPolygon(p:LngLat, rings:[ring[LngLat]])Boolean判断点是否在多个环组成区域内
makesureClockwise(ring:[LngLat])Boolean将一个路径变为顺时针
makesureAntiClockwise(ring:[LngLat])Boolean将一个路径变为逆时针
closestOnSegment(p1:LngLat, p2:LngLat,p3:LngLat)LngLat计算P2P3上距离P1最近的点
closestOnLine(p:LngLat, line:[LngLat])LngLat计算line上距离P最近的点
distanceToSegment(p1:LngLat, p2:LngLat,p3:LngLat)Number计算P2P3到P1的距离。单位:米
distanceToLine(p:LngLat, line:[LngLat])Number计算P到line的距离。单位:米
isPointOnSegment(p1:LngLat, p2:LngLat,p3:LngLat,tolerance:Number)Boolean判断P1是否在P2P3上,tolerance为误差范围
isPointOnLine(p:LngLat, line:[LngLat],tolerance:Number)Boolean判断P是否在line上,tolerance为误差范围
isPointOnRing(p:LngLat, ring:[LngLat],tolerance:Number)Boolean判断P是否在ring的边上,tolerance为误差范围
isPointOnPolygon(p:LngLat, rings:[ring[LngLat]],tolerance:Number)Boolean判断P是否在多个ring的边上,tolerance为误差范围

这些方法使用时,可以使用经纬度对,也可以使用LngLat对象,参考如下:JavaScript

    var point = [116.566298, 40.014179];
    var ring = [
        [116.169465,39.932670],
        [116.160260,39.924492], 
        [116.186138,39.879817], 
        [116.150625,39.710019],
        [116.183198,39.709920], 
        [116.226950,39.777616], 
        [116.421078,39.810771],
        [116.442621,39.799892],
        [116.463478,39.790066], 
        [116.588276,39.809551],
        [116.536091,39.808859],
        [116.573856,39.839643], 
        [116.706380,39.916740],
        [116.657285,39.934545],
        [116.600293,39.937770],
        [116.540039,39.937968],
        [116.514805,39.982375],
        [116.499935,40.013710],
        [116.546520,40.030443], 
        [116.687668,40.129961], 
        [116.539697,40.080659],
        [116.503390,40.058474],
        [116.468800,40.052578]
    ];
    var isPointInRing = AMap.GeometryUtil.isPointInRing(point,ring);

JavaScript

    var point = new AMap.LngLat(116.566298, 40.014179)
    var ring = [
        new AMap.LngLat(116.169465,39.932670),
        new AMap.LngLat(116.160260,39.924492), 
        new AMap.LngLat(116.186138,39.879817), 
        new AMap.LngLat(116.150625,39.710019),
        new AMap.LngLat(116.183198,39.709920), 
        new AMap.LngLat(116.226950,39.777616), 
        new AMap.LngLat(116.421078,39.810771),
        new AMap.LngLat(116.442621,39.799892),
        new AMap.LngLat(116.463478,39.790066), 
        new AMap.LngLat(116.588276,39.809551),
        new AMap.LngLat(116.536091,39.808859),
        new AMap.LngLat(116.573856,39.839643), 
        new AMap.LngLat(116.706380,39.916740),
        new AMap.LngLat(116.657285,39.934545),
        new AMap.LngLat(116.600293,39.937770),
        new AMap.LngLat(116.540039,39.937968),
        new AMap.LngLat(116.514805,39.982375),
        new AMap.LngLat(116.499935,40.013710),
        new AMap.LngLat(116.546520,40.030443), 
        new AMap.LngLat(116.687668,40.129961), 
        new AMap.LngLat(116.539697,40.080659),
        new AMap.LngLat(116.503390,40.058474),
        new AMap.LngLat(116.468800,40.052578)
    ];
    var isPointInRing = AMap.GeometryUtil.isPointInRing(point,ring);
0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x