Javascript 谷歌地图多边形自相交检测

Javascript 谷歌地图多边形自相交检测,javascript,google-maps-api-3,polygon,shapes,self-intersection,Javascript,Google Maps Api 3,Polygon,Shapes,Self Intersection,我正在尝试从Google Maps API V3 polygons中实现一个多边形自相交算法。 目标只是检测用户绘制的简单多边形是否是自交多边形 我已经找到了,但它假设多边形顶点的坐标是按格式给定的。然而,这不是我的情况;我只能使用polygon.getPath()将多边形坐标检索到polygoncomplete事件中 这是我检索坐标的方式: google.maps.event.addDomListener(drawingManager, 'polygoncomplete', function(

我正在尝试从Google Maps API V3 polygons中实现一个多边形自相交算法。
目标只是检测用户绘制的简单多边形是否是自交多边形

我已经找到了,但它假设多边形顶点的坐标是按格式给定的。然而,这不是我的情况;我只能使用
polygon.getPath()
将多边形坐标检索到
polygoncomplete
事件中

这是我检索坐标的方式:

google.maps.event.addDomListener(drawingManager, 'polygoncomplete', function(polygon)
{
    var polygonBounds = polygon.getPath();
    var coordinates = [];

    for(var i = 0 ; i < polygonBounds.length ; i++)
    {            
        vertice = {
                      "Latitude" : polygonBounds.getAt(i).lat(),
                      "Longitude" : polygonBounds.getAt(i).lng()
                  }

        coordinates.push(vertice );
    }
}
google.maps.event.addDomListener(drawingManager,'polygoncomplete',函数(polygon)
{
var polygonBounds=polygon.getPath();
变量坐标=[];
对于(var i=0;i
如何将
polygon.getpath()
给出的这些坐标转换为geoJSON格式?
有没有更好的方法来检测Google Maps多边形是否自交?如果是,请分享一些代码示例,而不仅仅是数学解释


PS:我看到了链接,但没有任何代码示例,我有点迷路了。

您不需要将它们转换为GeoJSON来使用,您需要将它们从google.maps.LatLng对象转换为jsts.geom.Coordinates。而不是使用此:

var geoJSON2JTS = function(boundaries) {
  var coordinates = [];
  for (var i = 0; i < boundaries.length; i++) {
    coordinates.push(new jsts.geom.Coordinate(
        boundaries[i][1], boundaries[i][0]));
  }
  return coordinates;
};

代码片段:

var映射选项={
缩放:16,
中心:新google.maps.LatLng(62.1482,6.0696)
};
var drawingManager=new google.maps.drawing.drawingManager({
drawingControl:错误,
多克隆选择:{
可编辑:真
}
});
var googleMaps2JTS=函数(边界){
变量坐标=[];
对于(var i=0;i
#地图{
宽度:500px;
高度:400px;
}


在地图上画一个多边形


我必须将第一个坐标包含到坐标数组的末尾,以避免JSTS中的验证错误。在函数googleMaps2JTS中,在返回之前添加此行:coordinates.push(coordinates[0]);如果您有相同的问题
var googleMaps2JTS = function(boundaries) {
  var coordinates = [];
  for (var i = 0; i < boundaries.getLength(); i++) {
    coordinates.push(new jsts.geom.Coordinate(
        boundaries.getAt(i).lat(), boundaries.getAt(i).lng()));
  }
  return coordinates;
};
/**
 * findSelfIntersects
 *
 * Detect self-intersections in a polygon.
 *
 * @param {object} google.maps.Polygon path co-ordinates.
 * @return {array} array of points of intersections.
 */
var findSelfIntersects = function(googlePolygonPath) {
  var coordinates = googleMaps2JTS(googlePolygonPath);
  var geometryFactory = new jsts.geom.GeometryFactory();
  var shell = geometryFactory.createLinearRing(coordinates);
  var jstsPolygon = geometryFactory.createPolygon(shell);
 
  // if the geometry is aleady a simple linear ring, do not
  // try to find self intersection points.
  var validator = new jsts.operation.IsSimpleOp(jstsPolygon);
  if (validator.isSimpleLinearGeometry(jstsPolygon)) {
    return;
  }
 
  var res = [];
  var graph = new jsts.geomgraph.GeometryGraph(0, jstsPolygon);
  var cat = new jsts.operation.valid.ConsistentAreaTester(graph);
  var r = cat.isNodeConsistentArea();
  if (!r) {
    var pt = cat.getInvalidPoint();
    res.push([pt.x, pt.y]);
  }
  return res;
};