如何使用JSTS Library计算Google Maps API中的交叉区域?

时间:2014-09-25 11:09:59

标签: javascript google-maps google-maps-api-3

我正在尝试计算两个三角形之间交点的面积。 我发现JSTS Topology Suite有一个Geometry class方法intersection()。 我在JSFiddle和我的本地计算机上试了一下,但我得到了Uncaught TypeError: undefined is not a function。 JSTS还有一个example。在这里你可以看到代码。 我的代码在JSFiddle中看起来是一样的:

var union = triangleCoords.union(secondTriangleCoords);
var intersection = triangleCoords.intersection(secondTriangleCoords);
console.log('Intersection ' + intersection);
google.maps.geometry.spherical.computeArea(intersection);

我是否应该进行转换?

1 个答案:

答案 0 :(得分:7)

一般的答案是你需要将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)方法。

使用jsts方法的

working fiddle区域为三角形,并集和交集。

将结果转换回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);

working fiddle