找出坐标是否在区域内

时间:2014-07-03 18:24:58

标签: php arrays coordinates

我正在为事件中的紧急护理构建此工具,而我遇到了问题。我有这张地图,如果在他们的地区发生了某些事情,那么某些团队会有标记进行干预。

现在,在创建干预时,可以在地图上输入坐标(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. 您的解决方案?
  4. 提前致谢:)

2 个答案:

答案 0 :(得分:1)

您应该将每个定义的区域分成三角形。然后,您可以使用此处提到的方法:How to determine if a point is in a 2D triangle?

像这样你不必用复杂的形状包围多边形边角 - 因为每个具有有限数量角落的形状都可以分成三角形。

可能采用的另一种方法:

假设您在任何事件发生之前定义了形状。假设这些形状在可能的时间内没有变化:

  • 将形状存储为与HTML地图标记兼容的格式,并将其与负责的小组关联:http://www.w3schools.com/tags/tag_map.asp
  • 当记者创建事件时,不要使用坐标来确定团队,而是使用他在定义的地图上点击的形状。然后,您根本不需要解决任何点/区域边界。

答案 1 :(得分:1)

如果您可以使用PostgreSQL / PostGIS,则可以使用“多边形几何体”列定义区域。然后使用ST_Contains() PostGIS功能使用点坐标选择区域是微不足道的。

MySQL中存在Spatial Extensions的等效功能。 这是MySQL的quickstart guide

编辑:一个快速的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,它支持应该执行的包含操作。