2014-07-03 95 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