2015-10-20 16 views
0

我正在使用地圖服務,如果地理圓(由座標和半徑定義)返回該地區的一組地點。我希望緩存由此地圖服務返回的結果。如何實現地理點的高速緩存

我希望我的緩存來存儲兩個表:

  • 一個表的地方服務返回的地方
  • 一張表圈子已將他們的位置緩存在表格中的區域地方

然後,給出一個任意新圈子Ç,我要有效地測試高速緩存中是否ç的區域被圈在表完全覆蓋。如果C完全覆蓋,我有緩存命中,我不需要諮詢地圖服務。如果C沒有完全覆蓋,我必須諮詢地圖服務並緩存結果。

Q1:我該如何存儲一組地理圈,以便我可以高效地測試其區域的聯合是否完全覆蓋任意的新圈?

即使有Q1的解決方案,我可能會遇到性能問題,其中緩存缺失非常輕微,並且我向地圖服務發出請求,但幾乎沒有添加到我的緩存區域。爲了解決這個問題,我希望能夠在C中找到一個不包含在圓圈中的示例點,以便將其用作地圖服務請求的中心。我會重複這個過程,直到C完全被覆蓋。

Q2:如何可以存儲該組地理圓的,使得,與在事件他們的面積並不完全覆蓋給定圓Ç,我能夠有效地生成一個例子在Ç點這不包括在內?

我希望PostgreSQL和PostGIS一起使用,來實現我的緩存,但是我歡迎其他的建議。

+0

你真的想緩存嗎?索引不夠(http://www.postgresql.org/docs/9.4/static/xindex.html#XINDEX-ORDERING-OPS)? –

+0

@ЕгорРогов或許我還不清楚:我的PostGIS數據庫是來自外部地圖服務的結果緩存。我不需要對我的數據庫進行查詢緩存。 – jameshfisher

回答

1

這是我的hacky方法,基本上是「光柵化」。

將地球區域劃分成大量但有限數量的小地理區塊,這些小區域通過在緯度/經度平面上繪製網格來定義。

而不是一個表,我們不斷的瓷磚其曾在地方表緩存自己的位置的表。

給定一個地理圓,我們可以高效地生成一部分由圓圈覆蓋的地理塊集合,以及由圓圈完全覆蓋的集合。

將點插入緩存時,我們將每個完全覆蓋的圖塊標記爲緩存。

當探測緩存圓Ç,如果每個瓦片全自動或通過Ç部分覆蓋在瓷磚表,我們有一個高速緩存命中。否則,我們有一個緩存未命中,以及一個未緩存的示例圖塊,我們可以從中選擇一個點作爲要從地圖服務請求的圓的中心。

這種方法具有缺陷:

  • 瓷磚在地球上的大小和形狀有所不同,因爲投影失真。
  • 如果一個圓圈太小,它可能不會完全覆蓋任何圖塊,因此永遠不會被標記爲已緩存。