【问题标题】:check if a point exists in given area containing 4 vertices检查一个点是否存在于包含 4 个顶点的给定区域中
【发布时间】:2009-06-03 15:30:37
【问题描述】:

参考http://www.weather.gov/directives/sym/pd01008006curr.pdf,第 8 页,我们在地理坐标系(纬度和经度系统)中给出了一个具有四个顶点的区域。我想检查该区域内是否存在具有特定纬度和经度的点。

【问题讨论】:

    标签: java geometry


    【解决方案1】:

    测试一个点是否在任意多边形内(任意数量的边,也允许凹面)的方法是选择一个你知道在多边形外的点;如果您正在测试的点和多边形外的点之间的线段与多边形段的奇数相交,则该点在多边形内。

    【讨论】:

    • 这是乔丹曲线定理的一个关联。 en.wikipedia.org/wiki/Jordan_curve_theorem
    • @JasonS:有趣;我刚刚将其学习为“测试点是否在任意多边形中的方法”。不过,我从中得知它的来源可能是从那个定理中得到的。
    【解决方案2】:

    这是具有坐标系的球体上的point-in-polygon 问题,它有几个细微之处使其比 X-Y 平面中的“常规”多边形点问题更难:

    1) 里面和外面是什么? (例如,如果我有一个边长为 1 英里的小“正方形”,它是包围 1 平方英里还是地球表面的其余部分?这是一个简单的例子,但对于非常大的多边形,可能不清楚哪个应该在里面并且应该在外面,除非明确指定)

    2) 多边形的线段是大圆线段吗?如果是这样,那么除非它们是子午线或赤道,否则它们不代表经纬度坐标系中的直线——并且您需要处理曲线而不是几何图形中的直线。球面几何是要走的路。

    3) 坐标系的“边”(国际日期变更线和两极)——由经度 +179.9 度、-179.9 度和纬度 +0.1 度、-0.1 度分隔的“正方形”通常不会是被认为包含点 0 N、0 W,并且会被认为包含点 0 N、180 W。但如果你天真地检查经纬度点的不等式,你会得到相反的答案。

    所以我没有答案,但这些都是需要考虑的微妙问题。 (读作“确保将它们包含为测试用例”!)

    编辑:我找到了 spheres 包,它的方法 SphericalPolygon.contains 可以满足您的需求。但是我没有亲自使用过这个包,它是GPL,而不是 LGPL,所以如果你想在专有产品中使用它,它会“污染”你的其他来源。

    【讨论】:

    • 另一个问题是多边形的边缘是否可以相互交叉。一个 4 顶点的多边形可以是一个简单的实体物体,也可以是由两个三角形组成的物体。
    • 如果你的顶点是按顺序给出的,里面就是右边。
    • 这也是真的。 :) 我已经驳回了这种情况,因为尽管有可能,但它不是来自 GIS 数据库的明智数据。
    • @MSalters:这需要通过众所周知的约定达成一致。 (为什么不是左侧?)但我同意,这就是 GIS 系统处理它和处理孔的方式。
    • 您好 Jason,是的,您建议作为参考的 sphere 包由于 GPL 不能使用,请您提供一些其他好的解决方案。期待,
    【解决方案3】:

    你的意思是编程还是数学?如果您在数学上理解它,那么以编程方式很容易。基本上,顶点定义线。您只需要知道线条的哪一侧构成“内部”。然后,将您的顶点转换为方程式,但使用小于或大于而不是等于。

    Id est,假设您具有由以下等式定义的矩形: x=1, x=3, y=1, y=3

    如果您想知道 (2,2) 是否在该区域内,只需计算每个方程: x > 1, x 1, y

    如果四个都为真,则该点在区域内。

    【讨论】:

    • 如果它不是一个与经纬线完全对齐(即倾斜)的矩形怎么办?
    • 是的,这对于三角形来说是一种很好的技术,但对于任意多边形就不是很好了,因为如果它们是凹的,你会得到无效的结果。如果你的多边形是凸的,它会很好地工作。
    • 我看不出它是如何凹凸有 4 个顶点的,而且它不仅仅适用于矩形。我不在乎你有多少个顶点,你所要做的就是评估每一行并比较 。 . .时期。诀窍是要知道您的点是否应该是 而不是行。我不明白为什么这么难?
    • 您好 D.Patrick,您的意思是代码 pietschsoft.com/post/2008/07/… 应该适用于以下文件第 7-9 页中给出的区域:weather.gov/directives/sym/pd01008006curr.pdf
    【解决方案4】:

    【讨论】:

    猜你喜欢
    • 2014-12-12
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多