JS API 为开发者提供了空间数据计算的函数库 AMap.GeometryUtil
,可以帮助开发者计算点线面空间关系、长度、面积等函数。更多示例请查看 示例中心
本章我们将介绍一些常用的数学计算方法,包括:
- 计算两点间的实际距离 AMap.GeometryUtil.distance
- 计算点到线段的最短距离 AMap.GeometryUtil.distanceToSegment
- 计算点到路径的最短距离 AMap.GeometryUtil.distanceToLine
- 计算路径的实际长度 AMap.GeometryUtil.distanceOfLine
- 计算封闭区域的面积 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);
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);