我正在为事件中的紧急护理构建此工具,而我遇到了问题。我有这张地图,如果在他们的地区发生了某些事情,那么某些团队会有标记进行干预。
现在,在创建干预时,可以在地图上输入坐标(x,y)。我想知道如何做到这一点。
团队的区域不一定是正方形。我把它们存储起来像这样
X1,Y1,X2,Y2,X3,Y3,X#,Y#。
您认为最佳做法是什么?
提前致谢:)
答案 0 :(得分:1)
您应该将每个定义的区域分成三角形。然后,您可以使用此处提到的方法:How to determine if a point is in a 2D triangle?
像这样你不必用复杂的形状包围多边形边角 - 因为每个具有有限数量角落的形状都可以分成三角形。
可能采用的另一种方法:
假设您在任何事件发生之前定义了形状。假设这些形状在可能的时间内没有变化:
答案 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,它支持应该执行的包含操作。