如何使用JSTS库在Google Maps API中计算交集区域?

4
我正在尝试计算两个三角形相交的面积。 我发现JSTS拓扑套件有一个Geometry类,其中包含一个intersection()方法。 我在JSFiddle和本地计算机上尝试了它,但是出现了Uncaught TypeError: undefined is not a function错误。 JSTS还提供了一个示例。在这里您可以查看代码。 我的代码在JSFiddle中看起来与示例相同:
var union = triangleCoords.union(secondTriangleCoords);
var intersection = triangleCoords.intersection(secondTriangleCoords);
console.log('Intersection ' + intersection);
google.maps.geometry.spherical.computeArea(intersection);

我还需要做转换吗?


1
jsts库并未为Google Maps的Polygon类添加一个union方法。 - geocodezip
这个问题的答案Google Maps Polygons self intersecting detection可能是相关的。 - geocodezip
1个回答

8
一般来说,您需要将google.maps.Polygon对象转换为jsts.geom.Geometry对象,然后运行union操作。如果您想在Google Maps Javascript API v3地图上显示结果,则需要将返回的jsts.geom.Geometry对象转换回google.maps.Polygon。这段代码(来自this question)将路径转换为jstsPolygon:
var coordinates = googleMaps2JTS(googlePolygonPath);
var geometryFactory = new jsts.geom.GeometryFactory();
var shell = geometryFactory.createLinearRing(coordinates);
var jstsPolygon = geometryFactory.createPolygon(shell);

类似这样:

var geometryFactory = new jsts.geom.GeometryFactory();

var trito = bermudaTriangle.getPath();
var tritoCoor = googleMaps2JTS(trito);
var shell = geometryFactory.createLinearRing(tritoCoor);

var trito2 = secondBermuda.getPath();
var tritoCoor2 = googleMaps2JTS(trito2);
var shell2 = geometryFactory.createLinearRing(tritoCoor2);

var jstsPolygon = geometryFactory.createPolygon(shell);
var jstsPolygon2 = geometryFactory.createPolygon(shell2);

var intersection = jstsPolygon.intersection(jstsPolygon2);

jsfiddle

如果要在结果上使用computeArea方法,则需要将其转换回google.maps.LatLng对象的数组或MVCArray对象(computeArea(path:Array.|MVCArray., radius?:number)

或者您可以使用[jsts.geom.Polygon.getArea](http://bjornharrtell.github.io/jsts/doc/api/symbols/jsts.geom.Polygon.html#getArea) 方法。

working fiddle,使用jsts方法计算三角形、并集和交集的面积。

将结果转换回google.maps.LatLng和google.maps.Polygon对象的代码:

var jsts2googleMaps = function (geometry) {
  var coordArray = geometry.getCoordinates();
  GMcoords = [];
  for (var i = 0; i < coordArray.length; i++) {
    GMcoords.push(new google.maps.LatLng(coordArray[i].x, coordArray[i].y));
  }
  return GMcoords;
}

var intersectionGMArray = jsts2googleMaps(intersection);

然后获取面积:
var intersectionGMarea = google.maps.geometry.spherical.computeArea(intersectionGMArray);

工作的代码片段


非常感谢!这很棒!但是我仍然不理解JSTS的面积方法,它返回什么?在文档中只提到“返回此多边形的面积”。 并且您能否将其与此问题合并,我认为它们是相同的。 谢谢 - xmux
据我所知(我同意这并不清楚),JSTS的getArea方法返回二维面积(因此,如果您提供Lat/Lng坐标,则单位将是degree^2,但并不太有用),这就是为什么我在我的答案中添加了回到Google Maps对象的转换,因为那里的函数返回米和平方米。 - geocodezip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接