2009-11-01 70 views
1

我試圖找出接近以下方法的最佳方法:根據經度和緯度設計網格疊加層

說我有一個地球的平面表示形式。我想創建一個網格覆蓋這與網格上的每個廣場相當於約3平方公里。每個廣場都有一個唯一的區域ID。這個網格只會存儲在一個數據庫表中,該數據庫表中有一個區域id,然後可能是該區域四個角的長/緯度座標,對吧?有關如何輕鬆生成此表的任何建議?我知道我首先需要找出這個「扁平地球」的寬度和高度,以千米爲單位,計算區域的數量,然後以某種方式將長/拉特賦予每條垂直/水平線的交點;然而,這聽起來像很多手動工作。其次,一旦我創建了網格表,我需要設計一個fxn,它需要一個長/拉對,然後確定它所在的邏輯「區域」。我不知道如何去做這件事。

任何幫助,將不勝感激。

謝謝。

+0

你必須意識到的第一件事是球面上沒有像方形那樣的東西。 – 2009-11-01 20:14:07

回答

3

假定地球是一個半徑爲R = 6371 km的球體。

從(lat,long)=(0,0)deg開始。繞地球赤道,3公里相當於變化的

dlong = 3/(2 * pi * R) * 360 
     = 0.0269796482 degrees 

經度如果我們走在赤道附近,把一個標記每3公里,就會有他們的約(2 * pi * R)/3 = 13343.3912。 「關於」,因爲這是你決定如何處理額外的0.3912。從(0,0)起,我們步行3公里到(拉特,長)(0.0269796482,0)。我們將再次走上與地球平行於我們走過的第一條道路的路徑。因爲它離N極更近一點,這個圓的半徑比我們走的第一個圓的半徑要小一些。讓我們用小寫字母r代表這個半徑

r = R * cos(lat) 
    = 6371 * cos(0.0269796482) 
    = 6 368.68141 km 

我們再次使用較小的半徑計算dlong

dlong = 3/(2 * pi * r) * 360 
     = 0.0269894704 deg 

我們放下第二組標誌。這次他們有大約(2 * pi * r)/3 = 13 338.5352。之前有13343人,但現在有13338人。那是什麼?少了五個。

頂線中有五個角較少時,我們如何繪製正方形的條紋?事實上,當我們在地球周圍走動時,我們會發現我們的起點非常好,但區域的形狀被剪切成非常極端的平行四邊形。

我們需要一種不同的策略,給予我們相同數量的上下角。如果下邊界(SW-SE)長3公里,那麼頂端應該稍短一些,以製造梯形帶。

有許多方法可以制定出接近您理想的方形網格的折衷方案。 This wikipedia article關於保存度量屬性的地圖投影,鏈接到幾十個這樣的策略。

你的應用程序的細節可能會讓你大大簡化事情,特別是如果你不需要映射整個地球。

+0

這太好了。謝謝。會給我足夠的開始。 – cakeforcerberus 2009-11-02 03:16:52

+0

要記住的主要問題是E-W距離上的cos(緯度)調節。另見http://stackoverflow.com/questions/1624574/calculate-lat-lng-of-corners-of-ground-overlay-from-kml-file/1624732#1624732。 – 2009-11-02 12:02:44

1

你的確認識到,因爲地球是一個「3平方公里」的球體在極點附近的數量要比靠近赤道的球體的數量更多,對嗎?而在地圖的頂部和底部,您的網格廣場將實際上代表世界的餡餅形狀的部分,對吧?

我已經做了類似於我的數據庫的東西 - 我已經把它分成四個單元格。所以我所做的就是將地球分成四個季度(-180,-90) - (0,0),(-180,0) - (0,90)等等。當我將點實體添加到我的數據庫中時,如果「單元格」的數量超過了X條目,我將該單元格分割爲4個。這意味着在世界上有很多點實體的區域中,我有很多四元單元格,但在世界其他地方,我很少。

我對四叉樹數據庫的樣子:

\d areaids; 
       Table "public.areaids" 
    Column |   Type    | Modifiers 
--------------+-----------------------------+----------- 
areaid  | integer      | not null 
supercededon | timestamp without time zone | 
supercedes | integer      | 
numpoints | integer      | not null 
rectangle | geometry     | 
Indexes: 
    "areaids_pk" PRIMARY KEY, btree (areaid) 
    "areaids_rect_idx" gist (rectangle) 
Check constraints: 
    "enforce_dims_rectangle" CHECK (ndims(rectangle) = 2) 
    "enforce_geotype_rectangle" CHECK (geometrytype(rectangle) = 'POLYGON'::text OR rectangle IS NULL) 
    "enforce_srid_rectangle" CHECK (srid(rectangle) = 4326) 

我使用的PostGIS幫助尋找在細胞分。如果我看一個單元格,我可以判斷它是否被拆分,因爲supercededon不爲null。我可以通過尋找與其身份相同的代名詞來找到自己的孩子。而且我可以從上到下挖掘,直到找到覆蓋我關心的區域的那些區域,找到具有supercedeson null並且矩形與我感興趣區域重疊的區域(使用PostGIS'&'運算符)。

2

微軟一直在SQL Server 2008產品中投資空間數據類型。它可以幫助你在這裏。因爲它具有數據類型來表示您的展平地球區域,操作員可以確定一組座標是否位於幾何圖形內,等等。即使您選擇不使用它,也可以考慮查看以下鏈接。第二個特別有關於這個問題的很好的背景信息,以及關於空間數據的一些行業標準數據格式的討論。

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

http://jasonfollas.com/blog/archive/2008/03/14/sql-server-2008-spatial-data-part-1.aspx

1

首先,保羅是正確的。不幸的是,地球是圓的,這真的讓這件事變得複雜。

許多年前,我爲地形繪圖服務器創建了一個類似於此的網格。我只是記錄了每個區域左上角編碼器的座標。我也用UTM座標代替lat/long。如果您知道每個區域覆蓋3平方公里,並且由於UTM基於米,因此直接進行範圍查詢以發現正確的區域。

0

你不可能用矩形單元做到這一點,但我剛剛完成了一個R包dggridR,這將使得使用六角形網格的網格變得容易。但是,3公里的電池需求可能會產生太多的電池,導致您的機器過載。

您可以用R生成網格:

install.packages('devtools') 
install.packages('rgdal') 
library(devtools) 
devools.install_github('r-barnes/dggridR') 
library(dggridR) 
library(rgdal) 

#Construct a discrete global grid (geodesic) with cells of ~3 km^2 
dggs <- dgconstruct(area=100000, metric=FALSE, resround='nearest') 

#Get a hexagonal grid for the whole earth based on this dggs 
grid <- dgearthgrid(dggs,frame=FALSE) 

#Save the grid 
writeOGR(grid, "grid_3km_cells.kml", "cells", "KML") 

KML文件則包含了ID和每一個細胞的邊緣頂點座標。

網格看上去有點像這樣:

Discrete Global Grid

我的包是基於凱文·薩赫爾的DGGRID可以直接生成同樣的網格,以KML,但你需要弄清楚如何編譯它自己。