2014-07-03 56 views
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和end_x查询来获取X侧,同为Y侧。
  2. 按照上面的做法,但不是添加字段,只需在PHP代码中执行此操作,贯穿每个团队区域
  3. 您的解决方案是什么?

感谢提前:)

回答

1

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

像这样,您不必将头部缠绕在具有多边形边角的复杂形状上 - 导致每个具有有限角的形状都可以分为三角形。

另一种方法可能是可行的:

假设您所定义的形状才可能发生的任何事件。假设这些形状中可能出现的时间不要改变:

  • 商店形状的格式,在HTML兼容的地图标记,并与负责团队联系起来:http://www.w3schools.com/tags/tag_map.asp
  • 当记者将创建一个事件,不要使用坐标来确定团队,而是使用他在定义的地图上点击的形状。那么你根本不需要解决任何点/区域边界。
+0

嘿,是的图像地图是一种方法,但它也应该可以从列表中选择一个位置(在创建干预字段中),然后它应该给最近的团队 - 因此对于这个图像地图不起作用 - 但从地图图像地图中选择是完美的!谢谢:D – JELLEJ

+1

@JELLEJ那么,这些位置也需要定义 - 如果您预先定义了它们,使用“x = 324,y = 24t53”或“relatedShape = blueTeam” - 应该无关紧要,除非您可以重用定义的位置随着形状的变化... – dognose

+0

谢谢!好主意:) – JELLEJ

1

如果您可以使用PostgreSQL/PostGIS,那么您可以使用多边形几何列来定义您的区域。然后使用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,它支持包含应该做的操作。

+0

谢谢!我可能会在未来的软件更新中使用它 – JELLEJ