Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 扩展PiP算法的MySQL实现?_Php_Mysql_Raycasting_Point In Polygon - Fatal编程技术网

Php 扩展PiP算法的MySQL实现?

Php 扩展PiP算法的MySQL实现?,php,mysql,raycasting,point-in-polygon,Php,Mysql,Raycasting,Point In Polygon,我需要在查询中指出一点 我已经找到了这两个伟大的解决方案: 但这些函数只能检查多边形内是否有一个点。我有一个查询,其中PiP部分应该只是查询的一部分,并检查多边形内的x点 大概是这样的: SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))'); SET @g2 = GeomFromText('Point(13.497834 52.

我需要在查询中指出一点

我已经找到了这两个伟大的解决方案:

但这些函数只能检查多边形内是否有一个点。我有一个查询,其中PiP部分应该只是查询的一部分,并检查多边形内的x点

大概是这样的:

SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GeomFromText('Point(13.497834 52.540489)');
SELECT MBRContains(@g1,@g2);
$points=列表/数组/任何支持语言的点

SELECT d.name
FROM data AS d
WHERE d.name LIKE %red%
// just bla bla

// how to do this ?
AND $points INSIDE d.polygon
AND myWithin( $points, d.polygo ) // or
更新

我用MBR函数进行了尝试,如下所示:

SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GeomFromText('Point(13.497834 52.540489)');
SELECT MBRContains(@g1,@g2);

G2不应该在G1内,但MBR说它在G1内。

所以实际上,你的问题是如何将同一个函数应用于多个值,并且仅当所有函数调用都返回true时才返回true。这并不难

如果是我,我会将点(以及可选的多边形-示例中未显示)放入一个表中,然后编写一个MySQL函数将光线投射方法应用于每个点-如果任何一个交互返回false,则返回false,然后返回true。在下面的示例中,我假设多边形是从您的多边形中提取并由主键标识的,而点是由外键标识的(使用函数mywithby zarun):

或者

将为您提供不在多边形内的点的数量(如果您只想知道是否所有点都不在多边形外,这将非常昂贵)。

如果您这样做会怎么样

SET @g1 = GEOMFROMTEXT('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GEOMFROMTEXT('Point(13.497834 52.540489)');
SELECT  ST_Contains(@g1,@g2);

而不是我?据我所知,MySQL空间文档。MBR*函数是最小边界矩形函数,因此它会显示点是否在几何体上的最小矩形内,但不在几何体本身内(如果是不规则多边形,且点在MBR内而不在多边形内)

在我看来,如下所示:您需要测试一个多边形中是否有多个点。如果所有的都是,那么它们的凸包也是。计算出它们的凸面外壳(基本上:按时钟方向或逆时针方向排列),这将创建一个多边形。现在测试新多边形是否在d.polygon内。

有什么问题吗?您是否检查了@eggyal链接中提供的所有函数?我已经了解到MBR不够精确,但现在深入挖掘。MBR将无法工作,因为它与边界框一起工作。检测多边形内的点将不准确。最终将使用过程SQL,那么为什么不使用命令式语言查询数据库并执行所需的计算呢?我不明白为什么SQL应该做所有事情。。。只是问一下。在erflection上,这可以被优化很多——但时间不允许。
SET @g1 = GEOMFROMTEXT('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GEOMFROMTEXT('Point(13.497834 52.540489)');
SELECT  ST_Contains(@g1,@g2);