對Apache Server Status的啟用
對Apache的狀態管理的模塊是LoadModule status_module modules/mod_status.so,所以這個需要有,然后打開下面的配置
ExtendedStatus On
配置Apache Server Status的權限
<location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</location>
打開查看的話就使用http:// your.server.name/server-status來訪問,注意VH的apache要設置在一個VH中,不然你分不清是那個地址來查看看這個信息.但ExtendedStatus不能放在VH中.
一下處理過程需要在python2.5與2.6之間切換
Pgsql
postgis1.5
tilecache 2.10
geoserver2.0
openlayers
ext-js
django
1. openlayer顯示地圖無法顯示正確的比例尺
在訪問地圖時設置地圖顯示單位必須為 units:'degrees'
Sld設置的group=true似乎沒有起作用
layer = new OpenLayers.Layer.WMS( "FirstMap","http://localhost:8080/geoserver/wms",{},{singleTile: true, ratio: 1})
必須設置紅色部分的參數,能保證文字不被重復顯示
但是在使用tilecache.py預緩沖圖塊時("http://localhost:9000/tilecache/tilecache.py"),添加了以上紅色參數之后導致無法顯示地圖。
SingleTile:true 參數是作為geoserver的附加屬性由openlayer傳遞到服務器,
所以考慮將此參數通過tilecache.cfg傳遞到geoserver是否能夠起到相同效果?
發現使用了signleTile之后,openlayers將不進行塊的緩沖,而是每次請求都到geoserver上去獲取,抓包發現singleTile開啟的話,請求時將不傳遞width/height參數,直接請求bbox大小的地理區域,每次移動地圖將重新加載整個區域,效率低下;
但是關閉singleTile的話,依次連續請求多個網格塊,默認是256x256,導致有些圖層比如背景層1024×1024的話將請求4x4個網格塊,每個塊都將繪制背景的文本標識,因為這些塊是離散繪制的所以顯示在地圖上的話將是重復的文本顯示出來了,所以避免這個問題只有如下解決:
1. 放大網格的大小規格,使一定的地理范圍盡可能的處在一個網格內被繪制
目前這種方式似乎是最佳方式,tilecache 默認tile規格是256*256,在繪制全國圖的時候設置1024*1024方式去請求geoserver,然后使用split_tile.py切割土塊即可。
2. 控制這些層的顯示屬性,限制只有在某些比例尺時被顯示
3. 手工編輯地圖數據,合并多邊形對象,這樣就可以防止重復繪制多邊形的名稱標注,導致一個省份名稱繪制多次
Tilecache.cfg修改之后必須重新啟動apache服務
如果geoserver實時繪制的話允許同時傳遞多個層名稱給geoserver進行繪制
new OpenLayers.Layer.WMS( "FirstMap",
"http://localhost:8080/geoserver/wms",
{ layers:’shanghai,china,…’})
如果tilecahce加載tile網格塊的話,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
1. tilecache_seed.py提交layers給geoserver 時,如果提交全國所有layers,geoserver將處理每個layer,即使layer與當前可見地理區域不想交,但還是會被循環處理;所以必須改寫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參數就是tilecache.cfg中參數layers定義的層列表,所以只需要修改這個參數即可。
處理方式: 將tile.bbox()的地理區間與數據庫中的省市層最大mbr進行相交測試,只有相交的才提交給geoserver進行處理。
修改之后
測試:
將網格規格調整為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必須設置一個數據庫中可用的圖層名稱,這個圖層只是為了繪制空白塊的,所以可以在postgis中創建一個point層即可或者一個空層,然后添加一個遠離中國地理區域的一個點即可.
要使多臺機器同時分工繪制地圖的話, 可以按層進行分割處理和劃分經緯度的方式進行。前者適用與高比例尺的顯示,后者就是小比例尺的顯示。
小顯示比例時,tilecache將圖層進行網格化處理,由西至東,由下至上。所以提交給處理機器以不同的bbox即可,處理完成之后再將這些圖塊重新進行編號即可。()
3. 在低縮放比的情況下放大tile的規格,默認是256×256,將其設置為256×n大小,這樣可以提高每次請求的效率,之后再將圖塊切割為256×256大小的png圖塊。 這就要求geoserver的sld關閉 <vendor-group>true</vendor-group>開關
測試:
將網格規格調整為1024*1024,繪制east_china圖層第7顯示級別,花銷30秒
將網格規格調整為256*256,繪制east_china圖層第7顯示級別,花銷200秒
圖像擴大了16倍,時間縮短了6倍
大圖塊產生之后切割為小圖塊,需要重新索引文件編號。
設A規格圖塊和B規格圖塊(A*4=B),如果A繪制需要產生400列(0-399),400行(0-399),那B只需要產生100列100行。
圖塊數據繪制時按照經度從西到東,維度從南到北的順序依次繪制出網格圖塊。
每一列的圖塊都創建出一個目錄,從下標0開始。
繪制方式:
For(x=0;x<columns;x++){
For(y=0;y<rows;y++){
Draw_tile()
}
}
層名稱/縮放級別/000/000/列編號/000/000/行圖塊文件.png
Apache提供tile服務時將自動使用python2.6下的tilecache代碼
操作數據庫是采用的是pgpostgresql,目前只支持python2.5,所以必須先注視掉c:/python2.6, 打開c:/python2.5