【正文】
op numeric)。SELECT AddGeometryColumn(39。39。,39。states11_map39。,39。the_geom39。,39。139。,39。MULTIPOLYGON39。,2)。COMMIT。~ ,每個(gè)文檔填入各自的地理數(shù)據(jù)信息。,輸入如下代碼:psql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgres@echo off:hellopsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulpsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulpsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulpsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulpsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulpsql d template_postgis20 f C:\Program Files\PostgreSQL\\bin\ postgresping n 5 nulgoto hellorem運(yùn)行后,打開瀏覽器,輸入://localhost:8080/geoserver/即可以看到操作界面,可以觀察到地圖隨PostGIS數(shù)據(jù)的改變動態(tài)更新。網(wǎng)頁保持周期性更新,需要加入下面這一行代碼:meta equiv=refresh content=5圖 5 基于PostGIS的地圖呈現(xiàn)3 OpenLayers實(shí)踐OpenLayers項(xiàng)目分析 項(xiàng)目介紹OpenLayers是由MetaCarta公司開發(fā)的,用于WebGIS客戶端的JavaScript包,V,通過BSDLicense發(fā)行。它實(shí)現(xiàn)訪問地理空間數(shù)據(jù)的方法都符合行業(yè)標(biāo)準(zhǔn),比如OpenGIS的WMS和WFS規(guī)范,OpenLayers采用純面向?qū)ο蟮腏avaScript方式開發(fā),同時(shí)借用了Prototype框架和Rico庫的一些組件。采用OpenLayers作為客戶端不存在瀏覽器依賴性。由于OpenLayers采用JavaScript語言實(shí)現(xiàn),而應(yīng)用于Web瀏覽器中的DOM(文檔對象模型)由JavaScript實(shí)現(xiàn),同時(shí),Web瀏覽器(比如IE,F(xiàn)F等)都支持DOMOpenLayersAPIs采用動態(tài)類型腳本語言JavaScript編寫,實(shí)現(xiàn)了類似與Ajax功能的無刷新更新頁面,能夠帶給用戶豐富的桌面體驗(yàn)(它本身就有一個(gè)Ajax類,用于實(shí)現(xiàn)Ajax功能)。目前,OpenLayers所能夠支持的Format有:XML、GML、GeoJSON、GeoRSS、JSON、KML、WFS、WKT(WellKnownText)。,實(shí)現(xiàn)了具體讀/寫這些Format的解析器。OpenLayers所能夠利用的地圖數(shù)據(jù)資源“豐富多彩”,在這方面提供給擁護(hù)較多的選擇,比如WMS、WFS、GoogleMap、KaMap、MSVirtualEarth、WorldWind等等。當(dāng)然,也可以用簡單的圖片作為源。第一次使用OpenLayers:先到它的官方網(wǎng)站,解壓后可以看到其中的一些目錄和文件,、根目錄下的lib目錄、根目錄下的img目錄到你網(wǎng)站的Scripts目錄下(當(dāng)然,這個(gè)只是例子,您網(wǎng)站的目錄結(jié)構(gòu)您自己說得算,/lib,/img在同一目錄中即可)。然后。我們以加載WMS和GML文件為例。scriptsrc=../lib//scriptscripttype=text/javascriptvarlon=5。//xaxiscoodinateinmapunitsvarlat=40。//yaxiscoordinateinmapunitsvarzoom=5。//numberofzoomlevelsvarmap,layer。//聲明變量map、layer;等同于varmap=null。varlayer=null。map=new(39。map39。)。//layer=new(OpenLayersWMS,{layers:39。basic39。})。//(layer)。((,))。//在Map對象上加載Layer對象,主要就是實(shí)現(xiàn)圖片的范圍。使加載的圖片可以顯示全部需要顯示的地圖信息,不丟失(new(GML,gml/))。//再在剛加載的WMS文件上,加載GML文件剩下的工作就是,比如LayerSwitcher等。它們會在地圖瀏覽的“窗口”上增加一些工具欄或是“按鈕”,增加互動性和功能性。 源代碼總體結(jié)構(gòu)分析通過前面的項(xiàng)目介紹,我們大概已經(jīng)知道Openlayers是什么,能夠做什么,有什么意義。接下來我們分析它怎么樣,以及怎樣實(shí)現(xiàn)的等問題。這個(gè)圖是從它的文檔上截取的,旨在從感官上認(rèn)識一下OpenLayers的類。下面分別介紹(文檔中的類是按字母順序排列的,也按這個(gè)順序說吧):我們看到在類的頂層“高高在上”的是OpenLayers,它為整個(gè)項(xiàng)目實(shí)現(xiàn)提供名稱空間(JavaScript語言沒有名稱空間一說,但是它確實(shí)有自己的機(jī)制實(shí)現(xiàn)類似的功能,后面會說明),它直接擁有常量VERSION_NUMBER,以標(biāo)識版本。Ajax:顧名思義,用于實(shí)現(xiàn)Ajax功能,只是OpenLayers的開發(fā)者們把它單獨(dú)寫到一個(gè)類里了。同時(shí),設(shè)計(jì)的時(shí)候也考慮了跨瀏覽器的問題。BaseTypes:這里定制了OpenLayers中用到的string,number和function。比如,OpenLayers.String.startsWith,用于測試一個(gè)字符串是否一以另一個(gè)字符串開頭;OpenLayers.Number.limitSigDigs,用于限制整數(shù)的有效數(shù)位;OpenLayers.,用于把某一函數(shù)綁定于對象等等。Console:,此名稱空間用于調(diào)試和把錯(cuò)誤等輸出到“控制臺”上,需要結(jié)合使用../Firebug/。Control:我們通常所說的控件類,它提供各種各樣的控件,比如上節(jié)中說的圖層開關(guān)LayerSwitcher,編輯工具條EditingToolbar等等。加載控件的例子:class=new(39。map39。,{controls:[]})。(new())。(new())。Events:用于實(shí)現(xiàn)OpenLayers的事件機(jī)制。具體來說,OpenLayers中的事件分為兩種,一種是瀏覽器事件,例如mouseup,mousedown之類的;另外一種是自定義的,如addLayer之類的。OpenLayers中的事件機(jī)制是非常值得我們學(xué)習(xí)的,后面將具體討論。Feature:我們知道:Feature是geography和attributes的集合。在OpenLayers中,類由一個(gè)Feature和一個(gè)lonlat組成。Format:此類用于讀/寫各種格式的數(shù)據(jù),它的子類都分別創(chuàng)建了各個(gè)格式的解析器。這些格式有:XML、GML、GeoJSON、GeoRSS、JSON、KML、WFS、WKT(WellKnownText)。Geometry:怎么翻譯呢,幾何?是對地理對象的描述。它的子類有Collection、Curve、LinearRing、LineString、MultiLineString、MultiPoint、MultiPolygon、Point、Polygon、Rectangle、Surface,正是這些類的實(shí)例,構(gòu)成了我們看到的地圖。需要說明的是,Surface類暫時(shí)還沒有實(shí)現(xiàn)。Handler:這個(gè)類用于處理序列事件,可被激活和取消。同時(shí),它也有命名類似于瀏覽器事件的方法。當(dāng)一個(gè)handler被激活,處理事件的方法就會被注冊到瀏覽器監(jiān)聽器listener,以響應(yīng)相應(yīng)的事件;當(dāng)一個(gè)handler被取消,這些方法在事件監(jiān)聽器中也會相應(yīng)的被取消注冊。Handler通過控件control被創(chuàng)建,而control通過icon表現(xiàn)。Icon:在計(jì)算機(jī)屏幕上以圖標(biāo)的形式呈現(xiàn),有url、尺寸size和位置position 3個(gè)屬性。一般情況,它與,表現(xiàn)為一個(gè)Marker。Layer:圖層。Map:網(wǎng)業(yè)中動態(tài)地圖。它就像容器,可向里面添加圖層Layer和控件Control。實(shí)際上,單個(gè)Map是毫無意義的,正是Layer和Control成就了它。Marker:通俗一點(diǎn)兒說,Icon附上一定的經(jīng)緯度就是Marker。它們的組合關(guān)系是:Popup:地圖上一個(gè)小巧的層,實(shí)現(xiàn)地圖“開關(guān)”功能。使用例子:Class=new(chicken,new(5,40),new(200,200),examplepopup,true)。(popup)。Renderer:渲染類。在OpenLayers中,渲染功能是作為矢量圖層的一個(gè)屬性存在的,我們稱之為渲染器,矢量圖層就是通過這個(gè)渲染器提供的方法將矢量數(shù)據(jù)顯示出來。以SVG和VML為例,繼承關(guān)系是這樣的:至于OpenLayers.Renderer.Elements為什么要存在,以及它的渲染機(jī)制,后面會說。Tile:設(shè)計(jì)這個(gè)類用于指明單個(gè)“瓦片”Tile,或者更小的分辨率。Tiles存儲它們自身的信息,比如url和size等。它的類繼承關(guān)系如下:Util:“跑龍?zhí)住钡念悺懙竭@里,可以看到OpenLayers的類纏繞的挺麻煩的,接下來的文章將從代碼部分分析更細(xì)部的東西。 BaseTypes:定義底層類與定制JS內(nèi)置類先說基類型BaseTypes下,OpenLyers構(gòu)建的“自己”的類。它們分別是:、。下面分別介紹:OpenLayers.LonLat:經(jīng)緯度類,其實(shí)例為地圖提供一經(jīng)度、緯度對,即位置。有兩個(gè)屬性lon(xaxiscoodinate)和lat(yaxiscoordinate)。這里說明一下,怎么經(jīng)緯度又與x軸坐標(biāo)、y軸坐標(biāo)糾纏在一起?是這樣:當(dāng)?shù)貓D是在地理坐標(biāo)投影下,它就是經(jīng)緯度;不然就是地圖上的x/y軸坐標(biāo)。除構(gòu)造函數(shù)外,實(shí)現(xiàn)了五個(gè)函數(shù):toShortString:function() 把坐標(biāo)轉(zhuǎn)換為字符串;clone:function() 復(fù)制一個(gè)LonLat對象;Add:function(lon,lat) 改變現(xiàn)有地圖的位置;returnnew(+lon,+lat)。equals:function(ll) 判斷傳入的lon,lat對是否與當(dāng)前的相等;wrapDateLine:function(maxExtent) 復(fù)制下(lon,lat),指定為邊界的最大范圍。: 像素類,在顯示器上以(x,y)坐標(biāo)的的形式呈現(xiàn)像素位置。有兩個(gè)屬性x坐標(biāo)、y坐標(biāo),提供四個(gè)成員函數(shù):clone:function() 拷貝像素;equals:function(px) 判斷兩像素是否相等;add:function(x,y) 改變(x,y)使其成為新像素;returnnew(+x,+y)。offset:function(px) 調(diào)用add()使像素位置發(fā)生偏移。newPx=(,)。:也有兩個(gè)屬性,寬度width、高度height。實(shí)現(xiàn)了兩個(gè)成員函數(shù):clone:function()和equals:function(sz)不多說了。:在這個(gè)名稱空間下,開發(fā)者寫了好多API,有visible、toggle、hide、show、remove、getHeight、getDimensions和getStyle,以實(shí)現(xiàn)元素的顯示、隱藏、刪除、取得高度,取得范圍等功能。以getHeight函數(shù)為例我們看看它的代碼:/***APIFunction:getHeight**Parameters:*element{DOMElement}**Returns:*{Integer}Theoffsetheightoftheelementpassedin*/getHeight:function(element){el