一下處理過程需要在python2.5與2.6之間切換
Pgsql8.3.5
postgis1.5
tilecache 2.10
geoserver2.0
openlayers
ext-js
django
1.
openlayer顯示地圖無法顯示正確的比例尺
在訪問地圖時設(shè)置地圖顯示單位必須為 units:'degrees'
2. 圖層文字標注出現(xiàn)亂碼和重復(fù)繪制多個相同名稱
Sld設(shè)置的group=true似乎沒有起作用
layer = new OpenLayers.Layer.WMS( "FirstMap","http://localhost:8080/geoserver/wms",{},{singleTile: true, ratio: 1})
必須設(shè)置紅色部分的參數(shù),能保證文字不被重復(fù)顯示
但是在使用tilecache.py預(yù)緩沖圖塊時("http://localhost:9000/tilecache/tilecache.py"),添加了以上紅色參數(shù)之后導(dǎo)致無法顯示地圖。
SingleTile:true 參數(shù)是作為geoserver的附加屬性由openlayer傳遞到服務(wù)器,
所以考慮將此參數(shù)通過tilecache.cfg傳遞到geoserver是否能夠起到相同效果?
發(fā)現(xiàn)使用了signleTile之后,openlayers將不進行塊的緩沖,而是每次請求都到geoserver上去獲取,抓包發(fā)現(xiàn)singleTile開啟的話,請求時將不傳遞width/height參數(shù),直接請求bbox大小的地理區(qū)域,每次移動地圖將重新加載整個區(qū)域,效率低下;
但是關(guān)閉singleTile的話,依次連續(xù)請求多個網(wǎng)格塊,默認是256x256,導(dǎo)致有些圖層比如背景層1024×1024的話將請求4x4個網(wǎng)格塊,每個塊都將繪制背景的文本標識,因為這些塊是離散繪制的所以顯示在地圖上的話將是重復(fù)的文本顯示出來了,所以避免這個問題只有如下解決:
1.
放大網(wǎng)格的大小規(guī)格,使一定的地理范圍盡可能的處在一個網(wǎng)格內(nèi)被繪制
目前這種方式似乎是最佳方式,tilecache 默認tile規(guī)格是256*256,在繪制全國圖的時候設(shè)置1024*1024方式去請求geoserver,然后使用split_tile.py切割土塊即可。
2.
控制這些層的顯示屬性,限制只有在某些比例尺時被顯示
3.
手工編輯地圖數(shù)據(jù),合并多邊形對象,這樣就可以防止重復(fù)繪制多邊形的名稱標注,導(dǎo)致一個省份名稱繪制多次
Tilecache為了支持apache訪問,必須安裝到python/lib/目錄下,并且tilecache.cfg也在這個安裝目錄下。
Tilecache.cfg修改之后必須重新啟動apache服務(wù)
如果geoserver實時繪制的話允許同時傳遞多個層名稱給geoserver進行繪制
new
OpenLayers.Layer.WMS( "FirstMap",
"http://localhost:8080/geoserver/wms",
{ layers:’shanghai,china,…’})
如果tilecahce加載tile網(wǎng)格塊的話,layers屬性不能傳遞多個圖層,因為多個圖層就是返回多個tile塊,只有在tilecache.cfg中配置多個layer名稱
[east_china]
type=WMSLayer
url=http://localhost:8080/geoserver/wms
layers=shanghai,jiangshu,zejiang
extension=png
resolutions=0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101,0.0006,0.0003,0.00015,0.000075,0.000035,0.000018,0.000009,0.0000045
bbox=70,10,130,60
優(yōu)化批量自動化繪制地圖
1.
tilecache_seed.py提交layers給geoserver 時,如果提交全國所有layers,geoserver將處理每個layer,即使layer與當前可見地理區(qū)域不想交,但還是會被循環(huán)處理;所以必須改寫tilecahe_seed.py程序,檢測只有相交的圖層傳送給geoserver渲染。
改寫部分在TileCache/Layers/WMS.py中,
def
renderTile(self, tile):
wms = WMSClient.WMS( self.url, {
"bbox": tile.bbox(),
"width": tile.size()[0],
"height": tile.size()[1],
"srs": self.srs,
"format": self.mime_type,
"layers": self.layers,
}, self.user, self.password)
tile.data, response = wms.fetch()
return tile.data
self.layers參數(shù)就是tilecache.cfg中參數(shù)layers定義的層列表,所以只需要修改這個參數(shù)即可。
處理方式:
將tile.bbox()的地理區(qū)間與數(shù)據(jù)庫中的省市層最大mbr進行相交測試,只有相交的才提交給geoserver進行處理。
修改之后
測試:
將網(wǎng)格規(guī)格調(diào)整為256*256,繪制east_china圖層第7顯示級別,花銷48秒
修改代碼如下:
def
isIntersect(self,rc1,rc2):
if rc1[2] < rc2[0] or rc1[3] < rc2[1]
or rc1[0] > rc2[2] or rc1[1] > rc2[3]:
return False
return True
def renderTile(self, tile):
import sys,string
sys.path.append('c:/')
import cities_mbr
layers = self.layers.split(',')
newLayers=[]
for layer in layers:
rc = cities_mbr.G_CITIES_MBR[layer]
rc2 = tile.bbox().split(',')
rc2 = map(float,rc2)
if self.isIntersect(rc,rc2):
newLayers.append(layer)
layers = string.join(map(str,newLayers),',')
if len(newLayers) == 0: #no any
insercted layer
layers='china:china_blank_layer' #here i select shanghai as empty city to
fill
print layers
wms = WMSClient.WMS( self.url, {
"bbox": tile.bbox(),
"width": tile.size()[0],
"height": tile.size()[1],
"srs": self.srs,
"format": self.mime_type,
#"layers": self.layers,
"layers": layers,
}, self.user, self.password)
print 'x*'*20
print self.url,tile.bbox(),layers
#import sys
#sys.exit(0);
tile.data, response = wms.fetch()
return tile.data
注意以上紅色代碼,當檢索不能匹配任何圖層時,需要geoserver返回空白圖塊,self.layers必須設(shè)置一個數(shù)據(jù)庫中可用的圖層名稱,這個圖層只是為了繪制空白塊的,所以可以在postgis中創(chuàng)建一個point層即可或者一個空層,然后添加一個遠離中國地理區(qū)域的一個點即可.
2.
顯示比例越小的時候,繪制地圖需要更多的時間,那是由于顯示的越大繪制的圖層就越多。
要使多臺機器同時分工繪制地圖的話,
可以按層進行分割處理和劃分經(jīng)緯度的方式進行。前者適用與高比例尺的顯示,后者就是小比例尺的顯示。
小顯示比例時,tilecache將圖層進行網(wǎng)格化處理,由西至東,由下至上。所以提交給處理機器以不同的bbox即可,處理完成之后再將這些圖塊重新進行編號即可。()
3.
在低縮放比的情況下放大tile的規(guī)格,默認是256×256,將其設(shè)置為256×n大小,這樣可以提高每次請求的效率,之后再將圖塊切割為256×256大小的png圖塊。 這就要求geoserver的sld關(guān)閉
<vendor-group>true</vendor-group>開關(guān)
測試:
將網(wǎng)格規(guī)格調(diào)整為1024*1024,繪制east_china圖層第7顯示級別,花銷30秒
將網(wǎng)格規(guī)格調(diào)整為256*256,繪制east_china圖層第7顯示級別,花銷200秒
圖像擴大了16倍,時間縮短了6倍
大圖塊產(chǎn)生之后切割為小圖塊,需要重新索引文件編號。
設(shè)A規(guī)格圖塊和B規(guī)格圖塊(A*4=B),如果A繪制需要產(chǎn)生400列(0-399),400行(0-399),那B只需要產(chǎn)生100列100行。
Tilecache預(yù)處理數(shù)據(jù)存儲方式:
圖塊數(shù)據(jù)繪制時按照經(jīng)度從西到東,維度從南到北的順序依次繪制出網(wǎng)格圖塊。
每一列的圖塊都創(chuàng)建出一個目錄,從下標0開始。
繪制方式:
For(x=0;x<columns;x++){
For(y=0;y<rows;y++){
Draw_tile()
}
}
層名稱/縮放級別/000/000/列編號/000/000/行圖塊文件.png
Tilecache的數(shù)據(jù)存儲目錄在刪除時必須注意停止apache服務(wù)
Apache提供tile服務(wù)時將自動使用python2.6下的tilecache代碼
操作數(shù)據(jù)庫是采用的是pgpostgresql,目前只支持python2.5,所以必須先注視掉c:/python2.6, 打開c:/python2.5