---
title: 几何算法
source: https://vjmap.com/guide/geo.html
---

# 几何算法

## 点
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|GeoPoint|add|p: GeoPoint|两个点相加 示例: let p1 = new vjmap.GeoPoint(1,2); let p2 = new vjmap.GeoPoint(3, 4); p1.add(p2); // 4, 6|
|GeoPoint|sub|p: GeoPoint|两个点相减|
|GeoPoint|multByPoint|p: GeoPoint|两个点相乘|
|GeoPoint|divByPoint|p: GeoPoint|两个点相除|
|GeoPoint|dot|p: GeoPoint|向量点积|
|GeoPoint|lerp|v: GeoPoint, alpha: number|两点之间根据比例插值出新的点|
|GeoPoint|rotate|angle: number|旋转|
|GeoPoint|roateAround|angle: number, p: GeoPoint|绕一个点旋转.|
|GeoPoint|matMult|m: number[]|乘一个矩阵|
|GeoPoint|unit| |单位长度|
|GeoPoint|equals|other: GeoPoint, dotErr: number = 8|判断是否相等|
|GeoPoint|distanceTo|p: GeoPoint|两点之间距离|
|GeoPoint|angle| |角度|
|GeoPoint|angleTo|p: GeoPoint|距一个点的角度|
|GeoPoint|angleWith|p: GeoPoint|距一个点的interiorAngle|
|GeoPoint|angleWithSep|p: GeoPoint|距一个点的interiorAngle|
|GeoPoint|transform|basePt: GeoPoint, destPt: GeoPoint, scale?:number, angle?: number|对一个点围绕一个基点进行缩放旋转平移操作.|

## 矩形范围外包盒
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|GeoBounds|center| |获取中心点 示例: let bounds = new vjmap.GeoBounds([0,10], [10, 50]); let c = bounds.center(); // [5, 30]|
|GeoBounds|square|isLatlng?: boolean, isMinValue?: boolean|变成正方形，使宽高相等||
|GeoBounds|width| |获取宽度||
|GeoBounds|height| |获取高度||
|GeoBounds|scale|ratio: number, origin?: GeoPoint &#124; null|按照比例扩大/缩小出一个新的 GeoBounds。||
|GeoBounds|scaleXY|ratioX: number, ratioY: number, origin?: GeoPoint &#124; null|按照XY比例扩大/缩小出一个新的 GeoBounds。||
|GeoBounds|translate|dx: number, dy: number|位移包围盒||
|GeoBounds|update|vertices: GeoPoint[]|更新包围盒||
|GeoBounds|updateByBounds|bounds: GeoBounds[] &#124; GeoBounds|根据子包围盒更新包围盒||
|GeoBounds|intersect|b: GeoBounds|两包围盒求交集||
|GeoBounds|union|bound: GeoBounds|求多个包围盒的并集||
|GeoBounds|isIntersect|bound: GeoBounds|判断与另一个包围盒是否相交||
|GeoBounds|isContains|bound: GeoBounds|求一个包围盒是否包含另一个包围盒||
|GeoBounds|contains|point: GeoPoint|查看点是否在包围盒中||
|GeoBounds|closestPoint|testPoint: GeoPoint, includeInterior: boolean = true|查找边界框上最近的点并返回该点.||

## 线
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|pointToSegmentDistance|p: GeoPoint, p1: GeoPoint, p2: GeoPoint|点到线段的距离 示例: vjmap.pointToSegmentDistance(vjmap.geoPoint([3, 2]), vjmap.geoPoint([0,0]), vjmap.geoPoint([0, 10])) // 3 |
|vjmap|simplify|points: GeoPoint[], tolerance?: number|简化点坐标||
|vjmap|closestPointOnSegment|p: GeoPoint, p1: GeoPoint, p2: GeoPoint|点到线段的最近点||
|vjmap|closestPointOnPolyline|p: GeoPoint, points: GeoPoint[]|点到多段线的最近点||
|vjmap|closestPointOnPolylines|p: GeoPoint, lines: GeoPoint[][]|点到多条线的最近点|
|vjmap|segmentIntersect|x1,y1,x2,y2,x3,y3,x4,y4|线段相交||
|vjmap|lineSplit|line: GeoPoint[], splitLine: GeoPoint[], dotErr?: number|线被另外一条线分开多条线段，返回新的线段||
|vjmap|multiLineSplit|lines: GeoPoint[][], dotErr?: number|多条线之间根据交点相互分开,返回相交后的所有线段，请确保每条线段不要自相交||
|vjmap|clipSegment|a: GeoPoint, b: GeoPoint, bounds: GeoBounds|根据范围裁剪线段||
|vjmap|interpolatePointsByRatio|points: GeoPointLike[], ratio: number, isLngLat: boolean = false|通过比例(0-1)的值，得到坐标序列的点坐标的值||
|vjmap|interpolateLineRange|points, number, isLngLat, offsetDist, minGap, includeSrcPoint|要插值的（多段）线的顶点(输入必须为经纬度).||
|vjmap.Math2D|dist|ax,ay, bx, by|计算两点距离| vjmap.Math2D.dist(10,10,10,30); // 20|
|vjmap.Math2D|lineDist|pts: GeoPointLike[]|求线的距离| |
|vjmap.Math2D|distToSegmentSquared|px, py, l0x, l0y, l1x, l1y|计算点和二维线段之间的平方距离。| |
|vjmap.Math2D|intersectLineAndCircle|xLine1, yLine1, xLine2, yLine2, radius, xCenter, yCenter|求线和圆的交点| |
|vjmap.Math2D|lineDist|pts: GeoPointLike[]|求线的距离| |

## 多边形
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|calcPolygonArea|points: GeoPoint[]|计算多边形面积 示例: vjmap.calcPolygonArea([vjmap.geoPoint([0, 0]),vjmap.geoPoint([5, 5]),vjmap.geoPoint([10, 0])]) // 25|
|vjmap|clipPolygon|points: GeoPoint[], bounds: GeoBounds|根据范围裁剪多边形||
|vjmap|bufferConvexPolygon|ring: GeoPoint[], buffer: number|取一个凸环并通过在其周围应用缓冲区将其向外扩展。 此功能假定环是顺时针缠绕的。||
|vjmap|polygonIsClockwise|points: GeoPoint[]|根据格林公式判断多边形是否为顺时针| |
|vjmap|polygonCentroid|points: GeoPoint[]|根据坐标列表计算多边形的质心| |
|vjmap|isPointInPolygon|pos: GeoPoint, polygon: GeoPoint[]|判断点是否在多边形内。| |
|vjmap|polylineMarginToPolygon|pts: GeoPointLike[],options|把多段线往外扩展成多边形。| |
|vjmap|createObjectPolygonUtil| | 创建一个多边形几何工具对象，可对多边形进行差，并，相交等操作。| |

## 圆/椭圆
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|getCirclePolygonCoordinates|center,radius,points,startAngle,endAngle |得到圆或圆弧的离散化的多边形的点||
|vjmap|getCircleFeature|center,radius,points,startAngle,endAngle |得到圆或圆弧的离散化的多边形的geojson的形式||
|vjmap|getEllipsePolygonCoordinates|同上,majorAxisRadius,minorAxisRadius |得到椭圆或椭圆弧的离散化的多边形的点||
|vjmap|getEllipseFeature|同上,majorAxisRadius,minorAxisRadius |得到圆或圆弧的离散化的多边形的geojson的形式||

## 曲线
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|bezierCurveToPolyline|bezierCurve,precision, recursiveCount |将 bezierCurve 转换为折线||
|vjmap|getBezierCurveLength|bezierCurve,precision, recursiveCount |计算贝塞尔曲线的长度||
|vjmap|convertBezierCurveToPolyline|bezierCurve,precision, recursiveCount |将贝塞尔曲线转换为折线.||

## 拓扑图
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|Graph| |找最短路径 示例: var graph = Graph().addEdge("s", "t", 10).addEdge("s", "y", 5).addEdge("s", "y", 4).addEdge("t", "y", 2).addEdge("y", "t", 3).addEdge("t", "x", 1).addEdge("y", "x", 9).addEdge("y", "z", 2).addEdge("x", "z", 4).addEdge("z", "x", 6);var res = graph.shortestPath("s", "z")|
|vjmap|findShortestPath|startPoint, endPoint,lines,precision,hasDirection | 给定所有路线、起始点、终点生成最短路径| |

## 算法
|类名/命名空间|方法名|参数|说明|
|:---|:---|:---|:---|
|vjmap|coordTransfromGetFourParamter|srcArr,destArr,isSetRotateZero,isConsiderPointOrder |坐标转换得到四参数| |
|vjmap|coordTransfromByFourParamter|pt: GeoPoint, param: {dx: number, dy: number, scale: number, rotate: number} |通过四参数进行坐标转换| |
|vjmap|coordTransfromByInvFourParamter|pt: GeoPoint, param: {dx: number, dy: number, scale: number, rotate: number} |通过四参数反算进行坐标转换| |
|vjmap|buildTransformerMatrix3d|src: number[], dest: number[] |透视投影转3d css 矩阵|  buildTransformerMatrix3d([10, 44, 100, 44, 100, 300, 10, 300],[50, 54, 130, 14, 140, 330, 14, 220]); // matrix3d(0.33941251980451626,-0.45559008266623746,0,-0.003618782566632648,-0.14489797252411882,0.32715165499980803,0,-0.0011983213450810846,0,0,1,0,48.53568735052134,39.35987390477654,0,1) |
|vjmap|vectorContour|featureCollection: FeatureCollection,weight: string, breaks: number[],params |生成矢量等值面| |

## 其他
|类名/命名空间|方法名|参数|说明|示例|
|:---|:---|:---|:---|:---|
|vjmap.MathUtils|equals|num1: number, num2: number, dotErr: number = 8 |判断两个点是否相等| vjmap.MathUtils.equals(0.0041, 0.0042, 3) // true |
|vjmap.MathUtils|lerp|v1: number, v2: number, value: number |线性插值|vjmap.MathUtils.lerp(10, 20, 0.3) // 13|
|vjmap.MathUtils|map|val: number, inMin: number, inMax: number, outMin: number, outMax: number|将数字从一个范围映射到另一个范围。|vjmap.MathUtils.map(5, 0, 10, 100, 200) // 150|
|vjmap.MathUtils|clamp|value: number, min: number, max: number|确保输入值适合给定范围。|vjmap.MathUtils.clamp(-1, 0, 10) // 0|
|vjmap.MathUtils|wrap|n: number, min: number, max: number, isMin: boolean = false|通过模运算将n约束在给定范围内，不包括最小值|vjmap.MathUtils.wrap(11, 0, 10) // 1|

## 几何模型

API文档地址： [https://vjmap.com/docs/geomodel/](https://vjmap.com/docs/geomodel/)

示例代码地址： [https://vjmap.com/demo/#/demo/map/models/01geomodels](https://vjmap.com/demo/#/demo/map/models/01geomodels)

