- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 C# 中寻找一种完美的算法,用于确定是否在多边形内找到某个位置(纬度/经度)。
在谷歌地图上,我创建了不同的多边形区域。每个区域都可以用一组坐标表示。例如,下面是牙买加蒙特哥湾(A区)的坐标(经度、纬度组合):
-77.9531479,18.4565699,-77.9482339,18.4579542,-77.9443393,18.4615874,-77.9399726,18.4627373,-77.933943,18.4653526,-77.931272,18.4652763,-77.9282138,18.46578,-77.9267121,18.4645891,-77.924619,18.4625118,-77.923131,18.4689837,-77.924646,18.4727285,-77.924112,18.4763919,-77.9255882,18.4793735,-77.927573,18.4833522,-77.9234638,18.4888979,-77.92363,18.492311,-77.914973,18.4951459,-77.918355,18.4971759,-77.972733,18.4985953,-77.916291,18.527569,-77.8997725,18.56178,-77.8962851,18.58578,-77.873843,18.517512,-77.8772736,18.5228297,-77.9253387,18.521568,-77.9531479,18.4565699
现在假设我们需要查明牙买加蒙特哥湾的 Sunset beach Hotels 坐标(经/纬度):-95.030710, 29.148650 是否属于 A 区?
我已经测试了很多可用的算法,但没有一个能够完美运行。它适用于某些酒店,但不适用于所有酒店。
如有任何帮助,我们将不胜感激。
最佳答案
我已成功使用绕线编号:http://geomalgorithms.com/a03-_inclusion.html
第 1 步:定义绘制多边形的方向。
从根本上来说,多边形是静态的,没有方向。但是,请考虑在纸上绘制多边形时执行的移动。您从一个位置开始,然后移动笔为多边形的每一侧绘制一条线。如果你不把笔从纸上拿开,多边形的每条边要么全部按顺时针方向绘制,要么全部按逆时针方向绘制。
我们可以使用这个“方向”来确定多边形的边如何围绕该点“缠绕”(顺时针缠绕或逆时针缠绕)。
对于所讨论的真实多边形(尚未在某个方向上绘制),您认为它是在哪个方向上绘制的并不重要,但重要的是每条边都被认为是在同一方向上绘制的.
第 2 步:将多边形的每一边视为具有两个顶点的单独对象。
如果我们知道多边形的顶点,我们就可以确定多边形每条边的端点。
第 3 步:确定每条边与点相交的方向(如果边确实与点相交)。
使用顺时针缠绕来查找多边形是否包围点
的示例:
定义一个计数器
来跟踪缠绕数。
对于多边形的每条边,取第一个顶点 vertex1
和第二个顶点 vertex2
(这些点定义每条边的端点)。如果vertex1.x
<point.x
,则边从point.x
的左侧开始。如果 vertex2.x
> point.x
则侧面结束于 point.x
的右侧。如果边从左侧开始并在右侧结束,则该线穿过该点。
如果边穿过点
,我们需要确定它穿过的方向。使用顺时针方向作为正方向,边必须穿过点
上方才被视为正方向。如果点
x 位置处的线的 y 值大于点
的 y 值,则该线会穿过点
上方。否则它会穿过该点下方。
如果它越过上方,则增加计数器
。如果它越过下方,则减少计数器
。
注意:请注意,如果线从左到右穿过,则正方向会看到线在点上方经过,但如果线从右到左(回绕到点下方),则正方向会看到线通过低于该点。正方向为顺时针方向。
现在对多边形的下一条边执行相同的操作,其中 vertex1
将是前一条边的 vertex2
,而新的 vertex2
是按顺时针方向移动时多边形的下一个 Angular 。
对多边形的所有边执行此操作。
最后,您将得到一个带有正值、负值或 0 值的计数器。
如果计数器的值为0,则多边形不包含该点,否则包含该点。
这是因为,包含一个点的多边形总是有偶数条边经过该点。可以是 2 条边,也可以是 4 条边等。其中,一半将从点上方从左到右经过,一半将从点下方从右到左经过。
结果为 0 意味着没有边经过该点(因此多边形永远不会与该点的轴相交),或者多边形在两个方向上经过该点的一侧(例如,从左到右在该点上方,然后在该点上方从右到左)。因此绕组数相互抵消。
关于javascript - 位置是否在多边形内找到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52056319/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!