<listing id="vjp15"></listing><menuitem id="vjp15"></menuitem><var id="vjp15"></var><cite id="vjp15"></cite>
<var id="vjp15"></var><cite id="vjp15"><video id="vjp15"><menuitem id="vjp15"></menuitem></video></cite>
<cite id="vjp15"></cite>
<var id="vjp15"><strike id="vjp15"><listing id="vjp15"></listing></strike></var>
<var id="vjp15"><strike id="vjp15"><listing id="vjp15"></listing></strike></var>
<menuitem id="vjp15"><strike id="vjp15"></strike></menuitem>
<cite id="vjp15"></cite>
<var id="vjp15"><strike id="vjp15"></strike></var>
<var id="vjp15"></var>
<var id="vjp15"></var>
<var id="vjp15"><video id="vjp15"><thead id="vjp15"></thead></video></var>
<menuitem id="vjp15"></menuitem><cite id="vjp15"><video id="vjp15"></video></cite>
<var id="vjp15"></var><cite id="vjp15"><video id="vjp15"><thead id="vjp15"></thead></video></cite>
<var id="vjp15"></var>
<var id="vjp15"></var>
<menuitem id="vjp15"><span id="vjp15"><thead id="vjp15"></thead></span></menuitem>
<cite id="vjp15"><video id="vjp15"></video></cite>
<menuitem id="vjp15"></menuitem>

構造數據嵌拼地圖的裝置和方法

文檔序號:6409777閱讀:437來源:國知局

專利名稱::構造數據嵌拼地圖的裝置和方法
技術領域
:本發明涉及雷達圖象的顯示,尤其涉及將多個雷達圖象組合到那些圖象的嵌拼地圖來產生這樣的顯示。本發明還涉及電子計算機和數據處理系統,尤其涉及這些系統應用于地球科學(如氣象)。本發明還涉及信息處理系統組織,尤其涉及采用具有人工智能系統細節的人工智能的應用,如地球科學(如氣象)。本發明還進一步涉及通信、定向無線電波系統和裝置(例如雷達或無線電導航),尤其是氣象雷達、多種雷達及用來產生這些系統和裝置的圖象或圖象的掃描變換的顯示電路,以及用來指示風暴位置(例如三角測量)的定位無線電波系統和裝置。
背景技術
:實踐中,人們需要將幾幅雷達圖象組所得覆蓋某一地理范圍的一幅嵌拼地象。本發明滿足了該種需要。在美國,存在大量的氣象雷達站。國家氣象雷達網由新的NEXRADWSR-88D氣象監視多普勒雷達和以前就存在的WSR-57和WSR-74非多普勒氣象雷達。每一這樣的雷達站基本上可以獨立工作,但這些站的范圍可以重疊。必須將來自這些雷達站的數據裝配到顯示特定區域或縱橫美國的氣象情況的單幅嵌拼地圖中。本發明滿足了這種需要。雷達數據的嵌拼地圖可以提供一大地理范圍內的降雨量和惡劣的氣候的地點和程度,并且因此用于氣象學家和負責監視和預告氣象情況的其他人員。雷達數據的產生通常要求將數據點從本地地理坐標系統(其中的位置由相對于各個雷達站來定義)變換到嵌拼地圖的地理坐標系統。數據點從一個坐標系統到另一個(再投影)在計算上是相當繁重的任務,而且還必須確保準確性。甚至來自一個雷達站的雷達數據也可以由100,000個數據值組成,每一個數據值都必須經過再投影。一嵌拼地圖可以由來自幾十個雷達站的數據組成。因此要求準確地將來自所要求的雷達站的所有數據足夠快地組合起來,以提供當前的氣象描述。本發明滿足了這種需要。發明概述因此,本發明的目的是提供一種將來自多個雷達站的數據組所得覆蓋所要求的地理范圍的單個圖象。本發明的另一個目的是提供一種裝置和方法,這種裝置和方法能夠實時以數字格式將來自多個雷達站的雷達數據(例如氣象雷達數據)組所得覆蓋某一地理范圍的嵌拼地圖。本發明的又一個目的是提供一種裝置和方法,這種裝置和方法用來將來自多個源的數據組所得能夠在普通用途的計算機(如個人計算機)上運行的單個圖象。本發明的再一個目的是提供一種裝置和方法,這種裝置和方法能夠產生雷達數據的嵌拼地圖,這些雷達數據能夠提供一大地理范圍內的降雨量和其他氣象現象的位置和程度。本發明的進一步的目的是提供一種這種和方法,這種裝置和方法能夠準確地將來自多個所要求的雷達站的大量數據足夠快地組合起來,以提供氣象或其他現象的當前描述。本發明的再進一步的目的是提供一種能夠既準確又有效地建立雷達數據的嵌拼地圖的裝置和方法。簡略地說,本發明的這些目的和其他目的是通過將多個雷達數據箱(bin)中的每一個轉換成鑲嵌圖象中相應的網格位置或網格框。但是,當每一個雷達數據箱映射到嵌拼地圖的網格框時,不是雷達覆蓋區內的每一個這樣的網格框都可以接收一個箱。這可以是因為網格框比雷達箱多的緣故,或者因為雷達數據箱沒有完全覆蓋的緣故。在從箱到框的映射完成以后,發明的裝置和方法可以返回并以如下的方式填滿那些孔。雷達數據的箱被映射成用于部分所得顯示的預定網格。每次該網格的網格元件接收一箱時,臨時陣列的相應元素處在“設置”。隨后,檢查臨時陣列找出任一“未被設置”或空白的元素。如果發現任一陣列元素沒有箱,則找到位置上最靠近的數據箱。最靠近的數據箱及其相應的網格位置可以用來填滿嵌拼地圖網格中的孔。本發明的其他目的、優點和新特征在結合附圖對本發明作了詳細描述以后將變得清楚起來。附圖簡述圖1是用于單個站雷達產品的顯示的二維陣列圖示;圖2是一例將各個氣象雷達產品數據映射成一大嵌拼地圖網格的圖示;圖3是按照本發明直接將各個雷達數據值映射成按照本發明的嵌拼地圖網格的整個過程圖示;圖4是按照本發明的較佳實施例的直接將各個雷達數據值映射成嵌拼地圖網格的整個過程圖示;圖5描述的是圖4所示方法中可以使用的查詢表的格式;圖6給出的是一例由于源數據網格和目標數據網格不一致時出現的孔的雷達數據映射而產生的顯示;圖7A和7B一起給出填滿按照本發明的圖6所示孔中任何一個孔的方法實施例的圖示;圖8A、8B、8C、8D和8E一起給出一個建立圖4和圖5所示查詢表的方法的流程圖;圖9A、9B、9C、9D和9E一起給出一個采用圖4、5和8A至8E的查詢表建立按照本發明的雷達數據嵌拼地圖的方法的流程圖。詳細描述下面參照附圖,圖中,相同的標號文字指得是相同或相應的部件,圖1中給出由多個元素或象素組成的陣列10,標號12表示其中的一個元素或象素。每一陣列元素(如元素12)包含雷達返回的單個值。每一個這樣的元素代表基本上與地球表面相切的水平表面的有限區域。陣列10包含一例經譯碼的單基站雷達數據產物14。陣列10中,產物表述14由代表在該產物中氣象雷達數據返回的范圍的圓圈16為邊界。產物14內,各個雷達數據箱位置(例如位置18)由陣列中的x、y坐標來標記,箱的經緯根據相對于雷達站的距離來計算。中央箱20代表雷達站位置。對于一固定的雷達站,雷達站的緯度和經度已知,從而參照相對于中央箱位置的各個箱將提供用于各個箱的準確的位置信息。單基站雷達數據以數字格式接收,該數字格式使得數據值能夠以二維陣列10賦值給計算機程序存儲器。每一陣列元素(例如元素12)是一數據“箱”,它代表相對較小的有限區域(例如1公里乘1公里)內大氣參數(例如降雨量)。所以,任何一個箱(例如箱18)的坐標可以提供該箱到該雷達站的x,y距離。然而,通常有一個以上的雷達產物必須用于某一區域中氣候的單個網格陣列或圖示。這可以是因為兩個雷達站的范圍會重疊,或者因為想要在一次顯示中給出包括多個雷達站的足夠大的地理范圍的雷達數據。這種情況下,嵌拼地圖是通過從單個雷達站的雷達數據中取出各個數據箱,并將那些箱的值賦給一大比例(例如區域或全國)網格中的相應位置,而該大比例的網格最好也位于二維陣列22的計算機存儲器中。這樣一種嵌拼地圖形成的一個例子如圖2所示。圖2給出一例將來自例如不同雷達站的陣列10、24和26的各個氣象雷達產物數據映射到更大比例的嵌拼地圖網格22內。每一陣列10、24和26這里分別代表來自單基站A、B或C的雷達產物。每一這樣的陣列10、24和26與圖1所示的陣列10相似。如圖2所示,來自陣列10的數據與來自其他這樣的陣列24和26的數據組合,構成覆蓋地理范圍(包括所有這些雷達站)的嵌拼地圖網格22。因此,在圖2所示的例子中,陣列10被映射到網格22的部分或子陣列28上,陣列24被映射到網格22的部分或子陣列30上,陣列26被映射到網格22的部分或子陣列32上。在圖2所示的例子中,來自單個雷達站的雷達數據的坐標系統不必與嵌拼地圖22的坐標系統一致。即,陣列10、24和26的箱和網格22的網格框不必具有相同的大小,各坐標系統不必取向相同。為此,來自陣列10、24或26的每一箱的坐標必須轉換(即再投影)成網格22的坐標。按照本發明將各個數據點的坐標按照本發明再投影到(例如從陣列10轉換成)網格22的方法如圖3所示。圖3給出按照本發明將各個雷達數據值(例如來自陣列10)間接映射成嵌拼地圖網格(例如網格22)的整個過程。在單個站雷達產物陣列10中,數據值被賦給箱。在圖3所示的方法中,每一箱被轉換為緯度和經度,并且隨后緯度和經度被轉換為相應的網格位置。在步驟34,每一組箱坐標x,y被轉換成在x軸和y軸上與雷達站的20的距離。在步驟36,這個以x和y值的形式的距離接著被轉換成地理上的緯度和經度。在步驟38,這些緯度值和經度值接著用網格22的x軸和y軸,被轉換成與網格22中心相距的x、y距離。在步驟40,這些x、y距離被轉換成網格22的相應x坐標值和坐標值。通過這種方式,來自陣列10的數據值被映射成嵌拼地圖網格22。可以采用相似的過程實現從其他陣列24、26到網格22的映射。盡管該方法準確,但不是最佳的,因為該方法計算強度大(見步驟34、36、38和40),所以不適于在通用計算機(如個人計算機)上進行實時運算。另一種更好的從單基站網格或產物陣列10映射到嵌拼地圖網格22的方法如圖4所示。圖4所示的方法比圖3所示的方法更有效,因為圖4的方法采用預先建立的查詢表直接將雷達數據箱映射成網格22。這些查詢表是如圖8和該圖中相應的編碼所示,用計算量很大的算法建立起來的,用來計算每一雷達數據箱的緯度和經度,并將這些緯度和經度轉換成網格22的框位置。氣象數據雷達站通常具有固定的位置,所以產物陣列10、24或26的位置和取向中每一個這樣的站相對于網格22的位置和取向是已知的。這些查詢表最好脫機建立起來,并且最好作為文件存儲在計算機數據庫46中。然后圖9所示建立嵌拼地圖的程序在處理來自每一站的數據的同時,從恰當的查詢表文件中讀取數據。每一查詢表包含一個箱x、y值和相應網格x、y值的列表,列表前面有一個查詢表各表項的編號。這樣一種查詢表的較佳格式如圖5所示。隨后對查詢表的每一表項的處理就是將來自箱x、y的雷達數據值賦于相應的網格x、y位置。圖4給出的是采用預先建立的查詢表,直接將各個雷達數據值映射成嵌拼地圖網格的較佳過程。圖4中,在單基站雷達產物陣列10,數據值被賦予到陣列中的箱。在圖4所示的方法中,例如箱42到框44的直接映射是以下述方式完成的。每一站的查詢表存儲在數據庫46內。比方說,當發生陣列10到網格22的映射時,在步驟48,從數據庫46讀取用于陣列10的站的查詢表。接著,在步驟50,通過將箱x和y坐標值直接轉換成網格22的x、y坐標值,將陣列10的每一箱(例如箱42)映射成網格22的框(例如框44),方法是,在查詢表中找到前者,并在步驟50,從該表中讀取相應的網格框位置。網格22是將如來自陣列10的數據值映射成該網格的嵌拼地圖網格。實際上,采用圖4所示的方法,圖3所示的步驟34、36、38和40是事先脫機進行的,以減少實時運算期間所需處理的工作量。圖5給出一例圖4所示查詢表的文件格式。圖5中,所有的表項值為整數。每一文件為各基站專用。同時,每一文件也是坐標系統和各個產物(例如產物14)的空間分辨率和嵌拼地圖網格(例如網格22)的空間分辨率所專用的。一給定的箱x、y坐標可以與一個網格以上的x、y坐標配對。與此類似,一給定的網格x、y坐標可以與一個以上的箱x、y坐標配對。然而,對于每一箱x、y坐標,至少有一個表表項,對于每一網格x、y坐標,至少有一個表項。然而,表項的總數不會超過要映射的箱的數目的較大者,或框數目的較大者。正如上面討論的那樣,產物數據箱的陣列(例如陣列10、24或26)將不必完全與嵌拼地圖網格22對齊。結果,同一網格框將接收一個以上的箱。由于類似的原因,雷達數據范圍內的某些網格箱將不接收任何箱。在后者的情況下,“孔”會保留在完整的嵌拼地圖內,如從圖6可以看到的那樣。圖6給出一例具有一個或多個孔52的雷達數據映射,其中的源和目標網格(即雷達箱和嵌拼地圖網格)不一致。下面的附加處理在本發明中用來填充網格22中這樣的孔52。該處理是以下述方式完成的。在建立如圖8所示的查詢表的過程中,識別網格中每一這樣的“孔”的位置,并將最靠近的箱賦予到具有該孔的網格框。這是采用圖7所示的臨時陣列在雷達覆蓋區域內找到未填滿的網格框來完成的。每次箱x、y坐標與網格x、y位置配對時,設置臨時陣列54中的一個元素。接著,當某一基站所有的箱x、y位置的處理完成時,在為其構筑查詢表的雷達范圍內,為臨時陣列54中未設置或未填滿的網格框執行“反向計算”。在這樣的反向計算中,網格框x、y位置被轉換成緯度和經度,并且隨后該緯度和經度被轉換成相應的箱x、y坐標,以找到在位置上最靠近該孔的箱x、y坐標的箱。每一這樣“反向計算的”箱x、y和框x、y對,作為一個表項而加入該雷達站的查詢表中。這一過程確保了每一數據箱被賦值到嵌拼地圖網格,并且隨后要被考慮的雷達范圍內的每一網格框被賦給一數據值。圖7描述的是用臨時陣列54來填充網格22中的孔。臨時陣列54的每一元素可以含有三個值中的任何一個第一個值,初始“空白”值(例如-1);第二個值,“未設置”值(例如0),用于落入雷達范圍內的每一相應的網格元素或框;第三個值“設置”值(例如+1),表示某一雷達箱已經被映射到相應的網格元素。在網格22的子陣列(例如子陣列32)中來自相應產物陣列(例如陣列26)的氣象雷達數據的箱被映射成具有箱22的取向而不是要被映射的源陣列的取向的網格22。在該映射過程中,每次網格22元素接收到一箱,則“設置”臨時陣列54中相應的元素以表示之。接著檢查瞬時陣列中的任何“未設置”或未填充的元素。在臨時陣列54中,圓圈56代表接著被映射的氣象雷達產物中雷達數據的范圍。圓圈56中所有的陣列54元素用來從正被映射成網格22的相應產物陣列接收一數據箱或數據值。如果陣列54的陣列元素被發現沒有被這樣“設置”,那么執行反向計算,以找到在位置上最靠近該陣列元素的填充的數據。該數據箱x、y及其相應網格位置x、y被加到查詢表中,以填充會產生嵌拼地圖網格22的孔。為了執行圖4所示的過程,建立嵌拼地圖的過程需要分成二部分。如圖8A-8E所示的這兩部分中的第一部分可以脫機執行,并負責產生在本地數據庫46中建立并存儲的查詢表。設計用來實時運行并采用預先建立的查詢表來準確建立一個(或多個)嵌拼地圖的第二部分如圖9A-9E所示。在圖8A-8E中,建立雷達站專用查詢表的過程可以小結如下。針對每個雷達站進行下面的過程,為每一雷達站構造獨立的表。首先對臨時陣列54中的每一元素初始化,以反應出“空白”值或清另值。對于臨時陣列中的每一元素,元素x、y坐標被轉換成與雷達站相隔的距離或范圍;如果該范圍處在由圓圈56定義的雷達數據覆蓋區域以內,那么賦給伴隨數據庫中臨時陣列元素的標記一個“未設置”指示。對于正被映射的雷達產品的每一雷達數據箱位置,將箱x、y坐標轉換成緯度和經度;將所得的箱緯度和經度轉換成網格x、y位置;將這樣找到的箱x、y網格x、y對賦值到該站的查詢表中恰當的位置上;為該對計算臨時陣列元素x、y位置;并賦給這樣找到的x、y位置處的臨時陣列元素一個“設置”指示,給出在該位置處沒有出現孔。隨后,為臨時陣列54中的每一元素執行下面的步驟。首先判斷臨時陣列元素是否未被設置,并且因此處在雷達數據覆蓋區域內但沒有被賦給雷達數據箱。如果是這樣,則將臨時陣列元素x、y坐標轉換成網格x、y坐標;將所得的網格x、y坐標轉換成緯度和經度;將所得的緯度值和經度值轉換成雷達箱x、y坐標;并且將所得箱坐標和網格x、y坐標對賦值到用于該單基站雷達產物的查詢表,以填充或部分填充嵌拼地圖網格中的孔。最后,將所得的查詢表指定成數據庫46中的一個文件。用查詢表建立雷達數據嵌拼地圖的圖9所示的過程可以小結如下。首先,對于大網格22中的每一個位置或元素,使網格元素初始化成合適的預定值。接著,對每一雷達站,執行下面的步驟。從數據庫讀取該雷達站的最新氣象雷達數據產物。接著將該雷達產物譯碼,將由該產物的各個數據值賦值到二維陣列。隨后從數據庫46讀取預先建立查詢表。接著,對于該查詢表中的每一表項,從查詢表獲取相應的箱x、y坐標及其相應的網格x、y坐標。隨后從經譯碼的雷達產物獲取該箱x、y位置處的產物數據值。該產物數據值接著賦值到從查詢表獲得的相應網格x、y位置處。對于該查詢表中的每一表項,重復這最后三個步驟。最后,網格中所得的組合的雷達數據被編碼,并存儲到數據庫46中文件內。圖8A、8B、8C、8D和8E一起給出建立查詢表的方法的結構圖或流程圖。這些查詢表對于圖4所示的方法以及在通用數字計算機上實時建立雷達數據的嵌拼地圖的相應系統是基本的部分。圖8A-8E所示的方法可以作為計算機軟件來實施,而計算機軟件最好是在時間不緊迫時脫機運行,從而可進行在查詢表建立過程中所需的費時的計算并在需要那些計算結果之前好好計算。如圖8A所示,程序采用了一個手工產生的配置文件101,該文件含有有關要建立查詢表的一個或多個雷達站的信息。配置文件101含有雷達站的編號和每一站的緯度/經度以及識別號。在步驟102,程序從文件101讀取雷達站的編號,并且在步驟103,從文件101讀入站信息并將該信息存儲到計算機的存儲器,供日后使用。接著,在步驟104,程序進入循環,對該表上每一個這樣的雷達站進行處理。執行這一循環,直到處理了所有的站(在步驟105處確定),這時,程序終止(步驟106)。對每一站按該循環進行的處理開始于步驟107,對臨時陣列進行初始化,將-1值賦值到陣列所有的元素。接著,如圖8B所示,臨時陣列由程序設置,以指示該臨時陣列的哪些元素位于雷達覆蓋區域內。在步驟110,該程序對臨時陣列中每一x坐標進行循環,直到處理了所有的x坐標(在步驟111處確定)。在這個第二個循環中,在步驟112處將正被處理的臨時陣列x坐標轉換成相應的網格陣列x坐標。在步驟113處,接著判斷所得的網格x坐標是否處在網格邊界的外面;如果是,則程序跳到下一個臨時陣列x坐標(步驟110、111和112)。這可以出現在位于靠近網格(例如感興趣的區域的)東面或西面邊界處,在這里,瞬時陣列54延伸超過網格22的邊界。否則,對于一有效網格x坐標,程序在步驟114處開始對臨時陣列中每一y坐標進入另一個循環,直到處理了所有的y坐標(步驟115)。在步驟116,由第三循環考慮的臨時陣列y坐標被轉換成相應的網格陣列y坐標。如果在步驟117處發現所得的網格y坐標位于網格的邊界外面,則程序跳到下一個臨時陣列y坐標(步驟114、115和116)。這可以出現在位于所定站的靠近網格(或者感興趣的地理區域)北部或南部邊界處,這里,臨時陣列延伸超過網格的邊界。否則,對于一有效網格y坐標,在步驟118處,用定義正被使用的特定網格的投影方程,將由步驟112和116發現的網格x、y位置轉換成緯度和經度。例如,Lambert保角投影方程(Lambertconformalprojectionequation)可以用作這一用途。由于網格被當作是平面的,但用來代表一曲面,所以某些投影將用來將網格變換成曲面或反之;完成這一投影在繪圖法上是人們熟知的。在步驟119,緯度和經度接著被轉換成用于雷達坐標系統(即用于單基站雷達產物的坐標系統)的x和y坐標。對于步驟119,需要從緯度和經度到雷達產物陣列的坐標系統的恰當繪圖(或類似的)轉換。相反的這樣的變換是在步驟118處完成的,除了如上所討論的那樣,網格坐標不必對應于單個站雷達產物陣列的網格坐標。在步驟119處找到的x坐標和y坐標接著在步驟120處用來計算由x、y坐標定義的與雷達站相隔的距離(在雷達產物陣列中)。在步驟121處,判斷在步驟120處發現的距離是否位于如圖1中圓圈16所定義的雷達覆蓋范圍內;如果是,則在步驟122處將在步驟112和116處使用的x,y坐標、所定義的臨時陣列元素的值設置為零,以表示相應的雷達箱值是由單個站雷達產物陣列所定義。不管是哪一種方法,程序都在步驟114處進行到下一個y坐標。一旦臨時陣列由圖8B所示的方法設置起來以標識落入雷達覆蓋區域的元素,則按圖8C所示,繼續查詢表的產生。如圖8C所示,查詢表的產生在步驟130處開始,這里,查詢表表項的編號設置為零。從步驟131開始,程序接著執行用于雷達產物光柵(raster)陣列中每一y坐標的循環,直到處理了該陣列中的所有y坐標(步驟132)。對于在步驟131處開始的每一循環迭代,程序執行雷達產物光柵陣列中每一x坐標的在步驟133處開始的循環;當雷達產物光柵陣列中所有的x坐標都經步驟133處開始的循環處理以后,該循環在步驟134處退出并返回到步驟131。在步驟133處開始的循環中,用當前產物光柵陣列x、y坐標,在步驟135處判斷該坐標(該陣列中的)與雷達站的距離。在步驟136,判斷在步驟135處計算的距離是否位于雷達覆蓋范圍以外;如果是,則程序回到步驟133并跳到下一個x、y位置。否則,如圖8C所示,位置在雷達覆蓋區內,并進行進一步的處理。在該進一步的處理中,在步驟137處,正被處理的x、y坐標首先被轉換成緯度/經度。正如所使用的那樣,坐標或位置所引用的x值和y值一起(例如迪卡爾坐標)定義了系統、陣列、網格、表面等的位置。在步驟138,接著將所得的緯度/經度變換成相應的網格坐標系統x、y位置。在步驟139,檢查所得的網格x、y坐標的有效性。如果在步驟139發現在步驟138處找到的網格x、y位置是無效的(不位于預置的網格邊界內),那么那些坐標就不屬于正被構造的查詢表,并且通過回到步驟133,程序跳到正被處理的雷達產物陣列中下一個元素。否則,在步驟140處,在步驟138處找到的雷達產物光柵陣列x、y坐標和用于該雷達x、y坐標的相應的網格x、y坐標被賦值到計算機存儲器中正形成的查詢表陣列。在步驟141,該查詢表的查詢表表項總數遞增一;在程序進入步驟131循環之前,請回想一下,該號碼已經在步驟130處初始化為零。在步驟141以后,在步驟138處發現并且在步驟140處進入查詢表的網格x、y坐標在步驟142處用來計算相應于網格x、y坐標的臨時陣列x、y坐標。在步驟143,該位置處臨時陣列元素的值被設置為該值加一,以表示相應方格框至少從雷達產物光柵陣列接收了一個數據值。程序隨后回到步驟133。如果在步驟132處發現雷達產物陣列中所有的y坐標已經由步驟131處開始的循環處理,則程序進行到如圖8D所示的過程。在雷達產物光柵陣列中所有的元素已經由圖8C所示的方法處理以后,則如圖8D所示,程序確定與雷達產物光柵陣列的坐標或位置不一致的雷達覆蓋區內的所有網格框的位置。這時通過搜索臨時陣列中由圖8B所示的步驟122處給定為零值的所有未設置元素來完成的。在圖8D中,對臨時陣列中的每一x坐標執行在步驟150處開始的循環,直到沒有x坐標要處理為止(步驟151)。在該循環內,對由步驟150正被考慮的x坐標的每一y坐標執行在步驟152處開始的另一循環,直到所有的這些y坐標均被處理(步驟153)為止。在這個另一循環中,在步驟153處判斷了是否還有要這樣處理的y坐標以后,在步驟154處估算臨時陣列中當前x、y位置處的值。在步驟154,判斷由圖8D確定的x、位置處的臨時陣列元素是否等于零。如果位置的值為非零,則它或者處在雷達覆蓋區域之外,或者它已經與雷達數據箱位置一致。否則,當x、y位置的值仍然沒有設置(本例中賦值為零值)時,嵌拼地圖中存在一孔。對于每一這樣的孔,需要與在位置上最靠近該孔的雷達數據箱坐標一致。如果存在這樣的孔,則根據步驟154處考慮的臨時陣列x、y坐標,在步驟155處判斷網格x、y坐標。在步驟156,用定義網格投影的方程(如上面討論的那樣)將所得網格x、y坐標轉換成緯度/經度。在步驟156中發現的緯度/經度接著在步驟157被轉換成最靠近雷達產物陣列坐標系統中的x、y坐標。在步驟158,判斷在步驟157處發現的雷達產物x、y坐標是否有效,如果不是,則過程回到步驟153。在步驟159,接著判斷在步驟155判斷的網格x、y坐標是否有效,如果不是,則過程回到步驟153。如果雷達產物x、y坐標有效,并且網格x、y坐標有效(它們落入感興趣的區域內),則在步驟160,那些坐標被賦值到該陣列中下一個有效位置中查詢表陣列。如果出現這樣的坐標,則在步驟153過程跳到下一個臨時陣列元素。在雷達產物x、y坐標和相應的網格x、y坐標被加到查詢表陣列以后,在步驟161,查詢表中表項的總數遞增一。從步驟161,過程回到步驟153。如果再沒有y坐標出現,則過程回到步驟150,從而以圖8D所述的方式對下一個x坐標尋址。如果沒有再要處理的x坐標,則程序從步驟151進入圖8E所示的步驟170。一旦以如圖8D所示的方法完成了查詢表時,則程序以如圖8E所示方式,將如此確定的表存儲到一文件內(例如計算機的軟盤上)。首先,在步驟170產生唯一的查詢表文件名,將當前站識別號與該文件相關聯。在步驟170,接著打開該文件用于輸出。在步驟172,程序接著在存儲器中建立一查詢表表頭,表頭包含其他信息外還包含有在步驟130、141和161處確定的表中表項數。程序接著在步驟174和175寫到新查詢表文件173。首先,在步驟172處建立的表頭在步驟174寫到查詢表文件173,在步驟175后跟完整的查詢表。在步驟176,查詢表文件173接著關閉。程序接著回到圖8A所示的步驟104,繼續處理,直到站表中所有站的查詢表完成為止。只有當一個或多個站移動或加到嵌拼地圖時才必須重運行圖8A-8E所示的程序;圖8A-8E所示程序的實時運行是不需要的。按照本發明的查詢表的結構可以在軟件上實施。以C語言微軟版本寫成的一例這樣的軟件在下面幾頁中給出。然而,其他的編程語言也可以用來實現這一目的。圖8A-8E一起給出該軟件的流程圖。<prelisting-type="program-listing"><![CDATA[/****************************************************************************UNISYSWIS嵌拼地圖處理系統**Unisys公司1994年版權****程序名稱CR_LUT.EXE****說明讀入配置文件,并建立用于每一站的lut。將合成的反射36和38映一4**×4公里的國家網格。****所需數據文件**CONFIG.DAT(要建立lut文件的站的二進制數據文件。由位于本地目錄內的config.exe程序產生)**OUTPUTFILLSCREATEDCR_???.LUT(將NEXRAD合成參考產物映射成4×4Km網格,對每一個NEXRAD站必個。)???代表NEXRAD站識別號。*****************************************************************************/#include<math.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<limits.h>#include<memory.h>#include<dos.h>#include<fcntl.h>#include<io.h>#include<sys\types.h>#include<sys\stat.h>#defineMAXWRITE65534#defineNODATA0#defineMIN_NUM0#defineMIN_VALUE0#defineNO_VALUE0#defineMIN_X0#defineMIN_Y0#defineGRID_X_SIZE_4KM1280#defineGRID_Y_SIZE_4KM896#defineLUT_MAX190000#defineGRID_X_HALF_4KM640#defineGRID_Y_HALF_4KM448#definePR_BINS_CR4232#definePR_ROWS_CR4232#defineTMP_X_SIZE_CR4250#defineTMP_Y_SIZE_CR4250#defineTMP_HALF_CR4125#defineBIN_X_IDX0#defineBIN_Y_IDX1#defineGRID_X_IDX2#defineGRID_Y_IDX3#defineLUT_WIDTH4#defineM_PI3.14159265358979323846#defineM_PI_21.57079632679489661923#defineM_PI_40.78539816339744830962longlut_key={123456};typedefstruct{longkeyword;longnum_entries;shortheader_size;shortsite_id;shortversion;shortdate_built;unsignedlongtime_built;shortgrid_res;shortgrid_width;shortgrid_height;shortbin_res;shortbin_width;shortbin_height;shortprojection;doublegrid_center_phi;doublegrid_center_lamda;doubleradar_phi;doubleradar_lamda;}lut_header_format;lut_header_formatlut_header;typedefstruct{doubledx;doubledy;doublephi_org;doublelamda_org;doublephi_value;doublelamda_value;shortx;shorty;shortpr_id;shortgrid_id;}coords;#定義MAX_SITES200longsite_key={24680};shortnexrad_site={1};shortrrwds_site={2};shortyes={1};shortno={0};typedefstruct{longkeyword;shortnum_sites;}site_header_format;site_header_formatsite_file_header;typedefstruct{shortsite_id;shortsite_flag;shorrsite_build_lut;shortsite_use;doublesite_lat;doublesite_lon;charsite_char[8];}site_contents_format;site_contents_formatsite_file_contents[MAX_SITES];doublemax_range={464.0};doublephi_center_deg=38.0;doublelamda_center_deg=-98.0;/***模型*/shortrnd_oft(doublefl);int_l_c_km2latlon(coords*l_coords);int_l_c_latlon2km(coords*l_coords);int_l_c_latlon2grid(coords*l_coords);int_l_c_grid2latlon(coords*l_coords);int_nex_km2latlon(coords*l_coords);int_nex_latlon2km(coords*l_coords);int_nex_latlon2bin(coords*l_coords);intc_nex_bib2latlon(coords*l_coords);longhuge_fwrite(vojd_huge*buffer,longJength,size_count,intfhw);/***主程序*/intmain(){intstatus;unsignedintdos_status;longnread;size_tnwrite;longsize_write;shortbin_x;shortbin_y;shortnum_sites;shortj;longlut_size;charlut_name[100];staticshort_hugelut[LUT_MAX][LUT_WIDTH];longentry;shorttmp_init={-1};shorttmp_unset={0};shorttmp_set={1};shortgood_status={0};doublerange;shortgrid_x;shortgrid_y;doublephi_deg;/*"Object"latitude(degrees).*/doublelamda_deg;/*"Object"longitude(degrees).*/doublephi_radar_deg;/*Radarlatitude(degrees).*/doublelamda_radar_deg;/*Radarlongitude(degrees).*/staticshort_hugetmp[TMP_X_SIZE_CR4][TMP_Y_SIZE_CR4];shorttx,ty;doublenx,ny;shortgrid_radar_x,grid_radar_y;coordsdummy_coords;coords*local_coords;FILE*fpr;intfhw;/***使local_coords“pointer”初始化,從而它指向某處*/local_coords=&amp;dummy_coords;/***打開“readbinary”的配置文件。*/fpr=fopen("config-dat","rb");if(fpr=NULL){(void)printf("Erroropeningtheconfigurationfile.\n");return(1);}/***讀入配置文件表頭*/nread=fread(&amp;site_file_header,sizeof(site_header_format,1,fpr);if(nread==NODATA){(void)printf("Errorreadingtheconfigurationfileheader.\n");return(1);}/***檢查配置文件表頭的正確關鍵字,并且如果關鍵字不一致時退出程序。*/if(sitefile_header.keyword!=site_key){(void)printf("Invalidconfigurationfilekeyword\n");return(1);}/***從配置文件表頭中獲取站編號*/num_sites=site_file_header.num_sites;/***打印最大站編號。*/(void)printf("\nbuildingmosaiclookuptablesfor%dsites\n\n",num_sites);/***讀入配置文件內容。要讀入的量由站的編號以及每一站的結構大小決定。*/nread=fread(site_file_contents,num_sites*sizeof(site_contents_format),1,fpr);if(nread==NODATA){(void)printf("config.datfread(contents)error\n");return(1);}/***關閉配置文件*/status=fclose(fpr);if(status){(void)printf("Errorclosingtheconfigurationfile.\n");return(1);}/***循環所有的站,并為每一站建立一個lut*/for(j=MIN_NUM;j<num_sites;j++){if((site_file_contents[j].site_flag==nexrad_site)&amp;&amp;(site_file_contents[j].site_build_lut==yes)){/***用下述方法使臨時陣列初始化。**通過設定每一陣列元素使陣列初始化。**該陣列用來確定孔出現在將NEXRAD數據箱初始映射成圖象嵌拼地圖中的何處。*/for(tx=MIN_X;tx<TMP_XSIZE_CR4;tx++){for(ty=MIN_Y;ty<TMP_Y_SIZE_CR4;ty++){tmp[tx][ty]=tnp_init;}}/***獲取緯度和經度,并將賦值成簡單變量,以及賦值成local_coords結構。*/phi_radar_deg=site_file_contents[j].site_lat;lamda_radar_deg=site_file_contents[j].site_lon;local_coords->phi_value=phi_radar_deg;local_coords->lamda_value=lamda_radar_deg;/***打印站識別號和雷達緯度/經度*/(void)printf("file#%3.3dNEXRADsite%3.3d",j,site_file_contents[j].site_id);(void)printf("radarlat/lon%f/%f(deg)\n",phi_radar_deg,lamda_radar_deg);/***用下述規則(采用Lambert保角投影)將當前站的雷達緯度/經度轉換成國家網格**中的x,y坐標。以簡單變量grid_radar_x,grid_radar_y存儲x和y坐標*/status=l_c_latlon2grid(local_coords);if(status){(void)printf("Errorfroml_c_latlon2gridstatus=%d\n",status);return(1);}grid_radar_x=local_coords->x;grid_radar_y=local_coords->y;/***接著,不設置落在雷達范圍內的陣列元素。這樣做是因為這是必須檢查通過將**NEXRAD箱映射成網格而剩下的“孔”的區域。首先,延x方向循環臨時陣列。*/for(tx=MIN_X;tx<TMP_X_SIZE_CR4;tx++){/***將臨時陣列x坐標轉換成相應的網格框x坐標。*/grid_x=(grid_radar_x-TMP_HALF_CR4+tx);/***檢查x網格坐標落在陣列內。**否則,跳過該位置。*/if((grid_x>=MINX)&amp;&amp;(grid_x<GRID_X_SIZE_4KM)){/***通過臨時陣列中所有y箱的循環*/for(ty=MIN_Y;ty<TMP_Y_SIZE_CR4;ty++){/***將臨時陣列y坐標轉換成相應的網格框y坐標*/grid_y=(grid_radar_y-TMP_HALF_CR4+ty);/***檢查y網格坐標是否落在陣列內。**否則,跳過該位置。*/if((grid_y>=MIN_Y)&amp;&amp;(grid_y<GRID_Y_SIZE_4KM)){/***將x,y網格框坐標轉換成一緯度/經度值。*/local_coords->x=grid_x;local_coords->y=grid_y;status=l_c_grid2latlon(local_coords);phi_deg=local_coords->phi_value;lamda_deg=local_coords->lamda_value;/***接著,將緯度經度位置轉換成以公里表示的與NEXRAD坐標系統中隔開的x,y位置。*/local_coords->phi_value=phi_deg;local_coords->lamda_value=lamda_deg;local_coords->phiorg=phi_radar_deg;local_coords->lamda_org=lamda_radar_deg;status=nex_latlon2km(local_coords);/***接著,用以公里表示的x,y坐標確定以公里表示的與雷達相隔的實際距離。**如果該距離落在產物的范圍內,則不設置臨時陣列值。*/nx=local_coords->dx;ny=local_coords->dy;range=sqrt((nx*nx)+(ny*ny));if(range<max_range){tmp[tx][ty]=tmp_unset;}}}}}/***在此建立查詢表。第一步,將每一NEXRAD箱“映射成”網格x,y坐標。整個方法是**將箱位置轉換成緯度/經度,并接著將該緯度/經度轉換成一網格x,y坐標(用在Lambert**保角投影中)。查詢表由表項表組成,每一個包含一NEXRAD箱和行坐標以及相應的**網格x和y坐標。隨后,在第二步,找網格中的孔,并將最靠近的NEXRAD映射成孔**的網格x,y坐標/***一開始,查詢表中沒有表項。*/entry=NO_VALUE;/***將當前站的雷達緯度經度值賦值成local_coards結構。*/local_coords->phi_org=phi_radar_deg;local_coords->lamda_org=lamda_radar_deg;/***為產物中的每一NEXRAD箱進行循環。較外面的循環處理每一行數據。*/for(bin_y=MIN_Y;bin_y<PR_ROWS_CR4;bin_y++){/***較內的循環處理一行中的每一箱。*/for(bin_x=MIN_X;bin_x<PR_BINS_CR4;bin_x++){/***對于處在NEXRAD坐標系統中的當前箱,確定緯度和經度*/local_coords->x=bin_x;local_coords->y=bin_y;status=nex_bin2latlon(local_coords);phi_deg=local_coords->phi_value;lamda_deg=local_coords->lamda_value;if(status==good_status){/***對于一有效x和y箱,取緯度/經度,并比較相應的網格x.,y坐標。*/local_coords->phi_value=phi_deg;local_coords->lamda_value=lamda_deg;status=l_c_latlon2grid(local_coords);grid_x=local_coords->x;grid_y=local_coords->y;if(status==good_status){/***對于一有效緯度/經度,將相應箱x,y和方格x,y坐標賦值給查詢表陣列,并使表項編號遞增。*/lut[entry][BIN_X_IDX]=bin_x;lut[entry][BIN_Y_IDX]=bin_y;lut[entry][GRID_X_IDX]=grid_x;lut[entry][GRID_Y_IDX]=grid_y;entry++;/***接著,方格x,y坐標用來計算臨時陣列x,y坐標。如果臨時陣列x,y坐標對該陣列有效,**則設置該陣列元素。任何未設置的陣列元素代表將在以后處理的“孔”。*/tx=grid_x-grid_radar_x+TMP_HALF_CR4;ty=grid_y-grid_radar_y+TMP_HALF_CR4;if((tx>=MIN_X)&amp;&amp;(tx<TMP_X_SIZE_CR4)&amp;&amp;(ty>=MIN_Y)&amp;&amp;(ty<TMP_Y_SIZE_CR4)){tmp[tx]ty]=tmp_set;}}}}}/***下一步,走過全部臨時陣列,并找到沒有接收箱的產物覆蓋區中代表網格框的任何未設置陣**列無素,對于第一網格坐標,找到最靠近的NEXRAD數據,并將其映射成網格。這是填充**孔的地方。對于每一組NEXRAD箱、行和相應的網格x,y坐標,制作查詢表的附**加表項。*/for(tx=MIN_X;tx<TMP_X_SIZE_CR4;tx++){for(ty=MIN_Y;ty<TMP_Y_SIZE_CR4;ty++){/***用下述方法檢查當前臨時陣列元素,以確定是否有孔。(否則,循環至下一個元素。)*/if(tmp[tx][ty]==tmp_unset){/***將臨時陣列x,y坐標轉換成網絡x,y坐標。*/grid_x=(grid_radar_x-TMP_HALF_CR4+tx);grid_y=(grid_radar_y-TMP_HALF_CR4+ty);/***將網絡x,y坐標轉換成相應的緯度/經度。*/local_coords->x=grid_x;local_coords->y=grid_y;status=l_c_grid2latlon(local_coords);phi_deg=local_coords->phi_value;lamda_deg=local_coords->lamda_value;if(status==good_status){/***對于一有效網格x,y坐標,緯度/經度轉換成相應(最靠近)的NEXRAD數據箱**(存入bin_x,bin_y)。*/local_coords->phi_value=phi_deg;local_coords->lamda_value=lamda_deg;local_coords->phi_org=phi_radar_deg;local_coords->lamda_org=lamda_radar_deg;status=nex_latlon2bin(local_coords);bin_x=local_coords->x;bin_y=local_coords->y;if(status==good_status){if((bin_x>=MIN_X)&amp;&amp;(bin_x<PR_BINS_CR4)&amp;&amp;(bin_y>=MIN_Y)&amp;&amp;(bin_y<PR_ROWS_CR4)&amp;&amp;(grid_x>=MIN_X)&amp;&amp;(grid_x<GRID_X_SIZE_4KM)&amp;&amp;(grid_y>=MIN_Y)&amp;&amp;(grid_y<GRID_Y_SIZE_4KM)){/***當箱坐標和網格x,y坐標有效時,將那些坐標對賦值到查詢表陣列,并使表項編號遞增。*/lut[entry][BIN_X_IDX]=bin_x;lut[entry][BIN_Y_IDX]=bin_y;lut[entry][GRID_X_IDX]=grid_x;lut[entry][GRID_Y_IDX]=grid_y;entry++;/***檢查表項編號,以判定是否出現了不可能的情況,即查詢表已滿。這時,打印一條**信息,并斷開循環。*/if(entry==LUT_MAX){(void)printf("LUTisfullentry=%d\n",entry);gotolut_full;}}}}}lut_full;/*goto在此分支,與循環斷開。停止工作。*/;/***產生查詢表(lut)文件名,其中的識別號以下述方式給出。*/(void)sprintf(lut_name,"cr4%3.3d.lut\0",site_file_contents[j].site_id);/***打印lut文件名。*/(void)printf("lookuptablewrittento%s\n\n",lut_name);/***產生并打開用于“寫”的lut文件。*/_fmode=O_BINARY;fhw=creat(lut_name,S_lWRITE);if(fhw==-1){(void)printf("Errorcreatinglutfile%s\n",lut_name);return(1);}lut_header.keyword=lutkey;lut_header.num_entries=entry;lut_header.header_size=sizeof(lut_header_format);lut_header.site_id=site_file_contents[j].site_id;lut_header.version=1;lut_header.date_built=0;lut_header.time_built=0;lut_header.grid_res=4;lut_header.grid_width=GRID_X_SIZE_4KM;lut_header.grid_height=GRID_Y_SIZE_4KM;lut_header.bin_res=4;lut_header.bin_width=PR_BINS_CR4;lut_header.bin_height=PR_ROWS_CR4;lut_header.projection=1;lut_header.gird_center_phi=phi_center_deg;lut_header.grid_center_lamda=lamda_center_deg;lut_header.radar_phi=phi_radar_deg;lut_header.radar_lamda=lamda_radar_deg;/***用下述方式將lut文件表頭寫到lut文件。*/dos_status=_dos_write(fhw,&amp;lut_header,(size_t)sizeof(lut_header_format),&amp;nwrite);if(dos_status){(void)printf("Errorwritinglutfileheader%s\n",lut_name);return(1);}if(nwrite==NODATA){(void)printf("Errorwritinglutfileheader.nwrite=%d\n",nwrite);return(1);}/***根據表項的編號和每一表項的比特數,計算lut文件內容的大小。*/lut_size=entry*LUT_WIDTH*sizeof(short);/***用下述方式將lut文件件內容寫到lut文件上。*/size_write=huge_fwrite(lut,lut_size,1,fhw);if(size_write==NODATA){(void)printf("Errorwritinglutfilecontents.\n");return(1);}dos_status=close(fhw);if(dos_status){(void)printf("Errorclosinglutfile%s\n",lut_name);return(1);}}}/***打印表示處理已完成的信息。*/(void)printf("normalterrnination->lookuptablesarecomplete\n\n");return(0);}/******************************************************************函數rnd_off()*去掉實數的尾數,使之簡短。****************************************************************/shortrnd_off(doublefl){shorti;i=(fl<0.0)?(short)ceil(fl-0.5)(short)floor(fl+0.5);return(i);}/****************************************************************/intnex_km2latlon/**名稱nex_km21atlon**說明*該程序將NEXRAD平面內的一個“目標”的x和y距離轉換成以度表示的相應緯度的*經度。*//*------------------------輸入參數----------------------------*//**phi_radar_deg“雷達”緯度(度)*lamda_radar_deg“雷達”經度(度)*zx“目標”與雷達的X距離(以公里表示之)**這里x延向東方向增大。*zy“目標”與雷達隔開的y距離(以公里表示)*這時y延向北的方向增大*//*------------------------------------------------------------*//*------------------------------輸入參數----------------------*//**phi_deg“目標”緯度(度)*lamda_deg“目標”經度(度)*//*------------------------------------------------------------*/{/*------------------------------內部變量----------------------*/doublephi;/*“目標”緯度(弧度)*/doublelamda;/*“目標”經度(弧度)*/doublephi_radar;/*“雷達”緯度(弧度)*/doublelamda_radar;/*“雷達”經度(弧度)*/doubleradius={6380.};/*平均地球半徑(以公里表示)*/doubleconstant={135.};/*常數*/doubledeg2radians={M_PL/180.};/*將度轉換成弧度*/doublezp;/*中間項*/doublezsin_theta;/*中間項*/doublezcos_theta;/*中間項*/doublezsin_s;/*中間項*/doublezcos_s;/*中間項*/doublezsin_phi;/*中間項*/doublezcos_phi;/*中間項*/doublelamda_delta;/*中間項*//*-------------------------------------------------------------------------*/doublezx;doublezy;doublephi_radar_deg;doublelamdar_adar_deg;doublephi_deg;doublelamda_deg;/***從l_coords結構獲取雷達緯度/經度(以度表示)*/phi_radar_deg=l_coords->phi_org;lamda_radar_deg=l_coords->lamda_org;/***從l_coords結構獲取目標位置(以公里表示)*/zx=l_coords->dx;zy=l_coords->dy;/*檢查與雷達位置隔開的x和y距離*/if((zx>-0.1)&amp;&amp;(zx<0.1))&amp;&amp;((zy>-0.1)&amp;&amp;(zy<0.1))){/***這處理的x和y距離接近零的情況(目標基本上處在雷達處)將目標緯度和經度(以度表**示)設置成雷達緯度的經度(以度表示)*/phi_deg=phi_radar_deg;lamda_deg=lamda_radar_deg;}else{/***這里處理的是x和y距離不接近零時的情況(目標不處在雷達處),計算目標緯度和經度。**首先,將雷達緯度和經從度轉換成弧度。*/phi_radar=phiradar_deg*deg2radians;lamda_radar=lamda_radar_deg*deg2radians;/*計算與目標的距離(以公里表示)*/zp=sqrt(zx*zx)+(zy*zy));/*計算與目標所成角的正弦和余弦*/zsin_theta=(zx/zp);zcos_theta=(zy/zp);/**計算從雷達位置到目標位置角度大圓距離的中間正弦和余弦項。*/zsin_s=((zp/radius)*(1.0-((constant*zp)/(radius*radius))));zcos_s=sqrt(1.0-(zsin_s*zsin_s));/**計算目標緯度的中間正弦和余弦項。*/zsin_phi=(sin(phi_radar)*zcos_s+cos(phi_radar)*zsin_s*zcos_theta);zcos_phi=sqrt(1.0-(zsin_phi*zsin_phi));/*計算目標與雷達經度之差*/lamda_delta=asin(zsin_s*zsin_theta/zcos_phi);/*計算目標緯度和經度(以弧度表示)*/phi=atan2(zsin_phi,zcos_phi);larnda=lamda_radar+lamda_delta;/*將緯度和經度從弧度轉換成度。*/phi_deg=(phi/deg2radians);lamda_deg=(lamda/deg2radians);}/***將緯度/經度(以)度表示)賦值成l_coords結構。*/l_coords->phi_value=phi_deg;l_coords->lamda_value=lamda_deg;/***返回-零值*/return(0);}/*************************************************************/intnex_latlon2km(coords*l_coords)/**名稱nex_latlon2km**說明*該程序將NEXRAD平面內的“目標”的緯度和經度轉換成以公里表示的x距離分量和*y距離分量。*/{/*---------------------------------輸入參數--------------------------*/doublephi_deg;/*“目標”緯度(度)*/doublelamda_deg;/*“目標”經度(度)*/doublephi_radar_deg;/*“雷達”緯度(度)*/doublelamda_radar_deg;/*“雷達”經度(度)*//*------------------------------------------------------------------*//*---------------------------------輸出參數-------------------------*/doublezx;/*“目標”與雷達的x距離(以公里表示)*//*這里x延向東方向增大。*/doublezy;/*“目標”與雷達的y距離(以公里表示)*//*這里y延向北方向增大。*//*------------------------------------------------------------------*//*---------------------------------內部變量-------------------------*/doublephi;/*“目標”緯度(度)*/doublelamda;/*“目標”經度(度)*/doublephi_radar;/*“雷達”緯度(度)*/doublelamda_radar;/*“雷達”經度(度)*/doubleradius={6380.};/*平均地球半徑(以公里表示)*/doubleconstant={135.};/*常數*/doubledeg2radians={M_PI/180.};/*將度轉換成弧度*/doublezterma;/*中間項A*/doubleztermb;/*中間項B*/doublezsin_s;/*中間項角度大圓的正弦*/doublezcos_s;/*中間項角度大圓的余弦*/doublezd;/*中間項D。*//*-----------------------------------------------------------------*/phi_deg=l_coords->phi_value;lamda_deg=l_coords->lamda_value;phi_radar_deg=l_coords->phi_org;lamda_radar_deg=l_coords->lamda_org;/*將雷達緯度從度轉換成弧度。*/phi_radar=deg2radians*phi_radar_deg;/*將雷達經度從度轉換成弧度*/lamda_radar=deg2radians*lamda_radar_deg;/將目標緯度從度轉換成弧度*/phi=deg2radians*phi_deg;/*將目標經度從度轉換弧度*/lamda=deg2radians*lamda_deg;/*計算中間項a和b*/zterma=cos(phi)*sin(lamda-lamda_radar);ztermb=((cos(phiradar)*sin(phi))-(sin(phi_radar)*cos(phi)*cos(lamda-lamda_radar)));/*計算從雷達位置到目標位置的角度大圓距離的中間正弦和余弦。*/zsin_s=sqrt((zterma*zterma)+(ztermb*ztermb));zcos_s=sqrt(1-(zsin_s*zsin_s));/*計算中間項D*/zd=(constant*zsin_s)+radius;/*計算×距離(以公里表示)*/zx=zd*cos(phi)*sin(lamda-lamda_radar);/*計算y距離(以公里表示)*/zy=zd*(sin(phi)-(sin(phi_radar)*zcos_s))/cos(phi_radar);l_coords->dx=zx;l_coords->dy=zy;/***返回到零值*/return(0);}/*************************************************************************************/intnex_latlon2bin(coords*l_coords){shortbin_x,bin_y;intstatus;doublezx,zy;/***用下述方式將緯度/經度轉換成NEXRAD坐標系統中的公里。*/status=nex_latlon2km(l_coords);if(status){return(1);}zy=l_coords->dx;2y=l_coords->dy;/***將x和y距離分量從公里轉換成數據箱坐標。當浮點值賦值成整數變量時,去掉浮點值的**尾數。*/bin_x=rnd_off((zx+462.)/4.0);bin_y=rnd_off(462.-zy)/4.0);/***將x和y箱坐標賦值成l_coords結構。*/l_coords->x=bin_x;l_coords->y=bin_y;/***檢查x,y箱坐標是否處理在確定返回值的有效范圍內。一非零返回值表示緯度經度對應**于無效x,y箱坐標。*/if((bin_x>=MIN_X)&amp;&amp;(bin_x<PR_BINS_CR4)&amp;&amp;(bin_y>=MIN_Y)&amp;&amp;(bin_y<PR_ROWS_CR4)){/***這是處理有效x,y箱值。返回一零值。*/return(0);}return(2);}/*******************************************************************/int_l_c_latlon2grid(coords*l_coords){shortgrid_x,grid_y;intstatus;doublezx,zy;doubleboxsize={4.0};/***用Lambert保角投影將到來緯度經度轉換成以(標稱)公里表示的距離。*/status=l_c_latlon2km(l_coords);if(status){/***如果出現無效狀態,則從具有非零狀態的程序返回。*/return(1);}/***從l_coords結構獲x,y距離分量*/zy=l_coords->dx;zy=l_coords->dy;/***將x,y距離分量轉換成網格x,y坐標。**當從浮點轉換成整數時,去掉這些值的尾數。*/grid_x=md_off(zx/boxsize)+GRID_X_HALF_4KM;grid_y=GRID_Y_HALF_4KM-rnd_off(zy/boxsize);/***用下述方法將網格x,y坐標賦值成l_coords結構。*/l_coords->x=grid_x;l_coords->y=grid_y;/***檢查網格x,y坐標值是否代表了一有效陣列指數。非零值產生一非零返回。*/if((grid_x>=MIN_X)&amp;&amp;(grid_x<GRID_X_SIZE_4KM)&amp;&amp;(grid_y>=MIN_Y)&amp;&amp;(grid_y<GRID_Y_SIZE_4KM)){/***這里處理一有效網格x,y坐標值。返回一零值。*/return(0);}return(2);}/*******************************************************************/intnex_bin2latlon(coords*l_coords){shortbin_x,bin_y;intstatus;doublezx,zy;doublerange;/***從l_coords結構獲取NEXRAD數據箱坐標。*/bin_x=l_coords->x;bin_y=l_coords->y;/***檢查有效陣列指數值的網格x,y坐標對。一非有效坐標號致從程序的非零返回。*/if(bin_x>=MIN_X)&amp;&amp;(bin_x<PR_BINS_CR4)&amp;&amp;(bin_y>=MIN_Y)&amp;&amp;(bin_y<PR_ROWS_CR4)){/***將箱網格x,y坐標轉換成網格x,y距離分量,結果是一對俘點值。*/zx=((bin_x*4.0)-462.0);zy=(-((bin_y*4.0)-462.0));/***用距離分量計算以公里表示的范圍。*/range=sqrt(zx*zx)+(zy*zy));/***檢查該范圍,以確保其處在NEXRAD范圍內。否則返回一非零值。*/if(range<max_range){/***這處理式EXRAD范圍內的坐標。將x,y距離分量賦值成l_coords陣列。*/l_coords->dx=zx;l_coords->dy=zy;/***用下述程序計算點的緯度/經度,將NEXRAD平面內的x,y距離轉換成緯度/經度(以度表示)*/status=nex__km2latlon(l_coords);if(status){/***這里處理表示經過非有效坐標面返回的非零狀態。返回一非零狀態值。*/return(3);}/***這表示計算了有效緯度/經度。返回零值。*/return(0);}return(1);}return(2);}/*******************************************************************/intl_c_grid2latlon(coords*l_coords){shortgrid_x,grid_y;intstatus;doublezx,zy;doubleboxsize={4.0};/***從l_coords結構獲取網格x,y坐標。*/grid_x=l_coords->x;grid_y=l_coords->y;/***檢查網格x,y坐標是有效陣列指數否則返回一非零狀態。*/if((grid_x>=MIN_X)&amp;&amp;(grid_x<GRID_X_SIZE_4KM)&amp;&amp;(grid_y>=MIN_Y)&amp;&amp;(grid_y<GRID_Y_SIZE_4KM)){/***這處理的有效網格x,y坐標。將網格x,y坐標轉換成以(標稱)公里表示的x,y距離**分量。y坐標被反向。然后將距離分量賦值成l_coords結構。*/zx=(grid_x-GRIDX_HALF_4KM)*boxsize;zy=(GRID_Y_HALF_4KM-grid_y)*boxsize;l_coords->dx=zx;l_coords->dy=zy;/***用下述程序,用Lambert保留投影將(用公里表示的)x,y距離分量轉換成**緯度/經度。*/status=l_c_km2latlon(l_coords);if(status){/***這里處理的是出現無效情況時的情況。返回一非零值。*/return(2);}/***這里處理有效情況,并返回一零值。*/return(0);}return(1);}/*****************************************************************函數l_c_latlon2km()*用lambert保留將緯度/經度轉換成x/y****************************************************************//*將緯度/經反轉換成x/y*/intl_c_latlon2km(coords*l_coords){staticdoubledeg2radians={M_PI/l80.};/*將反轉換成弧度*/staticdoublephi_1_deg={33};/*標準緯度1(以度表示)*/staticdoublephi_2_deg={45};/*標準緯度2(以度表示)*/staticdoubleradius={6380.};/*平均地球半徑(以公里表示)*/staticdoublephi_0_eg={38.0};/*網格原點緯度(以度表示)*/staticdoublelamda_0_deg={-98.0};/*網格原點經度(以度表示)*//***對上面定義的網格中心、地球半球半徑和標準緯度,計算下面的常數。在沒有重新**計算這些常數時,不要將該程度用于其它中心。*/staticdoublephi_1={0.575958653158129};/*標準緯度1(以弧度表示)*/staticdoublephi_2={0.785398163397448};/*標準緯度2(以弧度表示)*/staticdoublephi_0={0.663225115757845};/*網格原點緯度(以弧度表示)*/staticdoublelamda_0={-1.710422666954443};/*網格原點經度(以弧度表示)*/staticdoublerho_0={7931.823624772932817};staticdoublen={0.630477697315427};staticdoublef={1.955000201593793};staticdoublerf={12472.901286168398656};/*中間項=(radins*f)*/doublephi_deg;doublelamda_deg;doublezx;doublezy;doublerho;doubletheta;doublephi;/*當前緯度值(弧度)*/doublelamda;/*當前經度值(弧度)*//***從l_coords結構獲取目標(以度表示)的緯度和經度*/phi_deg=l_coords->phi_value;lamda_deg=l_coords->lamda_value;/***將目標的緯度和經度從反轉換成弧度。*/phi=phi_deg*deg2radians;lamda=lamda_deg*deg2radians;tho=(rf/(pow(tan(M_PI_4+(phi/2)),n)));theta=n*(lamda-lamda_0);/***計算x和y距離分量(以標稱公里表示)*/zx=(rho*sin(theta));zy=(rho_0-rho*cos(theta));/***將x,y距離分量(以標稱公里表示)賦值成l_coords結構。*/l_coords->dx=zx;l_coords->dy=zy;/***返回一零值*/return(0);}/*************************************************************/intl_c_km21atlon(coords*l_coords)/**名稱l_c_km2latlon**說明*該程度將“目標”的x和y距離分量在Lanbert保角投影下轉換成以反表示的*緯度和經度。**//*-----------------------輸入參數------------------------------*//**zx目標與雷達的x距離(以公里表示)*//*這里x延向南方向增大*//*/**zy"“目標”與雷達的y距離(以公里表示)/*/*這里y延向北方向增大*//*--------------------------------------------------------------*//*------------------------輸出參數------------------------------*//*phi_deg“目標”緯度(度)*//*lamda_deg“目標”經度(度)*//*------------------------------------------------------------------*/{staticdoublephi_l={0.575958653158129};/*標準緯度(以弧度表示)*/staticdoublephi_2={0.785398163397448};/*標準緯度(以弧度表示)*/staticdoublephi_0={0.663225115757845};/*網格原點緯度(以弧度表示)*/staticdoublelamda_0={-1.710422666954443};/*網格原點經度(以弧度表示)*/staticdoublerho_0={7931.823624772932817};staticdoublen={0.630477697315427};staticdoublef={1.955000201593793};staticdoublerf={12472.901286168398656};/*中間項=(radius*f)*/staticdoubleradius={6380.};/*平均地球半徑(以公里表示)*/staticdoubledeg2radians={M_PI/180.};/*將反轉換成弧度*/staticdoublephi_l_deg={33};/*標準緯度1(以度表示)*/staticdoublephi_2_deg={45};/*標準經度2(以度表示)*/staticdoublephi_0_deg={38.0};staticdoublelamda_0_deg={-98.0};/*----------------------------內部變量---------------------------*/doublephi;/*“目標”緯度(弧度)*/doublelamda;/*“目標”經度(弧度)*/doublerho;doubletheta;doublezx,zy;doublephi_deg;doublelamda_deg;/*---------------------------------------------------------*//***從l_coords結構獲取目標距離(以公里表示)。*/zx=l_coords->dx;zy=l_coords->dy;rho=sqrt((zx*zx)+((rho_0-zy)*(rho_0-zy)));/***計算緯度,以弧度表示。*/phi=((2*atan(pow((rf/rho),(1/n))))-M_PI_2);theta=atan2(zx,(rho_0-zy));/***計算經度,以弧度表示。*/lamda=((theta/n)+lamda_0);/***將緯度/經度從弧度轉換成度*/phi_deg=phi/deg2radians;lamda_deg=lamda/deg2radiaus;/***將緯度和經度(以度表示)賦值成l_coords結構。*/l_coords->phi_value=phi_deg;l_coords->lamda_value=lamda_deg;/***返回一零值。*/return(0);}/***將一大陣列的內容寫成一文件的函數*//*************************************************************/longhuge_fwrite(void_huge*buffer,longlength,size_tcount,intfhw)/***說明將一大陣列的內容寫成一文件的函數*/{char_huge*pnt_buffer;longremain;size_tamount;size_tnwrite;longtotal;unsignedintdos_status;pnt_buffer=buffer;remain=length;total=0;while(remain>0){if(remain>MAXWRITE){amount=MAXWRITE;remain-=(long)amount;dos_status=_dos_write(fhw,pnt_buffer,amount,&amp;nwrite);if(dos_status){(void)printf("dos_writebadstatus\n");return(0);}pnt_buffer+=amount;total+=nwrite;if(nwrite==0){return(total);}}else{amount=(size_t)remain;remain=0;dos_status=_dos_write(fhw,pnt_buffer,amount,&amp;nwrite);if(dos_status){(void)printf("dos_writebadstatus\n");return(0);}pnt_buffer+=amount;total+=(long)nwrite;if(nwrite==0){return(total);}}}return(total);}]]></pre>圖9A、9B、9C和9E一起給出描述能夠建立雷達數據的嵌拼地圖的結構圖或流程圖。圖9A-9E所示的程序設計用來按圖8A-8E所示的脫機程序建立的查詢表實時運行。啟動時,圖9A-9E所示的程序作為一連續過程進行運行。如圖9A所示,含有要在嵌拼地圖中使用的站表而手工產生的配置文件200用來使步驟201和202處的過程初始化。首先,該過程從配置文件200讀取站號和隨后要存儲到存儲器中供以后使用的站表(步驟202)。接著,進入循環(步驟203),連續運行(圖9B中示為所謂的“永遠運行”循環)。循環的每一次執行都導致產生新的嵌拼地圖,該新的嵌拼地圖是從站表中指定的各個站得到的最最當前的數據的匯集。在準備產生嵌拼地圖時,計算機存儲器中所有的二維網格元素都設置(步驟204)為同樣的預定值,例如設置為零(即網格被清除了任何存在的數據)。接著,設置索引“至站表中的當前站”(步驟205),以指向該表上的第一站。接著,進入另一個循環,一次一個地處理該站表上的雷達站(步驟206),直到所有的站(步驟207)均被處理為止。。通過從站表獲取站識別號(步驟220)接著使站索引號遞增一(步驟221),如圖9B所示,每一雷達站的處理開始。站識別號被程序用來確定計算機本地數據庫46中當前站的數據位置(步驟222)。如果沒有用于當前站的數據(步驟223),則程序跳到下一個站。否則,程序識別用于該站的最當前的數據。該數據(稱為產物)停留在本地數據庫46中的文件(雷達產物數據225)內。首先,文件被打開(步驟224),并將產物“表頭”讀入到程序的存儲器中(步驟226)。表頭包含諸如數據日期和時間以及產物數據長度之類的信息。通過檢查產物數據和時間,如果數據被判定為太舊(步驟227)了,則程序跳過該站并進入到下一站。否則,采用該數據長度,將文件225留下的內容讀入到計算機存儲器中(步驟228),并且隨后關閉產物文件225(步驟229)。接著,如圖9C所示,產物數據被譯碼,并存儲到二維“光柵”陣列中。如果在譯碼過程中檢測到差錯,則程序跳到下一個站(步驟242)。當產物被成功譯碼以后,程序采用當前雷達站識別號來確定計算機本地數據庫46中恰當查詢表文件的位置(步驟243)。首先,查詢表文件245被打開,并將表頭(包含表表項的編號)讀入到程序存儲器內。程序接著采用表表項的編號,從文件245讀入完整的查詢表,該表隨后被存儲到程序存儲器中。該查詢表文件245接著關閉(步驟248)。圖9D給出的是一旦讀入了查詢表時,單基站雷達數據是如何賦值到二維網格中去的。進入一個循環,以處理查詢表中的所有表項(步驟260)。當完成了所有的處理以后,程序進行到下一站(步驟261)。首先,從查詢表獲取進入二維產物光柵陣列中的x和y索引(步驟262),并檢查有效性(步驟263)。(實踐中應永不出現無效表項,但如果出現,則程序跳過該表項,并進入到下一個表項。)接著從產物數據陣列獲取產物數據值(步驟264)。隨后,從查詢表獲取進入到二維嵌拼地圖網格內的x和y索引(步驟266)。(再次指出,實踐中應永遠不出現無效表項,但如果檢測到無效表項,則程序跳到下一個表項。)接著,檢查產物數據值的有效性(步驟267),并且任何的無效數據值都使程序跳到下一個查詢表表項。隨后,產物值與現存的網格值比較,并且如果產物值大,則賦值到x,y位置處的網格,而如果不大,則跳過。對于查詢表中其余所有表項以同樣的方式繼續進行處理。在這樣處理了所有存在的站以后,網格中的數據被變換成如圖9E所示新的產物。首先,將網格中的值轉換成輸出產物格式(步驟280),并賦值到計算機存儲器中的一個緩沖器。隨后,同樣也在含有當前日期和時間以及產物數據長度的計算機存儲器中建立表頭(步驟281)。產生(步驟283)唯一的輸出文件名,并打開該名稱的文件用以輸出(步驟283)。接著,將數據實際上寫到輸出產物文件284。首先,寫產物表頭(步驟285),后跟產物數據本身(步驟286)。最后,關閉輸出產物文件284,并且程序繼續開始下一個嵌拼地圖。用上述給出的軟件而構造的一個或多個預先構成的查詢表直接將各個雷達數據值映射到嵌拼地圖網格可以用軟件來實施。下面的幾頁中給出一例用C語言的ANSI版本寫的這樣一個軟件,可用于SunMicrosystem工作站。但是,也可以采用其他的編程語言來實現。圖9A-9E一起給出用于該軟件的流程圖。下面幾頁中給出的軟件實施圖4所示的步驟48和50。上述軟件以及下述軟件一起實施圖3所示的步驟34、36、38和40。<prelisting-type="program-listing"><![CDATA[/**************************************************UNISYSWIS嵌拼地圖處理系統**Unisys公司1994年版權****程序名稱BUILD.EXE****說明讀入各雷達產物和相應的查詢表,并將產物數據映射至一網格。**然后獲取產生的網格值并產生一新的產物****假設用于所要求站的產物在指定的手冊(directory)內。**用于所要求的站的查詢表在"lut"手冊(directory)內。***************************************************/#include<math.h>#include<errno.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>/***子程序原型*/intget_latest(short,short,char*);#defineBIN_X_IDX0#defineBIN_Y_IDX1#defineGRID_X_IDX2#defineGRID_Y_IDX3#defineLUT_WIDTH4#defineMAX_DATA_SIZE300000#defineNUM_DATA_LEVELS16#defineNODATA0#defineMIN_NUM0#defineMIN_VALUE0#defineNO_VALUE0#defineMIN_X0#defineMIN_Y0#defineGRID_X_SIZE1280#defineGRID_Y_SIZE896#defineLUT_MAX50000#definePR_BINS232#definePR_ROWS232longlut_key={123456};typedefstruct{longkeyword;longnum_entries;shortheader_size;shortsite_id;shortversion;shortdate_built;unsignedlongtime_built;shortgrid_res;shortgrid_width;shortgrid_height;shortbin_res;shortbin_width;shortbin_height;shortprojection;doublegrid_center_phi;doublegrid_center_lamda;doubleradar_phi;doubleradar_lamda;}lut_header_format;lut_header_formatlut_header;typedefstruct{doubledx;doubledy;doublephi_org;doublelamda_org;doublephi_value;doublelamda_value;shortx;shorty;shortpr_id;shortgrid_id;}coords;longsite_key={24680};shortnexrad_site={1};shortrrwds_site={2};shortyes={1};shortno={0};typedefstruct{longkeyword;shorthum_sites;}site_header_format;site_header_format_site_file_header;typedefstruct{shortsite_id;shortsite_flag;shortsite_build_lut;shortsite_use;doublesite_lat;doublesite_lon;}site_contents_format;#defineMAX_SITES200site_contents_formatsite_file_contents[MAX_SITES];FILE*fpw;FILE*fpr;FILE*fpr_prod;char*buf;longdata_size;longnwrite;longnread;staticinterrno=0;typedefstruct{shortsite_id;char*site_text;}site_path_format;#defineNUM_SITE_PATH30/***站通路信息例*/staticsite_path_formatsite_path[NUM_SITE_PATH]={354,"AL_maxwell_AFB/",395,"AR_littlerock/",524,"AZ_phoenix/",347,"CO_denver/",351,"DE_dover/",302,"FL_melbourne/",728,"FL_miami/",337,"IL_chicago/",381,"IN_indianapolis",350,"KS_dodgecity/",366,"KS_goodland/",554,"KS_topeka/",562,"KS_wichita/",349,"MI_detroit",308,"MO_stlouis/″,342,"MS_columbus/",382,"MS_jackson/",367,"NE_hastings/",372,"NY_griffis_AFB/",340,"OH_cleveland/",305,"OK_frederick/",301,"OK_norman/",557,"OK_tulsa/",525,"PA_pittsburgh/",313,"TX_amarillo/",332,"TX_central/",353,"TX_dyess_AFB/",378,"TX_houston/",303,"VA_sterling/",000,"UNDEFINED/",};typedefstruct{shortprod_id;char*prod_text;}prod_path_format;#defineNUM_PROD_PATH1staticprod_path_formatprod_path[NUM_PROD_PATH]={38,"COMP_REF/",};/***建立鑲嵌的主程序*/main(){#defineinitial_x0#defineinitial_y0intstatus;unsignedshort*index;unsignedshort*st_index;unsignedcharbyte;shortn_bytes;shortrun,col;char*cp;unsignedshortlength1,length2;shortk,m;shortp;shortbin;unsignedinttime1,time2;time_ttot_sec;unsignedshortopcode;shortmsg_code;shortinput_source_id;shortoutput_source_id;shortop_mode;shortvcp;shortnrows;longlut_size;longage_minutes;staticlongmax_age_minutes={15};longage_seconds;shortgrid_x;shortgrid_y;shortnum_sites;shortsite_id;shortprod_id;shortj;shortheader_size={136};shortproduct[PR_BINS][PR_ROWS];unsignedshortgrid[GRID_X_SIZE][GRID_Y_SIZE];shortrow;shortbox,box_y;shortrow_index;shortbin_index;shortmax_col;shortnumber_rows;shortnumber_bins;shortstart_bin;shortstart_row;charlut_name[512];charprod_name[512];charprod_file[25];char*s;shortlut[LUT_MAX][LUT_WIDTH];longentry;longnum_entry;shortprev_col;shortnbytes;longlayer_length;longlayer2_ength;longblock_length;longmessage_length;longtotal_length;shortscale_x,scale_y;unsignedshort*nbytes_index;unsignedshort*msw_layer_len_index;unsignedshort*lsw_layer_len_index;unsignedshort*msw_layer2_len_index;unsignedshort*lsw_layer2_len_index;unsignedshort*msw_block_len_index;unsignedshort*lsw_block_len_index;unsignedshort*msw_msg_len_index;unsignedshort*lsw_msg_len_index;unsignedshortmsw_layer_len;unsignedshortlsw_layer_len;unsignedshortmsw_layer2_len;unsignedshortlsw_layer2_len;unsignedshortmsw_block_len;unsignedshortlsw_block_len;unsignedshortmsw_msg_len;unsignedshortlsw_msg_len;shortref;shortdl;/***賦值成輸出產物表頭的數據級編碼*/staticunsignedshortdata_level_16[NUM_DATA_LEVELS]={0x8002,0x0005,0x000a,0x000f,0x0014,0x0019,0x001e,0x0023,0x0028,0x002d,0x0032,0x0037,0x003c,0x004l,0x0046,0x004b};shortpr_type;unsignedshortproduct_color;unsignedshortgrid_color;shortflag_off={0};shortflag_on={1};shortnum;shortprid;shortdestination_id;shortnum_blocks;shortdivider;longlatitude_origin;longlongitude_origin;doublephi_center_deg={38.0};doublelamda_center_deg={-98.0};doublelat_origin_deg;doublelon_origin_deg;unsignedshortmsw_latitude;unsignedshortlsw_latitude;unsignedshortmsw_longitude;unsignedshortlsw_longitude;shortheight_value;shortsequence_num;shortscan_num;shortelevation_num;shortsym_block_id;shortnum_layers;unsignedshortraster_opcode;unsignedshortraster_const1;unsignedshortraster_const2;unsignedshortraster_const3;char*out_str_home="/home/";char*out_sgr_site="NATIONAL/";shortnum_included;shortnum_excluded;shortn;shorttab_included[MAX_SITES];shorttab_excluded[MAX_SITES];shortyear,month,day;longtime_sec;longseconds;longcur_seconds;shorthour,minute;shorthh,mm;longss;structtmJan_01_1970_struct={0};/*Initializeallfieldsto0.*/time_tJan_01_1970_t;time_tgmt_t;time_total_time;structtmgmt_struct;shortj_date;shortcur_j_date;shortmsg_date;longmsg_time;unsignedshortmsw_msg_time;unsignedshortlsw_msg_time;shortscan_date;longscan_time;unsignedshortmsw_scan_time;unsignedshort_lsw_scan_time;shortgeneration_date;longgeneration_time;unsignedshortmsw_generation_time;unsignedshortlsw_generation_time;union{longl_value;shorts_value[2];}long2short;/***獲得讀入現有產物且建立新產物并從中存入的緩沖器.*/buf=(char*)malloc(MAX_DATA_SIZE);if(buf==NULL){(void)printf("errormallocfailedforbuf,errno=%d\n",errno);return(1);}/***打開配置文件,并讀入表頭。*/fpr=fopen("config.dat","rb");if(fpr==NULL){(void)printf("fopenerrorforconfigurationfileheader,errno=%d\n",errno);return(1);}nread=fread(&amp;site_file_header,sizeof(site_fileheader),1,fpr);if(nread==NODATA){(void)printf("freaderrorwithsitefileheader,errrno=%d\n",errno);return(1);}/***檢查用于正確關鍵詞的配置文件表頭,并且如果關鍵字不一致時,退出程序。*/if(site_file_header.keyword!=site_key){(void)printf("Invalidconfigurationfilekeyword\n");return(1);}/***從配置文件標題獲取站編號,并用該編號確定文件內容的大小。從結構文件讀配置內**容,這提供了站表,并且表示哪些是NEXRAD哪些是活動的(將用在嵌拼地圖中)。*/num_sites=ske_file_header.num_sites;nread=fread(site_file_contents,num_sites*sizeof(site_contents_format),1,fpr);if(nread==NODATA){(void)printf("errorreadingconfigurationfilecontents,errno=%d\n",errno);return(1);}status=fclose(fpr);if(status!=0){(void)printf("errorclosingconfigurationfile,errno=%d\n",errno);}while(1)/*DOFOREVER*/{/***獲得自1970年1月1日以來以秒表示的當前時間,用來確定它們從數據庫被讀取時,**現有產物的年代。*/Jan_01_1970_struct.tm_year=70;Jan01_1970_struct.tm_mon=0;Jan_01_1970_struct.tm_mday=0;Jan_01_1970_t=mktime(&amp;Jan_01_1970_struct);if(Jan_01_1970_t==(time_t)-1){(void)printf("errormktime(1/1/70)error.\n");return(1);}total_time=time(NULL);gmt_struct=*gmtime(&amp;total_time);year=gmt_struct.tm_year;if(year>99){year-=100;}month=gmt_struct.tm_mon+1;day=gmt_struct.tm_mday;hour=gmt_struct.tm_hour;minute=gmt_struct.tm_min;(void)printf("Current(gmt)year=%dmonth=%dday=%dhour=%dmin=%d\n",year,month,day,hour,minute);gmt_t=mktime(&amp;gmt_struct);if(gmt_t==(time_t)-1){(void)printf("errormktime(gmt)error.\n");return(1);}else{time_sec=difftime(gmt_t,Jan_01_1970_t);cur_j_date=time_sec/86400;cur_seconds=time_sec%86400;}/***使計算器初始化,以跟蹤嵌拼地圖中包括和除去的站。*/num_included=0;num_excluded=0;/***清除其中要建嵌拼地圖的網格*/for(grid_y=MIN_Y;grid_y<GRID_Y_SIZE;grid_y++){for(grid_x=MIN_X;grid_x<GRID_X_SIZE;grid_x++){grid[grid_x][grid_y]=NO_VALUE;}}/***下面是讀入各個NEXRAD產物并將數據映射成大網格的主循環。通過這些站**的循環包含在該結構中。*/for(j=MIN_NUM;j<num_sites;j++){/***從配置文件數據獲取請求的站標識。*/site_id=site_file_contents[j].site_id;/***這里處理NEXRSD數據,請求合成反射率。*/prod_id=38;/***用下述方法找到通往用于指定站的指定類型的最新產物的路徑。一非零狀態碼表示**沒有產物。因此跳到下一個*/status=get_latest(site_id,prod_id,prod_name);prod_name[strlen(prod_name)-1]=′\0′;if(status){(void)printf("productisunavailable.\n");num_excluded++;tab_excluded[num_excluded-1]=site_id;gotojump_here;}/***用通往最新者的路徑打開產物文件*/fpr_prod=fopen(prod_name,"rb");if(fpr_prod==NULL){(void)printf("Unabletoopenproduct.site=%d\n",site_id);num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***讀入產物標題/*nread=ftead(buf,header_size,1,fpr_prod);if(nread==NODATA){(void)printf("productreaderror,errno=%d\n",errno);numexcluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***從產物表示獲取數據。首先是在緩沖器開頭處存在的開始指數的位置。*/st_index=(unsignedshort*)buf;index=st_ndex;msg_code=*index;/***從產物表頭獲取運算模式和體積覆蓋方式。用該信息檢查雷達是否處在一有效模式下。**如果雷達處在維護模式下,則跳過該產物,并跳到(進入)循環的結束處。*/index=st_index+16;op_mode=*index;index=st_index+17;vcp=*index;if((op_mode!=1)&amp;&amp;(op_mode!=2)){(void)printf("invalidop_mode=%dvcp=%d\n",op_mode,vcp);num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***獲取輸入產物站標識率。與請求的站標識率比較。如果獲取和請求的站標識號不一致,**則報告差錯,并跳到(進入)下一個站的產物。*/index=st_index+6;input_source_id=*index;if(site_file_contents[j].site_id!=input_source_id){(void)printf("requested(%d)product(%d)sitemismatch\n",site_id,input_source_id);num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***從產物表頭獲取日期(自1970年1月1日以來以天計)和時間(秒),用這一信息**確定自1970年1月1日以來以秒計算的總時間。這用來與正確的時間比較,以確定**產物的“年代”。*/index=st_index+20;j_date=*index;index=st_index+21;time1=*index;index=st_index+22;time2=*index;tot_sec=(j_date*86400)+(time1*65536)+time2;if(tot_sec>time_sec){age_minutes=0;}else{age_seconds=time_sec-tot_sec;age_minutes=age_seconds/60;}/***檢查產物的年代。如果產物太老,則跳到下一個站。*/if(age_minutes>max_age_minutes){(void)printf("productistoooldage_minutes=%d\n",age_minutes);numexcluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***確定數據層的長度(以比特表示)*/index=st_index+66;length1=*index;index=st_index+67;length2=*index;data_size=(long)((length1*65536)+length2);if(data_size>MAX_DATA_SIZE){(void)printf("productdatasizetoolargetoread");num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***用下述方法讀入其余的產物。*/nread=fread(buf,data_size,1,fpr_prod);if(nread==NODATA){(void)printf("errorreadingproductfile,errno=%d\n",errno);num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}status=fclose(fpr_prod);if(status!=0){(void)printf("errorclosinginputproductfile,errrno=%d\n",errno);return(1);}/***確定運行長度編碼的光柵數據的位置,并獲取opcode,并檢查其有效性。*/st_index=(unsignedshort*)buf;index=st_index;opcode=*index;if(opcode!=0xba07){(void)printf("errorinvalidrasteropcodeininputproduct=%x\n",opcode);num_excluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}/***從產物數據層獲取行數*/index+=9;nrows=*index;/***指向運行長度偏碼的光柵數據的第一行。*/index+=2;/***檢查有效行數*/if((nrows>MIN_Y)&amp;&amp;(nrows<=PR_ROWS)){/***通過光柵數據行的循環*/for(row=MIN_Y;row<nrows;row++){n_bytes=*index;index++;cp=(char*)index;bin=NO_VALUE;/***通過當前行中RLE數據的比特。*/for(m=1;m<=n_bytes;m++){/***獲取當前比特,并確定運行和顏色*/byte=*(cp);cp++;run=((short)byte)/16;col=((short)byte)%16;if(run>0){for(k=MIN_Y;k<run;k++){if((bin<PR_BINS)&amp;&amp;(row<PR_ROWS)){product[bin][row]=col;}else{/***在箱或行數超過陣列極限的非尋常情況下,報告差錯,并跳到下一站的產物。*/(void)printf("errorbin=%drow=%d\n",bin,row);numexcluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}bin++;}}}index=(unsignedshort*)cp;}}else{(void)printf("errorproductinvalidnumberofrows=%d",nrows);numexcluded++;tab_excluded[num_excluded-1]=site_id;pintf("path=%s\n",prod_name);gotojump_here;}/***接著,打開并讀入查詢表文件。首先,產生包含表(lut)文件名(根據站號)的串,**并打開用于“讀二進制”的lut文件。*/(void)sprintf(lut_name,"lut/cr4_%3.3d.lut\O",site_file_contents[j].site_id);fpr=fopen(lut_name,"rb");if(fpr==NULL){(void)printf("errorerroropeninglutfile(%s)forread,errno=%d\n",lut_name,errno);num_excluded++;tab_excluded[num_excluded-1]=site_id;gotojump_here;}/***接著,讀入查詢表(lut)文件表頭從中獲聚表項偏號,用來計算lut內容的大小**(lut大小)同時,檢查關鍵詞和表頭大小,以檢查讀入了一有效“lut”表頭。*/nread=fread(&amp;lut_header,sizeof(lut_header_format),1,fpr);if(nread==0){(void)printf("errorreadinglutfile,errno=%d\n",errno);numexcluded++;tab_excluded[num_excluded-1]=site_id;printf("path=%s\n",prod_name);gotojump_here;}num_entry=lut_header.num_entries;if(hum_entry>LUT_MAX){num_entry=LUT_MAX;}if(lut_header.keyword!=lut_key){(void)printf("invalidlutkeyword=%d\n",lut_header.keyword);num_entry=0;}if(lut_header.header_size!=sizeof(lut_header_format){(void)printf("invalidlutheadersize=%d\n,lut_header.header_size);num_entry=0;}lut_size=num_entry*LUT_WIDTH*sizeof(short);/***進行讀,以讀入lut本身。*/nread=fread(lut,lut_size,1,fpr);/***因為已經讀入了lut,因此關閉文件說明符。*/status=fclose(fpr);if(status!=0){(void)printf("errorerrorclosinglookuptablefile,errno=%d\n",errno);return(1);}/***通過查詢表中所有表項的循環,并將雷達數據映射成網格框。/*for(entry=MIN_NUM;entry<num_entry;entry++){/***獲取當前雷達產物的箱和行坐標*/bin=lut[entry][BIN_X_IDX];row=lut[entry][BIN_Y_IDX];/***檢查箱和行在產物數據陣列中是有效指數(即,它們是有效的)*/if((bin>=MIN_X)&amp;&amp;(bin<PR_BINS)&amp;&amp;(row>=MIN_Y)&amp;&amp;(row<PR_ROWS)){/***從用于當前臬和行的產物陣列獲取產物顏色(數據級)*/product_color=product[bin][row];/***獲取相應的x和y網格坐標。*/grid_x=lut[entry][GRID_X_IDX];grid_y=lut[entry][GRID_Y_IDX];/***檢查當前x和y網格坐標,以驗證這些值是有效的陣列指數。 */ if((grid_x>=MIN_X)&amp;&amp;(grid_x<GRID_X_SIZE)&amp;&amp;(grid_y>=MIN_Y)&amp;&amp;(grid_y<GRID_Y_SIZE)){/***檢查某一值的現有網格框*/if(grid[grid_x][grid_y]==NO_VALUE){grid[grid_x][grid_y]=product_color;}else{/***在現有網格中現有值的情況下,在現有網格值和當前產物顏色值之間需要進行比較。**當其大于現有網格顏色值時,映射該產物顏色。*/grid_color=grid[grid_x][grid_y];if(product_color>grid_color){grid[grid_x][grid_y]=product_color;}}}else{/***這里處理x,y網格坐標不是有效陣列指數的一種非尋常情況,現在,打印該值,**并進行到下一個lut表項。*/(void)printf("entry=%dgrid_x=%dgrid_y=%d\n",entry,grid_x,grid_y);}}else{/***這里處理產物箱行和列不是一有效陣列指數的非尋常情況。現在,打印該值,**并進入下一個lut表項。*/(void)printf("entry=%dbin=%drow=%d\n",entry,bin,row);}}printf("productintegratedid=%dopmode=%dvcp=%d\n",msg_code,op_mode,vcp);printf("path=%s\n",prod_name);num_included++;tab_included[num_included-1]=site_id;jump_ere;/*這里跳過一產物,并進行到下一站。*/}/***既然將各個站產生處理網格的循環已完成,所以打印包括和不包括的站。*/(void)printf("Sitesprocessingcomplete\n");(void)printf("numberincluded=%d\n",num_included);for(n=0;n<num_included;n++){(void)printf("included=%d\n",tab_included[n]);}(void)printf("numberexcluded=%d\n",num_excluded);for(n=0;n<num_excluded;n++){(void)printf("excluded=%d\n",tab_excluded[n]);}/***產物已被映射成網格。這里建立一嵌拼地圖產物。*/prid=5;/***將指針定位在緩沖器的開頭處,以便準備將數據賦值給緩沖器。 */st_index=(unsignedshort*)buf;index=st_index+0;/***建立包含輸出文件名的串。*/(void)strcpy(prod_name,out_str_home);(void)strcat(prod_name,out_str_site);/***繼續建立產物文件名。下面建立以年、月、日、時、分格式表示的實際文件名。**串接文件名,完成產物路徑名。*/(void)sprintf(prod_file,"%.2d%.2d%.2d.%.2d%.2d\0",year,month,day,hour,minute);(void)strcat(prod_name,prod_file);/***用下述方式打開寫入二進制的產物路徑名。*/fpw=fopen(prod_name,"wb");if(fpw==NULL){(void)printf("fopenforwriteerror,errno=%d\n",errno);return(1);}/***定義指定如何建立產物的參數*/number_rows=896;number_bins=1280;scale_x=1;scale_y=1;start_row=0;start_bin=0;output_source_id=10000;lat_origin_deg=phi_center_deg;lon_origin_deg=lamda_center_deg;/***隨后開始將數據賦值給產物標題(productheader)。每一字段必須得到一個值,以重寫**緩沖器中任一已經存在的數據。*/msg_code=prid;/*Assignthemessagecode*/*index=msg_code;/*它是產物ID。*/index=st_index+1;msg_date=cur_j_ate;/*賦值自1970年1月1日以來以日表示的當前日期。*/*index=msg_date;msg_time=cur_seconds;/*將秒轉換成2個半字(halfwords)。*/long2shon.l_value=msg_time;index=st_index+2;msw_msg_time=long2short.s_value;*index=msw_msg_time;/*賦值當前時間(msw)。*/index=st_index+3;lsw_msg_time=long2short.s_value[1];*index=lsw_msg_time;/*賦值當前時間(lsw)。*/msw_msg_len_index=st_index+4;/*存儲信息長度*/lsw_msg_len_index=st_index+5;/*的位置。*/index=st_index+6;*index=output_source_id;/*賦值源id。*/index=st_index+7;destination_id=NO_VALUE;*index=destination_id;/*賦值目標id(不用的)。*/index=st_index+8;num_blocks=3;*index=num_blocks;/*賦值塊(block)數。*/index=st_index+9;divider=-1;*index=divider;/*賦值塊除數(blockdivider)。*/latitude_origin=(long)(lat_origin_deg*1000.);long2short.l_value=latitude_origin;index=st_index+10;msw_latitude=long2short.s_value;*index=mswlatitude;/*賦值原點緯度(msw).*/index=st_index+11;lsw_latitude=long2short.s_value[1];*index=lsw_latitude;/*賦值原點緯度(lsw).*/longitude_origin=(long)(lon_origin_deg*1000.);long2short.l_value=longitude_origin;index=st_index+12;mswlongitude=long2short.s_value;*index=msw_longitude;/*賦值原點經度(msw).*/index=st_index+13;lsw_longitude=long2short.s_value[1];*index=lsw_longitude;/*賦值原點經度(lsw).*/index=st_index+14;height_value=NO_VALUE;*index=height_value;/*賦值高度值(不用的)。*/index=st_index+15;*index=prid;/*賦值產物標記*/index=st_index+16;op_mode=2;*index=op_mode;/*賦值運算方式值*/index=st_index+17;vcp=NO_VALUE;*index=vcp;/*賦值體積覆蓋方式*/index=st_index+18;sequence_num=NO_VALUE;*index=sequence_num;/*賦值順序號(不用的)*/index=st_index+19;scan_num=NO_VALUE;*index=scan_num;/*賦值體積掃描號(不用的)*/index=st_index+20;scan_date=cur_j_date;*index=scan_date;/*賦值掃描日期*/scan_time=cur_seconds;long2short.l_value=scan_time;index=st_index+21;msw_scan_time=long2short.s_value;*index=msw_scan_time;/*賦值掃描時間(msw).*/index=st_index+22;lsw_scan_time=long2short.s_value[1];*index=lsw_scan_time;/*賦值掃描時間(lsw).*/index=st_index+23;generation_date=cur_j_date;*index=generation_date;/*賦值產生日期*/generation_time=cur_seconds;long2short.l_value=generation_time;index=st_index+24;msw_generation_time=long2short.s_value;*index=msw_generation_time;/*賦值產生日期*/*時間(msw).*/index=st_index+25;lsw_generation_time=long2short.s_value[1];*index=lsw_generation_time;/*賦值產生日期*/*時間(lsw).*/index=st_index+26;*index=NOVALUE;/*依賴于產物的(不用的)。*/index=st_index+27;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+28;elevation_num=NO_VALUE;*index=elevation_num;/*賦值上升號(不用的)*/index=st_index+29;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+30;/*存儲數據的位置*//***賦值一組恰當的數據級值*/for(dl=MIN_VALUE;dl<NUM_DATA_LEVELS;dl++){*index=data_level_16[dl];index++;}index=st_index+46;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+47;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+48;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+49;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+50;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+51;*index=NO_VALUE;/*依賴于產物的(不用的)*/index=st_index+52;*index=number_bins;/*列(箱)數*/index=sr_index+53;*index=NO_VALUE;/*不用*/index=st_index+54;*index=NO_VALUE;/*偏離符號學(msw)。*/index=st_index+55;*index=60;/*偏離符號學(lsw)。*/index=st_index+56;*index=NO_VALUE;/*偏離圖像c(msw)。*/index=st_index+57;*index=NO_VALUE;/*偏離圖像(lsw)。*/index=st_index+58;*index=NO_VALUE;/*偏離表格(msw)。*/index=st_index+59;*index=NO_VALUE;/*偏離表格(lsw)。*/index=st_index+60;/*符號塊的開頭*/divider=-1;*index=divider;/*賦值塊除數*/index=st_index+61;sym_block_id=1;*index=sym_block_id;/*賦值符號量塊標號*/index=st_index+62;msw_block_len_index=index;/*存儲塊大小的位置*/index=st_index+63;lsw_block_len_index=index;index=st_index+64;num_layers=1;*index=num_layers;/*賦值層數*/index=st_index+65;*index=divider;/*賦值層除數*/index=st_index+66;msw_layer_len_index=index;/*存儲層長度的位置*/index=st_index+67;lsw_layer_len_index=index;index=st_index+68;raster_opcode=0xba07;*index=raster_opcode;/*賦值光柵數據格式Opcode*/index=st_index+69;raster_constl=0x8000;*index=raster_constl;/*賦值光柵數據格式常數*/index=st_index+70;rasterconst2=0x00c0;*index=raster_const2;/*賦值光柵數據格式常數*/index=st_index+71;*index=NO_VALUE;/*賦值用于光柵x原點的位置保持器*/index=st_index+72;*index=NO_VALUE;/*賦值用于光柵y原點的占位符*/index=st_index+73;*index=1;/*賦值比例x(整數部分)*/index=st_index+74;*index=NO_VALUE;/*賦值比例x(小數部分)*/index=st_index+75;*index=1;/*賦值比例y(整數部分)*/index=st_index+76;*index=NO_VALUE;/*賦值比例y(小數部分)*/index=st_index+77;*index=number_rows;/*賦值行數*/index=st_index+78;raster_const3=2;*index=raster_const3;/*賦值分組說明符*/index++;nbytes_index=index;/*存儲第一行的“該行的比特數”的位置*/layer_length=22;/***下面的運行長反對。**用下面方法形成通過網格中所有行的循環。*/for(row=MIN_Y;row<number_rows;row++){prev_col=-1;rnn=MIN_VALUE;nbytes=MIN_VALUE;index++;cp=(char*)index;/***Loopthroughallofthebinsinthecurrentrow。*/for(bin=MIN_X;bin<number_bins;bin++){/***在當前箱和行位置處的網格獲得取顏色值。屏蔽上面的位,從而只留下4個位顏色值。*/col=grid[bin][row];/***既然已經確定了顏色,所以或者開始一新的“運行”,或者用下述程序更新一現有的“運行”。*/if((prev_col!=-1)&amp;&amp;(col!=prevcol))‖(run==15)){/***當顏色改變時以及當前運行是15(是最大運行值)時,在一行的開頭啟動新的“運行”**運行/顏色組合賦值到字符指針(CP)位置處的緩沖器。*/byte=(run*16)+prev_col;*(cp)=byte;cp++;nbytes++;run=1;prey_col=col;}else{/***否則,更新現有運行,并進入下一個網格框箱值*/run++;prey_col=col;}}/***字處理了當前中的所有箱時,檢查某一值是否處在等存儲狀態*/if(run>1){/***用下面的方法在輸出緩沖器中存儲最后“運行顏色”組合。*/byte=(run*16)+prey_col;*(cp)=byte;cp++;nbytes++;}/***如果比特數為奇數,則用一零值填塞另一個比特。*/if(nbytes%2){byte=MIN_VALUE;*(cp)=byte;cp++;nbytes++;}/***將用于該行的比較數賦值到恰當位置處的緩沖器。*/*(nbytes_index)=nbytes;layer_length+=nbytes;/***更新lay_length,以包括用于n比特值的2比特。*/layer_length+=2;/***使指示指針向前,從而它向下一行的比特長度的位置。*/index=(unsignedshort*)cp;nbytes_index=index;}/***既然已經處理了網絡中所有的行,所以將層長度值轉換成2“半字”,并將這些賦值**到產物符號學層中的層大小位置一個表頭。*/long2short.l_value=layer_length;msw_layer_len=long2short.s_value;lsw_layer_len=long2short.s_value[1];*msw_layer_len_index=msw_layer_len;*lsw_layer_len_index=lsw_layer_len;block_length=layer_length+16;/***將塊長度值轉換成2“半字”,并將這些賦值到產物符號學塊表頭中的塊長度位置處。*/long2short.l_value=block_length;msw_block_len=long2short.s_value;lsw_block_len=long2short.s_value[1];kmsw_block_len_index=msw_block_len;*lsw_block_len_index=lsw_block_len;/***將信息長度值轉換成2“半字”,并將這些賦值到產物信息表頭塊的信息長度位置處。*/total_length=block_length+18+102;message_length=total_ength;long2short.l_value=message_length;msw_msg_len=long2short.s_value;lsw_msg_len=long2short.s_value[1];*msw_msg_len_index=msw_msg_len;*lsw_msg_len_index=lsw_msg_len;/***將產物寫到該文件,并關閉文件。nwrite=fwrite(buf,total_length,1,tpw);if(nwrite==NODATA){(void)printf("errorwritingproductfile,errno=%d\n",errno);return(1);}status=fflush(fpw);if(status!=0){(void)printf("errorerrorflushingproductfile,errrno=%d\n",errno);return(1);}status=fclose(fpw);if(status!=0){(void)printf("errorerrorclosingproductfile,errno=%d\n",errno);return(1);}printf("Productiscomplete.\n\n");(void)fflush(stdout);(void)fflush(stderr);}return(0);}/***獲得用于請求站的最新版本的請求產物的程序*/intget_latest(shortsite_id,shortprod_id,char*s){/***這里將含有完整路徑名稱的串傳送到該類型的數據庫中最新產物,類型產物指定,**并用站標識指定的站。****狀態碼由程序返回。下面列出了返回值**return=0->productnamefound(OKtoproceed).**return=1->noproductfoundindirectory.**return=2->invalidproductidnumber.**return=3->invalidsiteidnumber.**return=4->popenfailed.*/char*test;charcommand[512];charstring[512];constchar*commandl="/usr/bin/ls-r";constchar*command2="??????.????2>/dev/null/usr/ucb/head-1";constchar*string_home="/home/Products/radar/";FILE*cfd;shortj;/***將第一部分的指定復制到指定串。*/(void)strcpy(command,command1);/***將主查詢串串接到指令串。*/(void)strcat(command,string_home);/***用下面的環路搜尋指定的站標號。*/for(j=0;j<NUM_SITE_PATH;j++){if(site_path[j].site_id==site_id){/***找到站標號時,將站名路徑串串接到指令串,并接著跳出循環。*/(void)strcat(command,site_path[j].site_text);gotojumpl_here;}}/***僅當找到站標識時執行下面的三個表述。使路徑串變零(null)將其復制到輸出串,**并用表示沒有找到產物的非零值從程度返回。*/string=′\0′;(void)strcpy(s,string),return(2);jump1_here;/*jumptohereandcontinue.*//***下面搜尋用于指定標號的產物標識表。*/for(j=0;j<NUM_PROD_PATH;j++){if(prod_path[j].prod_id==prod_id){/***找到產物時,將產物名路徑串串接到指令串,并接著跳出循環。*/(void)strcat(command,prod_path[j].prod_text);gotojump2_here;}}/***僅當找到產物時執行下面的程序,使輸出串變零,將其復制到輸出,并從表示無效路徑**的非零值從程序返回。*/string=′\0′;(void)strcpy(s,string);return(3);jump2_here;/*跳到這里并繼續*//***將最后一部分指令串接到指令串的末端。*/(void)strcat(command,command2);/***在“sh”殼下打開管子,并執行指令。結果是返回到由指針“cfd”指示的串。*/cfd=popen(command,"r");if(cfd==NULL){/***這里處理的是popen函數失敗的非尋常情況。**用非零狀態碼打印信息,并返回。*/(void)printf("get_latesterror->cfdisNULLerrno=%d\n",errno);return(4);}/***用下述方式獲得串。記值fgets使包括新線字符在結束處的串返回(必須用NUL字符來**替換才能去除)。*/string=′\0′;(void)strcpy(s,string);test=fgets(string,sizeof(string),cfd);pclose(cfd);/***檢查串的第一字符是否含零。*/if(string==′\0′){/***這處理的是第一個字符是一個零的串。**其意義是請求的產物沒有找到。**零串通過,并且程序以一非零值返回。*/(void)strcpy(s,string);return(1);}/***當該串有效時,用該零字符替換最后的字符(回車(acarriagereturn))。**這確保了只有路徑名返回到調用程序(thecallingroutine)。string[strlen(string)-1]=′\0′;/***Copythestringtotheoutputstringwhichispassedtothecalling**routine.Thevalueofzeroisreturnedwithreturnindicating**thatavalidproductwasfound。*/(void)strcpy(s,string);return(0);}]]></pre>本發明的裝置和方法在所得的嵌拼地圖中將雷達數據箱(或類似的數據)變換成網格位置框,反之不然。如果反向進行,則會丟失一些雷達數據箱。本發明可以用在本質上為地理地或地域的(從最廣泛的意義上說)或將多個表面合并成一個嵌拼地圖點相關的任何數據,構筑一個嵌拼地圖。但是,我們強烈地建議這樣的數據是光柵格式。因此,來自不同站的數據可以被組合起來,產生一個單個的嵌拼地圖。本發明可以用預先建立的查詢表或通過實時執行再投影計算來實施。但是,為了實時光柵操作或更快的響應,最好采用查詢表。本發明的許多優點中的一些優點現在應當很清楚了。例如,提供的裝置和方法可以用來將來自多個源的數據組所得一個或多個嵌拼地圖,使得適用于終端用戶的使用。這種裝置和方法能夠準確和有效地構造這樣的嵌拼地圖。同時,可以識別這樣一種嵌拼地圖中任何孔的位置。本發明還提供用來填充這樣的孔。因此,提供的裝置和方法用來將來自多個站的數據組合到覆蓋所要求的地理區域的單個圖象內。這樣的裝置和方法能夠實時將來自多個雷達站的以數字格式的雷達數據(如氣象雷達數據)或其他數據組合到覆蓋某一地理區域的嵌拼地圖內。這樣的裝置和方法進一步能夠將來自多個源的數據組合到在通用計算機(如個人計算機)上運行的單個圖象內。這樣的裝置和方法能夠產生氣象雷達數據的嵌拼地圖,它能夠在大地理范圍內提供降雨的地點和強度以及其他的地理現象。當采用查詢表時,本發明能夠準確地將來自多個想要的站的大量數據快速地組合起來,以提供氣象或其他現象的當前描述。很明顯,考慮到上述原理,本發明還可以有許多修改和變異。所以,應當理解,上述實施例僅是舉例,它們均包括在權利要求的保護范圍內,本發明的保護范圍以權利要求書為準。權利要求1.一種將具有第一坐標系統的第一組數據插入到具有可能與第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的方法,其特征在于,它包含將第一組數據的一個項的位置轉換成第一坐標系統中與第一參考點相隔的第一距離;將所述第一距離轉換成第三坐標系統中的位置,其中,在所述第三坐標系統中第一參考點的位置是已知的;將所述第三坐標系統中的位置轉換成與第二坐標系統中的與第二參考點相隔的第二距離,其中,在所述第三坐標系統中第二參考點的位置是已知的;將所述第二距離轉換成第二坐標系統中的位置。2.一種將具有第一坐標系統的第一組數據插入到具有可能與第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的方法,其特征在于,它包含形成用于第一組數據的具有多個表項的表,每一這樣的表項在具有任何一個第一組數據的第一坐標系統中具有一個位置,并且在第二坐標系統中的每一位置對應于第一坐標系統中的位置,所述形成步驟包含下述步驟將所述第一組數據中的一個項的位置轉換成與所述第一坐標系統中的第一參考點相隔的第一距離;將所述第一距離轉換成第三坐標系統中的位置,其中,在所述第三坐標系統中的第一參考點的位置是已知的;將所述第三坐標系統中的位置轉換成與所述第二坐標系統中的第二參考點相隔的第二距離,其中,在所述第三坐標系統中第二參考點的位置是已知的;將所述第二距離轉換成所述第二坐標系統中的位置;以及在所述形成步驟以后,用所述表,將具有至少某些第一組數據的第一坐標系統中的多個位置中的每一個轉換成所述第二坐標系統中的一個或多個位置。3.一種將具有第一坐標系統的第一組數據插入到具有可能與第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的方法,其特征在于,它包含將所述第一坐標系統中第一組數據的第一位置轉換成所述第二坐標系統中第二相應位置;在所述第二坐標系統中定義第一值的數據陣列,所述陣列包括所有的第二位置;將所述數據陣列的每一個第一子陣列的值從所述第一值變換成一第二值,所述子陣列由所述第二坐標系統中的所有位置組成,所述第二坐標系統中的所有子陣列可以映射成所述第一坐標系統中的任何一個位置;將所述數據陣列中每一個第二位置的值從所述第二值變換成一第三值;對于具有所述第二值的陣列中的位置,判定在位置上最靠近所述對于位置中相應的一個位置;以及在與具有所述第二值的陣列中的位置相應的所述第二坐標系統的位置中,插入在位置上最靠近所述第一位置的相應的一個位置的值。4.一種將具有第一坐標系統的第一組數據插入到可能與所述第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的裝置,其特征在于,它包含將所述第一組數據的一個項的位置轉換成與所述第一坐標系統中的第一參考點相隔的第一距離的裝置;將所述第一距離轉換成第三坐標系統中的位置,其中,在所述第三坐標系統中第一參考點的位置是已知的;將所述第三坐標系統中的位置轉換成與所述第二坐標系統中的參考點相隔一第二距離的裝置,其中,在所述第三坐標系統中的點所述第二參考點的位置是已知的;以及將所述第二距離轉換成第二坐標系統中的位置的裝置。5.一種將具有第一坐標系統的第一組數據插入到具有可能與第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的裝置,其特征在于,它包含形成用于第一組數據的具有多個表項的表的裝置,每一這樣的表項在具有任何一個第一組數據的第一坐標系統中具有一個位置,并且在第二坐標系統中的每一位置對應于第一坐標系統中的位置,所述用于形成的裝置包含將所述第一組數據中的一個項的位置轉換成與所述第一坐標系統中的第一參考點相隔的第一距離的裝置;將所述第一距離轉換成第三坐標系統中的位置的裝置,其中,在所述第三坐標系統中的第一參考點的位置是已知的;將所述第三坐標系統中的位置轉換成與所述第二坐標系統中的第二參考點相隔的第二距離的裝置,其中,在所述第三坐標系統中第二參考點的位置是已知的;將所述第二距離轉換成所述第二坐標系統中的位置的裝置;以及在所述形成步驟以后,用所述表,將具有至少某些第一組數據的第一坐標系統中的多個位置中的每一個轉換成所述第二坐標系統中的一個或多個位置的裝置。6.一種將具有第一坐標系統的第一組數據插入到具有可能與第一坐標系統不同的第二坐標系統的數據嵌拼地圖中去的裝置,其特征在于,它包含將所述第一坐標系統中第一組數據的第一位置轉換成所述第二坐標系統中第二相應位置的裝置;在所述第二坐標系統中定義第一值的數據陣列的裝置,所述陣列包括所有的第二位置;將所述數據陣列的每一個第一子陣列的值從所述第一值變換成一第二值的裝置,所述子陣列由所述第二坐標系統中的所有位置組成,所述第二坐標系統中的所有子陣列可以映射成所述第一坐標系統中的任何一個位置;將所述數據陣列中每一個第二位置的值從所述第二值變換成一第三值的裝置;對于具有所述第二值的陣列中的位置,判定在位置上最靠近所述對于位置中相應的一個位置的裝置;以及在與具有所述第二值的陣列中的位置相應的所述第二坐標系統的位置中,插入在位置上最靠近所述第一位置的相應的一個位置的值的裝置。全文摘要一種用來實時將數字格式的來自多個雷達站的氣象雷達數據組所得覆蓋某一地區或國家范圍(例如美國本土)的嵌拼地圖的裝置和方法。這種裝置和方法設計得可以用計算機軟件來實施并可在一通用個人計算機上運行。這種裝置和方法最好采用“查詢表”的數據庫,該查詢表用來將各個雷達數據箱直接投影到嵌拼地圖所要求的坐標系統的網格上。采用這些查詢表,將多個雷達數據箱中的每一個轉換成相應的網格位置或嵌拼地象中的框。在每一個雷達數據箱被映射成用于嵌拼地圖的網格框時,并不是雷達覆蓋區內的每一個這樣的網格框都可以接收這樣的數據箱。接著,用另一個網格來識別產生的嵌拼地圖中造成的孔,該另一個網格的位置對應于嵌拼地圖的網格的位置,但它提供了隨后出現在該嵌拼地圖的相應位置有關數據的信息。每一個這樣的孔接著由在位置上最靠近數據箱的數據填充。文檔編號G06T1/00GK1190480SQ95197234公開日1998年8月12日申請日期1995年11月3日優先權日1994年11月4日發明者馬克·J·羅更申請人:洛克系德·馬丁有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
韩国伦理电影