我将泰国多边形放入 MySQL。并将接受的答案功能与 MySQL 8 中的内置功能进行了比较。
CREATE TABLE `polygons` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`polygon` POLYGON NOT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
SPATIAL INDEX `polygon` (`polygon`)
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
AUTO_INCREMENT=652
;
INSERT INTO `polygons` (`country`, `polygon`) VALUES ('Thailand', ST_GEOMFROMTEXT('POLYGON((102.1728516 6.1842462,101.6894531 5.7253114,101.1401367 5.6815837,101.1181641 6.2497765,100.1074219 6.4899833,96.3281250 6.4244835,96.1083984 9.8822755,98.7670898 10.1419317,99.5800781 11.8243415,98.2177734 15.1569737,98.9868164 16.3201395,97.4267578 18.4587681,98.1079102 19.7253422,99.0087891 19.7460242,100.2612305 20.2828087,100.4809570 19.4769502,101.2060547 19.4147924,100.8544922 17.4135461,102.0849609 17.9996316,102.8320313 17.7696122,103.3593750 18.3545255,104.7875977 17.4554726,104.6337891 16.4676947,105.5126953 15.6018749,105.2270508 14.3069695,102.9858398 14.2643831,102.3486328 13.5819209,103.0297852 11.0059045,103.6669922 8.5592939,102.1728516 6.1842462))'));
这是上面带点的多边形 -红色是第一个,蓝色- 最后一个:
我使用https://www.gpsvisualizer.com/draw/在地图上的泰国多边形内外绘制了一些点,并制作了屏幕以可视化所有点。
我将点作为 PHP 函数的坐标 + 使用查询将结果与 MySQL 函数进行了比较:
SELECT TRUE FROM `polygons` WHERE `polygons`.`country` = 'Thailand' AND ST_CONTAINS(`polygons`.`polygon`, POINT($long, $lat));
结果:
- MySQL 总是给我关于所有点的正确答案。
- PHP函数有错误的答案
- 红色- 如果我删除多边形的结束点
- 橙色- 不删除与打开相同的最后一个点,与 MYSQL 多边形中的相同。
- 白点具有相同的结果 PHP/MySQL并且是正确的答案。
我试图改变多边形,但是 php 函数总是对这些点出错,这意味着某处有我找不到的错误。
更新 1
找到解决方案 assemblysys.com/php-point-in-polygon-algorithm - 这个算法与 MySQL 算法一样工作!
更新 2
比较 PHP 与 MySQL 的速度(我认为 PHP 应该更快),但没有。比较了 47k 点。
18-06-2020 21:34:45 - PHP Speed Check Start
18-06-2020 21:34:51 - FIN! PHP Check. NOT = 41085 / IN = 5512
18-06-2020 21:34:51 - MYSQL Speed Check Start
18-06-2020 21:34:58 - FIN! MYSQL Check. NOT = 41085 / IN = 5512