#
apache gzip 配置 2009-08-31 10:38:15 標(biāo)簽:apache 配置 gzip 版權(quán)聲明:原創(chuàng)作品,謝絕轉(zhuǎn)載!否則將追究法律責(zé)任。 1、conf/httpd.conf 1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注釋#, 2) 添加LoadModule deflate_module modules/mod_deflate.so, 3) 去掉#Include conf/extra/httpd-vhosts.conf前面的注釋#。 2、conf/extra/httpd-vhosts.conf 在VirtualHost中添加 <Location "/"> SetOutputFilter DEFLATE BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary Header append Vary User-Agent env=!dont-vary </Location> 例如: <VirtualHost *:80> DocumentRoot "D:/Apache2.2/htdocs/wef" <Location "/"> SetOutputFilter DEFLATE BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary Header append Vary User-Agent env=!dont-vary </Location> </VirtualHost> 注:我使用的apache版本為2.2.13。
編輯qt.conf 添加如下信息 [Paths] Pluggins=plugins 拷貝qt/bin/plugins到當(dāng)前目錄
1.static方法可以不要參數(shù),和C/C++,java里面的靜態(tài)函數(shù)相似 2.普通對(duì)象函數(shù)至少需要一個(gè)self參數(shù),該參數(shù)命名可以是‘self’,也可以是其他。代表類實(shí)例對(duì)象 3.class方法至少需要一個(gè)cls參數(shù),該參數(shù)命名可以是‘cls’,也可以是其他。代表類對(duì)象
找了臺(tái)快速的公網(wǎng)機(jī)器來(lái)做 演示(網(wǎng)通線路訪問(wèn)還是很慢): http://wallizard.vicp.net/maps/test/test_map.html http://wallizard.vicp.net:8080/
提供ftp下載 swmap.demo.2010.11.20.7zftp://122.227.135.172:8502 user: mapdown passwd: mapdown demo包含c/s,b/s功能和全國(guó)地圖數(shù)據(jù),共170M左右,可以直接架設(shè)起一臺(tái)wms地圖服務(wù)器
swMap提供基礎(chǔ)的Gis發(fā)布功能,目前swMap提供c/s,b/s兩種服務(wù)功能,b/s也就是webgis,
apache+openlayers+swGisServer服務(wù)器構(gòu)成了webgis的地圖支持體系。
c/s模式現(xiàn)僅提供基于Qt的C++開(kāi)發(fā)接口,c/s模式可以是本地渲染地圖(可用于單機(jī)導(dǎo)航,支持win32,wince,linux),也可以rpc方式訪問(wèn)地圖服務(wù)器,之間采用特殊的通信協(xié)議。 演示: http://wallizard.vicp.net/maps/test/test_map.html 這是adsl主機(jī),上行出口比較窄,所以顯示地圖會(huì)慢很多
Demo下載:http://wallizard.vicp.net/maps/swmap.demo.2010.11.20.7z demo包含c/s,b/s功能和全國(guó)地圖數(shù)據(jù),共170M左右,可以直接架設(shè)起一臺(tái)wms地圖服務(wù)器
系統(tǒng)結(jié)構(gòu):

1. c/s 配置: 1.1 單機(jī)模式: a.) 修改swBox/swbox.xml參數(shù) EnableTileCache = false cachethreads = 3 asyncRender = true b.) 運(yùn)行swBox/swbox.exe 1.2 Rpc模式(地圖與客戶應(yīng)用分離) a.) 修改swbox.xml參數(shù) EnableTileCache = true cachethreads = 3 asyncRender = true 增加<tileservers/>的子條目 <server>TileServer:tcp -h localhost -p 5000</server> -h 地圖服務(wù)器主機(jī)地址 ; -p 服務(wù)端口。根據(jù)實(shí)際情況可以配置多個(gè)TileServer來(lái)提高并發(fā)能力 b.)修改Tileserver.xml realRender = true 確保 scales與 swbox.xml的scales保持一致,中間以空格區(qū)分 c.)運(yùn)行TileServer.exe -rpcservice localhost:5000 可以并行啟動(dòng)多個(gè)TileServer,同一臺(tái)主機(jī)以端口號(hào)區(qū)分 d.)運(yùn)行 swbox.exe 2.b/s 配置 2.1 解壓apache2.2.pack_maps.rar到c:\apache2.2.pack 2.2 安裝apache2.2 執(zhí)行C:\apache2.2.pack\http-install.bat 執(zhí)行C:\apache2.2.pack\http-start.bat 2.3 安裝GisServer 編輯tileservers.txt ,增加服務(wù)器信息,例如: localhost:5000,localhost:5001 執(zhí)行wms_start.bat ,服務(wù)器默認(rèn)啟動(dòng)在8000端口開(kāi)始偵聽(tīng) 2.4 運(yùn)行 TileServer.exe -rpcservice localhost:5000 為提高并發(fā)能力多啟動(dòng)幾個(gè)Tileserver,并添加到swGisServer的tileservers.txt文件內(nèi) swGisServer和TileServer都可以以n x n的方式配置來(lái)提高整體 系統(tǒng)的吞吐能力 2.5 修改 c:/apache2.2.pack/web-root/test/test_map.html內(nèi)的wms服務(wù)器的指向,將http://wallizard.vicp.net:8000/wms替換成GisServer運(yùn)行主機(jī)的地址和端口 打開(kāi)瀏覽器訪問(wèn)http://localhost:9000/test/test_map.html 3.塊緩存 塊緩存技術(shù)就是預(yù)先將全國(guó)的地理區(qū)域劃分成網(wǎng)格按縮放級(jí)別繪制并存儲(chǔ)起來(lái),待請(qǐng)求到達(dá)時(shí)直接讀取圖塊并返回(wms,Rpc). 當(dāng)然這種是最高效的方法 ,但往往時(shí)間和空間是相背的,緩存的話雖然能降低對(duì)機(jī)器的性能要求,但會(huì)大大占用存儲(chǔ)空間。 緩存技術(shù)可以用低配置高帶寬的主機(jī)提供集群的地圖服務(wù)。 Tileserver/spliteTiles.py 產(chǎn)生網(wǎng)格緩沖任務(wù),Tileserver.exe -mapcreate 可以進(jìn)行地圖網(wǎng)格預(yù)存的工作 4.風(fēng)格定制: swMap地圖當(dāng)配置成實(shí)時(shí)模式(非緩存)時(shí),修改mapsld.xml就可以立刻生效繪制效果,但是要重新啟動(dòng) tileserver服務(wù)進(jìn)程 。 <win7下的微軟雅黑字體顯示效果頗佳> 5.運(yùn)行環(huán)境: windows xp,2003,win7 安裝vc運(yùn)行環(huán)境包 vcredist_x86.exe win7環(huán)境下微軟雅黑字體 vistaFont_CHS.exe 全國(guó)地圖數(shù)據(jù)
bbox 計(jì)算中心點(diǎn) size 組合bbox計(jì)算顯示精度,根據(jù)經(jīng)度計(jì)算網(wǎng)格編號(hào) x,y和縮放級(jí)別 有了這些參數(shù)通過(guò)TileServer(Rpc)請(qǐng)求網(wǎng)格圖塊 TileServer可以配置成網(wǎng)格文件讀取或者是RealRender實(shí)時(shí)繪制 TileServer判斷bbox如果跨越兩個(gè)網(wǎng)格,且不是實(shí)時(shí)繪制的話,必須完成兩個(gè)網(wǎng)格圖像的拼接,這樣便能實(shí)現(xiàn)openlayers的resolution不一定要求跟后端一樣的,當(dāng)然TileServer在產(chǎn)生網(wǎng)格時(shí)還是需要去尋找一個(gè)最接近的縮放級(jí)別(實(shí)時(shí)繪制沒(méi)有這個(gè)操作)
1 ################################# 2 # swMap Test 3 # scott 4 # 2010.11.19 5 # wallizard.vicp.net sw2us.com 6 ################################# 7 #simplest http server 8 # expose image 9 # 10 11 import BaseHTTPServer,SocketServer,SimpleHTTPServer 12 import time,sys,os,os.path 13 14 15 class MyThreadServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass 16 17 ''' 18 HTTP/1.1 200 OK 19 Cache-Control: private, max-age=30 20 Content-Type: text/html; charset=utf-8 21 Content-Encoding: gzip 22 Expires: Mon, 25 May 2009 03:20:33 GMT 23 Last-Modified: Mon, 25 May 2009 03:20:03 GMT 24 Vary: Accept-Encoding 25 Server: Microsoft-IIS/7.0 26 X-AspNet-Version: 2.0.50727 27 X-Powered-By: ASP.NET 28 Date: Mon, 25 May 2009 03:20:02 GMT 29 Content-Length: 12173 30 ''' 31 ''' 32 Pragma:no-cache 33 Cache-Control:no-cache 34 ''' 35 36 class MyHander(SimpleHTTPServer.SimpleHTTPRequestHandler): 37 def __init__(self,request, client_address, server): 38 SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self,request, client_address, server) 39 40 def do_GET(self): 41 print self.headers 42 43 f= open('d:/nono.gif','rb') 44 image = f.read() 45 f.close() 46 47 self.send_response(200) 48 self.send_header( 'Server','swMapServer') 49 now = self.date_time_string(time.time()) 50 self.send_header('Date',now) 51 self.send_header('Content-Type','image/gif') 52 self.send_header('Content-Length',len(image)) 53 self.end_headers() 54 55 self.wfile.write(image) 56 57 def run(server_class=MyThreadServer,handler_class=MyHander): 58 server_address = ('', 8000) 59 httpd = server_class(server_address, handler_class) 60 print 'serve on ',server_address 61 httpd.serve_forever() 62 63 64 run()
TileCache從去年開(kāi)始使用已經(jīng)有一段時(shí)間了,之前是為了配合GeoServer來(lái)產(chǎn)生緩存網(wǎng)格塊,之后在3-8月份處于停滯狀態(tài),到9月份身體開(kāi)始恢復(fù)就重新啟動(dòng)swMap工程,徹底拋棄了GeoServer(效率和安裝運(yùn)行環(huán)境不能滿足要求)。在使用geoServer期間,采用Tilecache產(chǎn)生了千萬(wàn)的tile圖塊,默認(rèn)是存放在文件系統(tǒng),產(chǎn)生的Tile在備份遷移的時(shí)候令我寒心,那么多的文件拷貝每次都要耗費(fèi)4,5個(gè)小時(shí),考慮到這種情況,我自己編寫(xiě)了TileCache的Store Backend,將Tilecache產(chǎn)生的Tile存儲(chǔ)進(jìn)PostGresDB,這樣我只要備份DB就可以了。 隨即而來(lái)的是放棄Geoserver,自己重新開(kāi)發(fā)地圖渲染服務(wù)器,使用了QT令我效果滿意,那再使用那一套GeoServer的東西就不合時(shí)宜了,TileCache也是需要綁定Apache+mod_python才能工作,簡(jiǎn)直太累最了,配置個(gè)環(huán)境還是不太容易,想想自己只是想提供一個(gè)WMS的服務(wù)罷了何必那么麻煩呢。 地圖服務(wù)器也有了,產(chǎn)生CacheTiles也開(kāi)發(fā)了自動(dòng)化的工具,將全國(guó)不同顯示比例的圖塊按256x256規(guī)格分別放入多個(gè)文件,這樣備份起來(lái)就快速多了。 之前看過(guò)TileCache的代碼,那時(shí)候只是為了編寫(xiě)一個(gè)新的Cache Store backend,現(xiàn)在重新回過(guò)頭來(lái),我決定拋棄apache,語(yǔ)言還是用python,之前做一個(gè)酒店廣告投放系統(tǒng)時(shí)開(kāi)發(fā)過(guò)一個(gè)Http代理服務(wù)器,所以輕車(chē)熟路了,保留其Http服務(wù)功能,加上TileCache的WMS服務(wù)代碼,一個(gè)swMap的WMS 服務(wù)器就可以誕生了。 端詳了一會(huì)兒TileCache,發(fā)現(xiàn)是多么的簡(jiǎn)單,幾乎不用多修改什么地方就可以完成。 由于我的swMap服務(wù)程序提供了預(yù)先緩存和實(shí)時(shí)繪制地圖的功能,所以通過(guò)Http可以以兩種模式進(jìn)行,當(dāng)然實(shí)時(shí)模式是用于調(diào)試地圖層SLD時(shí)派上大用場(chǎng)。 實(shí)時(shí)繪制的時(shí)候我的WMS服務(wù)器通過(guò)Ice連接到swMap服務(wù)器,當(dāng)緩存訪問(wèn)時(shí)我的WMS服務(wù)器直接從本地Tile文件中讀取,那時(shí)多么舒服的事情哪!
1. 修改httpserver+tilecache,使 swMap具有WMS功能,支持openlayers訪問(wèn) 2. 繼續(xù)增加swBox功能,諸如: 測(cè)距、圍欄、自定義用戶興趣點(diǎn)、面積計(jì)算 3. 緩沖全國(guó)圖tile到緩存文件,最低比例1:2000,由于是全國(guó)性的預(yù)先繪制工作,會(huì)消耗很大的磁盤(pán)空間和處理時(shí)間,估計(jì)3臺(tái)4核的PC連續(xù)1個(gè)星期工作時(shí)間 4. 開(kāi)發(fā)基于swBox的基本應(yīng)用,增加POI搜尋和MapGrab功能(用戶可以指定地理范圍產(chǎn)生指定顯示精度的大幅圖像,比如可以抓取1:4000的整個(gè)上海城區(qū)圖到一個(gè)jpg文件) 5. 增加矢量運(yùn)算操作進(jìn)行道路匹配 6. 增加GPS簡(jiǎn)易的定位功能,多個(gè)移動(dòng)對(duì)象之間的位置拓?fù)潢P(guān)機(jī)的操作,支持軌跡回放和導(dǎo)出功能 7. swBox增加Wince版本
GIS中的計(jì)算幾何
GIS是一個(gè)圖形系統(tǒng),必然會(huì)涉及到幾何學(xué)的理論應(yīng)用,比如,圖形可視化,空間拓?fù)浞治觯珿IS圖形編輯等都需要用到幾何
。向量幾何是用代數(shù)的方法來(lái)研究幾何問(wèn)題,首先,請(qǐng)大家翻一翻高等數(shù)學(xué)里有關(guān)向量的章節(jié),熟悉一下幾個(gè)重要的概念:
向量、向量的模、向量的坐標(biāo)表示、向量的加減運(yùn)算、向量的點(diǎn)積、向量的叉積,以及這些概念的幾何意義...下面我們將用
這些基本概念來(lái)解答GIS中一些幾何問(wèn)題。 1 點(diǎn)和線的關(guān)系
點(diǎn)是否在線段上,這樣的判斷在圖形編輯,拓?fù)渑袛?比如,GPS跟蹤點(diǎn)是否跑在線上)需要用到這樣的判斷。通常的
想法是:先求線段的直線方程,再判斷點(diǎn)是否符合這條直線方程,如果符合,還要判斷點(diǎn)是否在線段所在的矩形區(qū)域(MBR)內(nèi)
,以排除延長(zhǎng)線上的可能性,如果不符合,則點(diǎn)不在線段上。這種思路是可行的,但效率不高,涉及到建立方程,解方程。
借助向量的叉積(也叫向量的向量積,結(jié)果還是向量,有方向的)可以很容易的判斷。設(shè)向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb)
向量叉積a X b如下:
二維向量叉積的模 |a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb| (α是向量a,b之間的夾角),向量叉積模的幾何意義是以向量a,b
為鄰邊的平行四邊形的面積。可以推測(cè):如果兩向量共線,向量叉積模(所代表的
平行四邊形的面積) 為零 則 |a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb|=0,否則不共線,叉積的模為非零,根據(jù)這樣條件可以很輕松的判斷點(diǎn)和線的關(guān)系,避
免了建立方程和解方程的麻煩。
向量叉積的模|AB X AC|=0即可判斷C點(diǎn)在AB所確定的直線上,再結(jié)合C點(diǎn)是否在AB所在的MBR范圍內(nèi),就可以最終確
定C是否在AB線段上。關(guān)于點(diǎn)和線段的其他關(guān)系,都可以通過(guò)叉積的求得,比如 判斷點(diǎn)在線的哪一側(cè),右手法則,可以通過(guò)a
X b= (Xa*Yb-Ya*Xb)*k中的(Xa*Yb-Ya*Xb)正負(fù)來(lái)判斷。留給大家思考,很簡(jiǎn)單的,呵呵… 2 線和線的關(guān)系 判斷兩條線段是否相交,在很多拓?fù)渑袛嗪蛨D形編輯 (比如,線的打斷來(lái)構(gòu)建拓?fù)洌庉嬀€對(duì)象,疊置分析,面與
面關(guān)系的判斷等) 中都需要用到線線相交的判斷,如果兩條線段相交,一條線段的兩端點(diǎn)必然位于另一條線段的兩側(cè)(不考
慮退化情況,也就是一條線段的端點(diǎn)在另一條線段上,這個(gè)很容易判斷)
兩向量的叉積a X b= (Xa*Yb-Ya*Xb)*k ,分別判斷AB X AC的方向與AB X AD的方向是否異號(hào),再判斷CD X CA 的方向與CD X
CB的方向是否異號(hào),即可判斷兩線段是否相交。
退化情況,即一條線的端點(diǎn)落在另一條線上。運(yùn)用”點(diǎn)是否在線段上”的方法來(lái)判定。詳細(xì)區(qū)分留給大家思考。呵呵… 利用向量的方向還可以判斷線段的轉(zhuǎn)向,這個(gè)在道路導(dǎo)航中有所應(yīng)用: 3 點(diǎn)和面的關(guān)系
在各種拓?fù)渑袛嘀校ū热纾鎸?duì)象的選取,包含關(guān)系的判斷等)需要判斷一個(gè)點(diǎn)是否位于某個(gè)面內(nèi),經(jīng)典的方法就是“垂線法
”,在直角坐標(biāo)系中,從這個(gè)點(diǎn)向X軸作射線,判斷射線與多邊形的交點(diǎn)個(gè)數(shù)(不考慮退化情況,退化情況下,判斷點(diǎn)或者射
線與多邊形端點(diǎn)或者邊的關(guān)系),如果為奇數(shù),則點(diǎn)在面內(nèi),為偶數(shù),則點(diǎn)在面外。 4 線和面的關(guān)系
線面關(guān)系的判斷相對(duì)比較復(fù)雜,線在面內(nèi),線和面相交,相離,相接等關(guān)系。線段在面內(nèi),第一個(gè)必要條件是,線段的兩個(gè)
端點(diǎn)都要在內(nèi)。但由于多邊形可能為凹,所以這不能成為判斷的充分條件,于是有第二個(gè)必要條件線段與多邊形的邊,沒(méi)有
內(nèi)部交點(diǎn)。
線段和多邊形交于線段的兩端點(diǎn)并不會(huì)影響線段是否在多邊形內(nèi);但是如果多邊形的某個(gè)頂點(diǎn)和線段相交,還必須
判斷兩相鄰交點(diǎn)之間的線段是否包含于多邊形內(nèi)部,如果在面內(nèi),則線段在面內(nèi),否則不在面內(nèi)。
所以,算法思路如下(本算法引用網(wǎng)絡(luò)上一篇文章):
if 線段PQ的端點(diǎn)不都在多邊形內(nèi) then return false; 點(diǎn)集pointSet初始化為空; for 多邊形的每條邊s do if 線段的某個(gè)端點(diǎn)在s上 then 將該端點(diǎn)加入pointSet; else if s的某個(gè)端點(diǎn)在線段PQ上 then 將該端點(diǎn)加入pointSet; else if s和線段PQ相交 // 這時(shí)候已經(jīng)可以肯定是內(nèi)交了 then return false; 將pointSet中的點(diǎn)按照X-Y坐標(biāo)排序; for pointSet中每?jī)蓚€(gè)相鄰點(diǎn) pointSet[i] , pointSet[ i+1] do if pointSet[i] , pointSet[ i+1] 的中點(diǎn)不在多邊形中 then return false; return true;
注:X-Y坐標(biāo)排序,X坐標(biāo)小的排在前面,對(duì)于X坐標(biāo)相同的點(diǎn),Y坐標(biāo)小的排在前面,這種排序準(zhǔn)則也是為了保證水平和垂直
情況的判斷正確。
1. 點(diǎn)在面內(nèi),線段相交情況的判斷見(jiàn)上面的思路。
2. 這個(gè)過(guò)程中的排序因?yàn)榻稽c(diǎn)數(shù)目肯定遠(yuǎn)小于多邊形的頂點(diǎn)數(shù)目n,所以最多是常數(shù)級(jí)的復(fù)雜度,幾乎可以忽略不計(jì)
。因此算法的時(shí)間復(fù)雜度也是O(n)。
3. 有了線段和面的關(guān)系,再判斷折線與面的關(guān)系,也就可以for循環(huán),同理進(jìn)行判斷了,但時(shí)間復(fù)雜度將是O(n^2)。
后面將介紹一種時(shí)間復(fù)雜度為O(nlogn)的”平面掃描算法”。
5 面和面的關(guān)系
面面的空間關(guān)系,可能要更復(fù)雜一些,在拓?fù)渑袛啵噙呅委B置分析,面對(duì)象的編輯中,有著廣泛的應(yīng)用。這個(gè)將在以后的
章節(jié)中介紹一種時(shí)間復(fù)雜度為O(nlogn)的算法“平面掃描算法”。 6 點(diǎn)到線段的距離 點(diǎn)到線段的距離,在各種測(cè)量,拓?fù)渑袛?比如,線對(duì)象的選取中需要比較距離)中都需要用到。大家對(duì)點(diǎn)到直線的
距離,都很熟悉,那點(diǎn)到線段距離又該如何計(jì)算呢? 問(wèn)題的關(guān)鍵是判斷a、r的角度,向量的點(diǎn)積能判斷一個(gè)角是鈍角還是銳角,先復(fù)習(xí)一下向量的點(diǎn)積,也叫向量的數(shù)
量積,結(jié)果是一個(gè)數(shù),沒(méi)有方向。設(shè)向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb)
a . b=|a|*|b|*cosα=Xa*Xb+Ya*Yb+Za*Zb 向量點(diǎn)積的幾何意義是,高中物理中,求作用力在一個(gè)方向上所作的功。如果a .
b>0,則α為銳角,a . b<0,則α鈍角。
熟悉了利用向量的點(diǎn)積來(lái)判斷角度,AC·AB 判斷夾角a,BA·BC判斷夾角r,即可確定三種情況中,具體是哪一種。至于第一種
情況,求點(diǎn)到垂足的距離,可以饒開(kāi)建立方程求垂足,再求兩點(diǎn)距離的思路,因?yàn)榻⒎匠踢\(yùn)算是復(fù)雜的,多耗了CPU資源。
利用向量叉積的幾何意義來(lái)求,向量的叉積表示以兩向量為鄰邊的平行四邊形的面積,|AC X AB|為⊿ABC的面積的兩倍,求
平行四邊形的高,只要用面積除以底邊AB的長(zhǎng)度。即,高CD的長(zhǎng)度=|AC X AB|/distance(AB)。
這些復(fù)雜的幾何判斷,都將在空間索引的過(guò)濾下,在少量數(shù)據(jù)集(侯選集)上進(jìn)行。計(jì)算幾何算法,通常是比較復(fù)雜,比較耗
CPU資源,而且還要考慮各種退化情況,在這里,并不試圖向大家窮舉各種情況,只想起一個(gè)拋磚引玉的作用, 或許還有人
會(huì)有這樣的疑慮:有沒(méi)考慮“投影”的問(wèn)題?關(guān)于投影將在相應(yīng)的章節(jié)中給予解釋,但有一點(diǎn)是可以肯定的,空間分析、計(jì)算
幾何算法,都是在平面直角坐標(biāo)系下運(yùn)算的,不會(huì)在球面上。
|