【问题标题】:How to calculate intersection area in Google Maps API with JSTS Library?如何使用 JSTS 库计算 Google Maps API 中的交叉区域?
【发布时间】:2014-09-25 11:09:58
【问题描述】:

我正在尝试计算两个三角形相交的面积。 我发现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);

我也应该进行转换吗?

【问题讨论】:

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


【解决方案1】:

一般的答案是您需要将 google.maps.Polygon 对象转换为 jsts.geom.Geometry 对象,然后运行联合。如果您想在 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);

working fiddle

【讨论】:

  • 非常感谢!这很棒!但我仍然没有得到Area Method from JSTS,它返回了什么?在文档中仅提到“返回此多边形的区域”。你能合并with this question吗,我认为它们是一样的谢谢
  • 我能说的最好的(我同意不清楚),JSTS 的 getArea 方法返回二维区域(所以如果你给它 Lat/Lng 坐标,单位将是度^ 2,不是但很有用),这就是为什么我在答案中将翻译添加回谷歌地图对象,因为那里的函数返回米和平方米。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多