我将泰国多边形数据存入了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))'));
这是一个带有点的多边形 -
红色 是第一个,
蓝色 是最后一个。
![Thailand Polygon Dots](https://istack.dev59.com/nKz0g.webp)
我使用
https://www.gpsvisualizer.com/draw/ 在泰国多边形地图上绘制了一些内外的点,并创建了屏幕以可视化所有的点。
![Dots difference MySQL / PHP](https://istack.dev59.com/IF8eH.webp)
我将点作为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