查找坐标是否在区域内

3
我正在为活动的紧急医疗保健构建这个工具,但我遇到了一个问题。我有一张地图,上面标注了某个团队需要在其区域内进行干预。现在,在创建干预时,可以在地图上输入坐标(x,y)。我想知道如何实现这一点。
团队区域不一定是正方形,我将它们存储如下:x1,y1,x2,y2,x3,y3,x#,y#。
您认为最佳做法是什么?
1.添加4个字段start_x、end_x、start_y和end_y,然后执行SELECT * FROM tble WHERE coord_x BETWEEN start_x AND end_x查询,以获取X轴,Y轴也是同理。
2.与上述类似,但不用添加字段,只需在PHP代码中运行每个团队区域即可。
3.你的解决方案是?
提前感谢:)
2个回答

1
如果您可以使用PostgreSQL/PostGIS,那么您可以使用多边形几何列定义您的区域。然后使用ST_Contains() PostGIS函数轻松选择包含点坐标的区域。
MySQL中也存在等效功能,使用Spatial Extensions即可。这是一个适用于MySQL的快速入门指南
编辑:一个快速的MySQL实现。
CREATE TABLE `geozones` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NULL DEFAULT NULL,
    `geom` GEOMETRY NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

insert into geozones (name, geom) 
VALUES ('test', GeomFromText('Polygon((46 -123, 48 -123, 48 -121, 46 -121, 46 -123))') );

select name from geozones where Contains(geom, GeomFromText('POINT(47 -122)'));

如果您无法或不愿使用上述任何一种方法,则可能的替代方案(我未使用过)是GitHub上的geoPHP项目。根据Wiki,它支持包含操作,这应该可以胜任。

谢谢!我可能会在软件的未来更新中使用这个。 - JJ15

1
你应该将每个定义的区域分成三角形。然后你可以使用这里提到的方法: 如何确定一个点是否在2D三角形内? 这样,你就不必为复杂的具有多个边缘和角落的形状而烦恼 - 因为每个具有有限角点的形状都可以被分成三角形。
可能还有另一种方法:
假设你是在任何事件发生之前定义形状。假设那些形状在可能的时间内不会改变:
- 以HTML地图标签兼容的格式存储形状,并将其与负责的小组关联:http://www.w3schools.com/tags/tag_map.asp - 当报告者创建事件时,不要使用坐标来确定小组,而是使用他在定义的地图上单击的形状。那么你就不必解决任何点/区域边界了。

嗨,是的,图像地图是一种方法,但也应该可以从列表中选择位置(在创建干预字段中),然后它应该给出最近的团队 - 所以对于这个图像地图不起作用 - 但从地图图像中选择图像地图是完美的!谢谢:D - JJ15
1
@JELLEJ 好的,这些位置也需要被定义 - 如果你预先定义它们,使用 "x=324,y=24t53" 或 "relatedShape=blueTeam" - 不应该有关系,除非你可以重复使用已定义的位置来改变形状... - dognose
谢谢!好主意 :) - JJ15
我选择了你的解决方案作为我的解决方案。谢谢! - JJ15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接