多边形算法中的点有时会给出错误的结果[关闭]

2024-01-17

我在 StackOverflow 上看到了我在 PHP 代码中实现的“多边形中的点”光线跟踪算法。大多数时候,它工作得很好,但在一些复杂的情况下,对于复杂的多边形和恶性点,它会失败,并且它说该点不在多边形中。

例如:
你会找到here http://pastebin.com/cE9Af8ev我的 Polygon 和 Point 类:pointInPolygon 方法位于 Polygon 类中。在文件的末尾,有两个点应该位于给定的多边形内(在 Google Earth 上是这样)。第二个效果很好,但第一个有问题:(。

您可以使用以下命令轻松检查 Google Earth 上的多边形这个 KML 文件 http://pastebin.com/ZT5SGNNB.


去过那里 :-) 我还浏览了 Stackoverflow 的画中画建议,包括您的参考和这个线程 https://stackoverflow.com/questions/5065039/find-point-in-polygon-php。不幸的是,没有一个建议(至少是我尝试过的)对于现实生活场景来说是完美的和足够的:比如用户在谷歌地图上徒手绘制复杂的多边形,“恶性”的左右问题,负数等等。

PiP 算法必须适用于所有情况,即使多边形由数十万个点组成(例如县边界、自然公园等),无论多边形有多么“疯狂”。

所以我最终根据天文学应用程序的一些来源构建了一种新算法:

//Point class, storage of lat/long-pairs
class Point {
    public $lat;
    public $long;
    function Point($lat, $long) {
        $this->lat = $lat;
        $this->long = $long;
    }
}

//the Point in Polygon function
function pointInPolygon($p, $polygon) {
    //if you operates with (hundred)thousands of points
    set_time_limit(60);
    $c = 0;
    $p1 = $polygon[0];
    $n = count($polygon);

    for ($i=1; $i<=$n; $i++) {
        $p2 = $polygon[$i % $n];
        if ($p->long > min($p1->long, $p2->long)
            && $p->long <= max($p1->long, $p2->long)
            && $p->lat <= max($p1->lat, $p2->lat)
            && $p1->long != $p2->long) {
                $xinters = ($p->long - $p1->long) * ($p2->lat - $p1->lat) / ($p2->long - $p1->long) + $p1->lat;
                if ($p1->lat == $p2->lat || $p->lat <= $xinters) {
                    $c++;
                }
        }
        $p1 = $p2;
    }
    // if the number of edges we passed through is even, then it's not in the poly.
    return $c%2!=0;
}

说明性测试 :

$polygon = array(
    new Point(1,1), 
    new Point(1,4),
    new Point(4,4),
    new Point(4,1)
);

function test($lat, $long) {
    global $polygon;
    $ll=$lat.','.$long;
    echo (pointInPolygon(new Point($lat,$long), $polygon)) ? $ll .' is inside polygon<br>' : $ll.' is outside<br>';
}

test(2, 2);
test(1, 1);
test(1.5333, 2.3434);
test(400, -100);
test(1.01, 1.01);

输出:

2,2 is inside polygon 
1,1 is outside
1.5333,2.3434 is inside polygon 
400,-100 is outside
1.01,1.01 is inside polygon

自从我在几个网站上切换到上述算法以来已经一年多了。与“SO 算法”不同,到目前为止还没有任何投诉。查看实际效果here http://svampe.dk/soeg/(国家真菌学数据库,对不起丹麦人)。您可以绘制一个多边形,或选择一个“kommune”(一个县) - 最终将具有数千个点的多边形与数千条记录进行比较)。

Update请注意,该算法的目标是地理数据/纬度,经度,它可以非常精确(第n位小数),因此将“在多边形中”视为内多边形 - not 在多边形的边界上。 1,1 被视为外部,因为它是on边界。 1.0000000001,1.01 不是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多边形算法中的点有时会给出错误的结果[关闭] 的相关文章

  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 计算特定产品类别的购物车商品数量

    我试图仅从 WooCommerce 中的特定产品类别获取购物车中的商品数量 我正在为一家酒厂做一个网站 它有酒精和非酒精产品 所有葡萄酒都属于 葡萄酒 主类别或类别 ID 34 其下有许多子类别和产品 对于属于此类别的任何商品 我需要知道此
  • 为什么 LinkedIn v2 Share API 在任何 v2/shares 端点上给出权限不足的错误?

    当我调用任何 v2 LinkedIn 共享 API 端点时 例如https api linkedin com v2 socialActions https api linkedin com v2 socialActions share UR
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • 如何通过 PDO 使用密码哈希来使我的代码更安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的代码实际上可以工作 但它一点也不安全 我不想使用 MD5 因为它不是那么安全 我一直在查找密码哈希 但我不确定如何将其合并到我的代
  • Php mysql 30秒后执行任务

    如何让 mysql 查询命令在访问 php 站点 30 秒后执行 您可以对执行 mysql 查询的 php 脚本发出 AJAX 请求 在 js 中使用计时器
  • php 或 zend 中国际电话号码验证的正则表达式是什么?

    我有一个 zend 表单 其中有一个电话号码字段 并且必须检查验证器 我决定为此使用正则表达式 我搜索了谷歌 但我得到的结果不起作用 谁能给我提供正则表达式 这是我的代码 phone new Zend Form Element Text p
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • 如何使用 PHP 动态插入 CSS 类?

    下面的代码有什么问题 我想在相应的情况下动态插入 当前 CSS 类 li 单击元素 谢谢 section section li
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • MySQL:“您的 SQL 语法错误...靠近键...”? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我发现了一个非常酷的用于丢失密码的脚本 但是这一行给我带来了问题 r mysql query INSERT INTO keys u
  • 我的 PHP 代码不会将记录插入到 mySQL 数据库表中[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的网站上
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • 如何使用额外标记输出 wp_list_categories

    我目前正在使用下面的脚本在无序列表中输出我的所有 WordPress 类别 如何获得带有额外标记的输出 ul ul 例如 ul li Category 1 rsaquo li li Category 2 rsaquo li ul 代替 ul
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结

随机推荐

  • 什么是好的“模板”Yosys 合成脚本?

    我想编写自己的 Yosys 综合脚本 从什么开始是一个好的模板 手册和网页包含各种示例 但没有 权威 的 hello world 示例 The synth命令运行通用综合任务的推荐脚本 看help synth http www cliffo
  • 函数调用后记住数组值

    如果我这样写 c def cf n c range 5 print c if any i gt 3 for i in c is True print hello cf 1 print c 然后我得到 1 2 3 4 hello 我对编程真的
  • 在 PyCharm IDE 5.0.4 中运行特定的单元测试函数

    我正在尝试使用 PyCharm 进行单元测试 使用unittest 并且能够使其工作 测试运行器很好地显示了测试用例和嵌套测试函数的列表 但是 一旦发现测试 我就找不到任何方法来 重新 运行特定的测试函数 唯一可用的按钮将运行整个测试列表
  • 如何解码 JSFuck 脚本?

    我在 JavaScript 中有这样的代码 在控制台中 它将返回 Array filter 如何解码大量与上面文本相似的文本 例如
  • 获取用户当前位置 iOS 8.0

    我尝试使用 MapKit 和 CoreLocation 获取用户当前位置 我对 Objective C 真的很陌生 就我的研究而言 旧版 iOS 到 iOS 8 0 的实现略有不同 我已经正确地遵循了一切 它仍在获取当前位置 我的实际目标是
  • 清除 Bootstrap 中的表单输入字段?

    Bootstrap 是否提供了通过按钮清除表单输入字段的功能 或者我需要通过 jquery 自己推出 从这篇文章jQuery Validate resetForm 不会重置 onFocus 验证 https stackoverflow co
  • 更改 config.assets.version 号有什么作用?

    更改 config assets version 号有什么作用 我知道资产会过期 正如评论中所写 但它在后台会做什么 它会删除所有已编译的资源吗 或者它是否采用该版本号并在其他地方使用它 它将使用另一个指纹 代码附加到文件名 来预编译资产
  • 量角器关闭当前选项卡

    我有一个非角度页面 我需要点击 2 个链接 单击自动在新选项卡中打开的链接之一时 现在我切换到新选项卡并设置browser ignoreSynchronization false因为新打开的选项卡是一个有角度的窗口 并调用我的测试之一 一经
  • 如何用权重标记图边

    Warning 当 Mathematica v 8 0 是最酷的孩子时 我发布了这个问题 该bug已于9 0 1版本解决 The help for EdgeLabels http reference wolfram com mathemat
  • Spark 中函数返回空列表

    下面是获取压缩文件中文件名列表的代码 def getListOfFilesInRepo zipFileRDD RDD String PortableDataStream List String val zipInputStream zipF
  • 如何从 MVC3 中的控制器调用 javascript 函数

    我环顾四周 找不到解决方案 因此我发现自己在这里 根据我所读到的内容 我可以使用 RegisterClientScript 或 RegisterClientScriptBlock 在 ASP NET Web 表单中执行此操作 我在任何 MV
  • redis HLL 误报太多

    Hyperlog日志是一种概率算法 根据 redis HLL 文档 我们可能会得到 0 81 的错误 但我得到的错误是 17 20 我认为有问题 这是我的简单 perl 测试脚本 有没有什么错误 usr bin perl w use Red
  • 如何检测git中的分支点?

    我正在尝试确定分支中的第一次提交 我读过其他各种 SO 帖子 包括用 Git 寻找分支点 https stackoverflow com questions 1527234 finding a branch point with git 但
  • 在手机上看到的带有 mathjax 的博客

    我正在使用 mathjax我的博客点博客 http ochopatas blogspot mx 在电脑上看效果很好 但在手机上看公式就不会变形 我找到了这个其他博客点博客 http imflaud blogspot mx 2016 07 i
  • AngularJS 与 .NET MVC 捆绑缩小错误

    我一直在 NET MVC 网站内开发一个大型 AngularJS 应用程序 我已经花了很长时间没有测试它是否会使用捆绑优化功能成功缩小 BundleTable EnableOptimizations True 当然 它失败了 我一直在玩捆绑
  • 实施“make check”或“make test”

    如何用Make实现一个简单的回归测试框架 我正在使用 GNU Make 如果这很重要的话 我当前的 makefile 看起来像这样 为简单起见进行了编辑 OBJS jscheme o utility o model o read o eva
  • Heroku + Github 部署策略

    我正在开发一个 Web 应用程序 在 Github 上托管源代码并在 Heroku 上运行该应用程序 一切工作正常 但我有一个问题 我无法解决 在部署代码之前 我运行一些脚本来优化代码 缩小 连接文件等 heroku 应用程序仅使用该应用程
  • E/libprocessgroup:set_timerslack_ns 写入失败:不允许操作?

    当我运行 Android 应用程序时 我在 Logcat 中遇到了这个问题 有谁知道这个问题以及如何解决它 该应用程序不会崩溃 但是当我每次尝试在 Google 地图的自动完成搜索栏中输入内容时 它都会关闭该活动 并返回上一个 在谷歌地图上
  • 以静默方式安装 Dot net 4.5 作为依赖项

    我有一个静默安装的设置 但它依赖于 dot net Framework 4 5 那么我该如何创建 也可以静默安装依赖项的安装程序 Setup is created in Install Shield and it is a wpf appl
  • 多边形算法中的点有时会给出错误的结果[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 StackOverflow 上看到了我在 PHP 代码中实现的 多边形中的点 光线跟踪算法 大多数时候 它工作得很