一下處理過(guò)程需要在python2.5與2.6之間切換
Pgsql8.3.5
postgis1.5
tilecache 2.10
geoserver2.0
openlayers
ext-js
django
1.
openlayer顯示地圖無(wú)法顯示正確的比例尺
在訪問(wèn)地圖時(shí)設(shè)置地圖顯示單位必須為 units:'degrees'
2. 圖層文字標(biāo)注出現(xiàn)亂碼和重復(fù)繪制多個(gè)相同名稱(chēng)
Sld設(shè)置的group=true似乎沒(méi)有起作用
layer = new OpenLayers.Layer.WMS( "FirstMap","http://localhost:8080/geoserver/wms",{},{singleTile: true, ratio: 1})
必須設(shè)置紅色部分的參數(shù),能保證文字不被重復(fù)顯示
但是在使用tilecache.py預(yù)緩沖圖塊時(shí)("http://localhost:9000/tilecache/tilecache.py"),添加了以上紅色參數(shù)之后導(dǎo)致無(wú)法顯示地圖。
SingleTile:true 參數(shù)是作為geoserver的附加屬性由openlayer傳遞到服務(wù)器,
所以考慮將此參數(shù)通過(guò)tilecache.cfg傳遞到geoserver是否能夠起到相同效果?
發(fā)現(xiàn)使用了signleTile之后,openlayers將不進(jìn)行塊的緩沖,而是每次請(qǐng)求都到geoserver上去獲取,抓包發(fā)現(xiàn)singleTile開(kāi)啟的話(huà),請(qǐng)求時(shí)將不傳遞width/height參數(shù),直接請(qǐng)求bbox大小的地理區(qū)域,每次移動(dòng)地圖將重新加載整個(gè)區(qū)域,效率低下;
但是關(guān)閉singleTile的話(huà),依次連續(xù)請(qǐng)求多個(gè)網(wǎng)格塊,默認(rèn)是256x256,導(dǎo)致有些圖層比如背景層1024×1024的話(huà)將請(qǐng)求4x4個(gè)網(wǎng)格塊,每個(gè)塊都將繪制背景的文本標(biāo)識(shí),因?yàn)檫@些塊是離散繪制的所以顯示在地圖上的話(huà)將是重復(fù)的文本顯示出來(lái)了,所以避免這個(gè)問(wèn)題只有如下解決:
1.
放大網(wǎng)格的大小規(guī)格,使一定的地理范圍盡可能的處在一個(gè)網(wǎng)格內(nèi)被繪制
目前這種方式似乎是最佳方式,tilecache 默認(rèn)tile規(guī)格是256*256,在繪制全國(guó)圖的時(shí)候設(shè)置1024*1024方式去請(qǐng)求geoserver,然后使用split_tile.py切割土塊即可。
2.
控制這些層的顯示屬性,限制只有在某些比例尺時(shí)被顯示
3.
手工編輯地圖數(shù)據(jù),合并多邊形對(duì)象,這樣就可以防止重復(fù)繪制多邊形的名稱(chēng)標(biāo)注,導(dǎo)致一個(gè)省份名稱(chēng)繪制多次
Tilecache為了支持apache訪問(wèn),必須安裝到python/lib/目錄下,并且tilecache.cfg也在這個(gè)安裝目錄下。
Tilecache.cfg修改之后必須重新啟動(dòng)apache服務(wù)
如果geoserver實(shí)時(shí)繪制的話(huà)允許同時(shí)傳遞多個(gè)層名稱(chēng)給geoserver進(jìn)行繪制
new
OpenLayers.Layer.WMS( "FirstMap",
"http://localhost:8080/geoserver/wms",
{ layers:’shanghai,china,…’})
如果tilecahce加載tile網(wǎng)格塊的話(huà),layers屬性不能傳遞多個(gè)圖層,因?yàn)槎鄠€(gè)圖層就是返回多個(gè)tile塊,只有在tilecache.cfg中配置多個(gè)layer名稱(chēng)
[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)化批量自動(dòng)化繪制地圖
1.
tilecache_seed.py提交layers給geoserver 時(shí),如果提交全國(guó)所有layers,geoserver將處理每個(gè)layer,即使layer與當(dāng)前可見(jiàn)地理區(qū)域不想交,但還是會(huì)被循環(huán)處理;所以必須改寫(xiě)tilecahe_seed.py程序,檢測(cè)只有相交的圖層傳送給geoserver渲染。
改寫(xiě)部分在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定義的層列表,所以只需要修改這個(gè)參數(shù)即可。
處理方式:
將tile.bbox()的地理區(qū)間與數(shù)據(jù)庫(kù)中的省市層最大mbr進(jìn)行相交測(cè)試,只有相交的才提交給geoserver進(jìn)行處理。
修改之后
測(cè)試:
將網(wǎng)格規(guī)格調(diào)整為256*256,繪制east_china圖層第7顯示級(jí)別,花銷(xiāo)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
注意以上紅色代碼,當(dāng)檢索不能匹配任何圖層時(shí),需要geoserver返回空白圖塊,self.layers必須設(shè)置一個(gè)數(shù)據(jù)庫(kù)中可用的圖層名稱(chēng),這個(gè)圖層只是為了繪制空白塊的,所以可以在postgis中創(chuàng)建一個(gè)point層即可或者一個(gè)空層,然后添加一個(gè)遠(yuǎn)離中國(guó)地理區(qū)域的一個(gè)點(diǎn)即可.
2.
顯示比例越小的時(shí)候,繪制地圖需要更多的時(shí)間,那是由于顯示的越大繪制的圖層就越多。
要使多臺(tái)機(jī)器同時(shí)分工繪制地圖的話(huà),
可以按層進(jìn)行分割處理和劃分經(jīng)緯度的方式進(jìn)行。前者適用與高比例尺的顯示,后者就是小比例尺的顯示。
小顯示比例時(shí),tilecache將圖層進(jìn)行網(wǎng)格化處理,由西至東,由下至上。所以提交給處理機(jī)器以不同的bbox即可,處理完成之后再將這些圖塊重新進(jìn)行編號(hào)即可。()
3.
在低縮放比的情況下放大tile的規(guī)格,默認(rèn)是256×256,將其設(shè)置為256×n大小,這樣可以提高每次請(qǐng)求的效率,之后再將圖塊切割為256×256大小的png圖塊。 這就要求geoserver的sld關(guān)閉
<vendor-group>true</vendor-group>開(kāi)關(guān)
測(cè)試:
將網(wǎng)格規(guī)格調(diào)整為1024*1024,繪制east_china圖層第7顯示級(jí)別,花銷(xiāo)30秒
將網(wǎng)格規(guī)格調(diào)整為256*256,繪制east_china圖層第7顯示級(jí)別,花銷(xiāo)200秒
圖像擴(kuò)大了16倍,時(shí)間縮短了6倍
大圖塊產(chǎn)生之后切割為小圖塊,需要重新索引文件編號(hào)。
設(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ù)存儲(chǔ)方式:
圖塊數(shù)據(jù)繪制時(shí)按照經(jīng)度從西到東,維度從南到北的順序依次繪制出網(wǎng)格圖塊。
每一列的圖塊都創(chuàng)建出一個(gè)目錄,從下標(biāo)0開(kāi)始。
繪制方式:
For(x=0;x<columns;x++){
For(y=0;y<rows;y++){
Draw_tile()
}
}
層名稱(chēng)/縮放級(jí)別/000/000/列編號(hào)/000/000/行圖塊文件.png
Tilecache的數(shù)據(jù)存儲(chǔ)目錄在刪除時(shí)必須注意停止apache服務(wù)
Apache提供tile服務(wù)時(shí)將自動(dòng)使用python2.6下的tilecache代碼
操作數(shù)據(jù)庫(kù)是采用的是pgpostgresql,目前只支持python2.5,所以必須先注視掉c:/python2.6, 打開(kāi)c:/python2.5