我正在使用Google地图和多边形,但是我必须验证多边形之间是否相互重叠。
我有一个函数,当一个点(lat,lng)在一个多边形内时返回TRUE,但这还不足以确定一个多边形的每个点是否在另一个多边形内。
有什么建议吗?
我正在使用Google地图和多边形,但是我必须验证多边形之间是否相互重叠。
我有一个函数,当一个点(lat,lng)在一个多边形内时返回TRUE,但这还不足以确定一个多边形的每个点是否在另一个多边形内。
有什么建议吗?
Answers:
JSFiddle示例
我创建了一个JSFiddle,它使用JavaScript拓扑套件(JSTS)(JSTS)库演示了您的问题的解决方案。
讲解
此方法有两个步骤。第一步,将您的Google几何转换为WellKnownText(WKT)几何表达式,这是一种广泛支持的格式。第二步使用JSTS对geometry.intersects()
两个WKT几何图形执行JSTS 比较。
要真正理解这一点,您需要对WKT有基本的了解。由于您的Google Map中的多边形几何图形不受广泛支持,因此我立即将其转换为WKT几何图形,以便我们可以在JSTS中使用它们。
为了轻松做到这一点,我使用了Wicket库。当然,您始终可以自行开发自己的Google-Polygon-to-WKT方法,也可以使用我曾经写的一种方法,也可以使用其他可能找到的解决方案。就个人而言,这些天我只使用Wicket,就像您看到的那样,它非常简单:
// Pass in two Google Polygon objects.
// It returns two WellKnownText (WKT) geometry expressions.
//
function UseWicketToGoFromGooglePolysToWKT( poly1, poly2 )
{
var wicket = new Wkt.Wkt();
wicket.fromObject(poly1);
var wkt1 = wicket.write();
wicket.fromObject(poly2);
var wkt2 = wicket.write();
return [wkt1, wkt2];
}
接下来是肉和土豆-使用JSTS来获取两个WKT几何形状,并测试它们是否相交。再一次,依靠库,没有太多东西了:
// Pass in two WKT geometry expressions.
// It performs a JSTS intersects() comparison.
//
function UseJstsToTestForIntersection( wkt1, wkt2 )
{
// Instantiate JSTS WKTReader and get two JSTS geometry objects
var wktReader = new jsts.io.WKTReader();
var geom1 = wktReader.read(wkt1);
var geom2 = wktReader.read(wkt2);
if (geom2.intersects(geom1)) {
alert('intersection confirmed!');
} else {
alert('..no intersection.');
}
}
我如何链接小提琴中的库
上面的小提琴链接和我演示的解决方案要求在您的项目中添加两个第三方库-JSTS和Wicket。从各自的Github中获取代码并将其合并到您的项目中是另一回事。但是,为了摆弄,我通过在克里斯托弗·曼宁(Christopher Manning)发布的现有JSTS示例以及Wicket自己的演示页面中引用这些库来链接到这些库。基本上,我打开了页面,选择了“查看源代码”,并选择了对这两个库的相关引用。这些是我使用的确切库端点:
http://arthur-e.github.io/Wicket/wicket.js
http://arthur-e.github.io/Wicket/wicket-gmap3.js
http://bl.ocks.org/christophermanning/raw/4450188/javascript.util.min.js
http://bl.ocks.org/christophermanning/raw/4450188/jsts.min.js