程式扎記: [ Java 文章收集 ] 使用 Swing 整合 Google Static Maps API

標籤

2011年10月6日 星期四

[ Java 文章收集 ] 使用 Swing 整合 Google Static Maps API

前言 :
因為需求, 所以需要整合 Google Map 進行 location 標示功能, 這裡透過 Java Swing 當作 GUI 與 Google Static Map API 進行實現. 而Google Static Maps API 可讓您在自己的網頁中嵌入「Google·地圖」,完全不需 JavaScript 或任何動態網頁載入。Google Static Map 服務會根據透過標準 HTTP 要求傳送的網址參數建立您的地圖,並傳回該地圖,做為您可以顯示在網頁上的圖片!

簡短Google Static Maps 範例 :
下列範例包含紐約市中心的靜態地圖影像網址,相關影像已顯示於下方 : 

# You can copy the URL from the image below, however.
#

http://maps.google.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=14&size=512x512&maptype=roadmap
&markers=color:blue|label:S|40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.012318
&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false


請注意:您不需要執行任何「特殊」動作,就可以在網頁上顯示圖片。不需要 JavaScript。我們只需建立網址,再將網址放入 標記中就大功告成了。在您的網頁上,只要是可以放圖片的地方,就可以放置 Google 靜態地圖.

使用限制 :
Google Static Maps API 的使用有其限制,每位檢視者每天只能要求 1000 張個別 (不同的圖片。由於這項限制的配額是依照每位「檢視者」計算的,因此大部分的開發人員應該都不需要擔心超過其配額。此外,請注意,如果要求的是相同的圖片,一般而言只會算成一張. 如果使用者超出上述的限制,則會顯示下列圖片,以指出超出配額 :


之所以要有這項限制,是為了避免使用者濫用 Static Maps API 和 () 將其用於其他目的。此限制以後如有變更,恕不另行通知。如果您已超過 24 小時內的使用上限或是濫用服務,Static Maps API 將暫時無法使用 。如果持續超過上限,則會遭到封鎖,無法使用 Static Maps API.

另外 Static Map 網址的長度上限為 2048 個字元。實際上,您不太可能需要使用超過這個長度的網址,除非製作的地圖十分複雜,且包含大量的標記和路徑

網址參數 :
Google Static Maps API 的網址格式如下 :
http://maps.google.com/maps/api/staticmap?parameters

有些參數為必要,而有些參數則為選用。跟網址的標準一樣,這裡的所有參數都會以 & 字元分隔。參數清單和其可能的值列舉如下 :

- 位置參數
center (如無標記,則需使用這個參數) 會定義地圖的中心,讓地圖與所有邊緣保持等距。這個參數接受以字串地址 (例如「city hall, new york, ny」) 或逗號分隔的 {緯度,經度} 配對 (例如「40.714728,-73.998672」) 表示的位置,以找出地球表面上的某個特定位置。如需詳細資訊,請參閱下方的「位置」。
zoom (如無標記,則需使用這個參數) 會定義地圖的「縮放等級」,進而決定地圖的放大等級。這個參數接受縮放等級的數值,以指定偏好的區域縮放等級。如需詳細資訊,請參閱下方的「縮放等級」

- 地圖參數
size (必要) 定義地圖圖片的矩形維度。這個參數接受 valuexvalue 格式的字串,其中先指出水平像素,再指出垂直像素。例如,500x400 定義地圖寬為 500 個像素,而高為 400 個像素。如果您建立的地圖寬小於或等於 100 個像素,則會自動縮小「Google 技術提供」標誌的尺寸。
format (選用) 定義結果圖片的格式。根據預設,Static Maps API 會建立 PNG 圖片。但也可選用其他格式,例如 GIF、JPEG 以及 PNG 類型。您可以依照希望的圖片效果,選擇要使用的圖片格式。通常 JPEG 壓縮較大,但 GIF 和 PNG 較細緻。如需詳細資訊,請參閱「圖片格式」。
maptype (選用) 定義要建構的地圖類型。可用的地圖類型包括 roadmap、satellite、hybrid 以及 terrain。如需詳細資訊,請參閱下方的「Static Maps API 地圖類型」。
mobile (選用) 會指定地圖是否會在行動裝置上顯示。有效的值包括 true 或 false。為了在行動裝置上呈現最佳效果,顯示在行動裝置上的地圖可能會使用不同的地圖方塊集。如需詳細資訊,請參閱下方的「行動地圖」。
language (選用) 定義地圖方塊上標籤的顯示語言。請注意,這個參數僅適用於部分國家/地區地圖方塊;如果地圖方塊集不支援參數指定的語言,則地圖方塊集將使用預設的語言。

- 功能參數
markers (選用) 會定義一或多個標記,以附加至圖片的指定位置。這個參數接受單一標記定義,其中每個參數應以直立線 (|) 字元分隔。只要標記使用的樣式相同,即可全數放在同一個 markers 參數中;您可以新增額外的 markers 參數,藉以新增不同樣式的標記。請注意,如果您是為地圖提供標記,則不需要指定 center 和 zoom 參數 (通常為必要參數)。如需詳細資訊,請參閱下方的「靜態地圖標記」。
path (選用) 定義兩個或多個相鄰點的單一路徑,在指定位置疊加圖片。這個參數接受由管道字元 (|) 分隔的點定義字串。如要提供其他路徑,您只需新增額外的 path 參數即可。請注意,如果您是為地圖提供路徑,則不需要指定 center 和 zoom 參數 (通常為必要參數)。如需詳細資訊,請參閱下方的「靜態地圖路徑」。
visible (選用) 會指定一或多個位置;地圖會持續顯示該位置,但不會顯示任何相關標記或其他指標。使用這個參數可確保特定功能或地圖位置會出現在靜態地圖上

- 回報參數
sensor (必要) 會指出要求靜態地圖的應用程式是否有使用感應器來判斷使用者的位置。所有的靜態地圖要求皆需使用這個參數。如需詳細資訊,請參閱下方的「註明使用感應器

指定位置 :
Static Maps API 必須能夠精確指出地圖上的位置,一方面是要讓地圖鎖定正確位置 (使用 center 參數),另一方面則是要在地圖上的不同位置放置選用地標 (使用 markers 參數)。Static Maps API 會使用數字 (緯度和經度值) 或字串 (地址) 來指定這些位置。這些值會指出「地理編碼」位置.

許多參數 (例如 markers 和 path 參數) 都可接受多個位置。在這種情況下,請以直立線 (|) 字元分隔位置!

- 緯度和經度
緯度和經度是在逗號分隔的文字字串中使用數值定義的,精準度為小數點後 6 位。例如,「40.714728,-73.998672」是有效的地理編碼值。超過小數點後 6 位的值則會被忽略. 經度值是根據該處和英國格林威治 (本初子午線的起點) 之間的距離。因為格林威治位於緯度 51.477222,只要將 center 值設為 51.477222,0,地圖就會以格林威治為中心 :


緯度和經度值必須能對應到地球表面確實存在的位置。緯度必須是介於 -90 到 90 之間的值,而經度則必須是介於 -180 到 180 之間的值。如果指定了無效的緯度或經度值,系統會將您的要求視為錯誤要求並加以拒絕!

- 地址
大部分的使用者都不會使用經緯度,而會使用「地址」來指定位置。將地址轉換成地理定點的程序稱為「地理編碼」;如果您提供有效地址,Static Maps 服務即可為您進行地理編碼. 在所有接受緯度/經度的參數中,您都可以改用代表「地址」 的字串進行指定。Google 會為地址進行地理編碼,再將產生的經緯度值提供給在 Static Map 服務,以放置標記或指定位置。這個字串必須逸出網址;例如,「City Hall, New York, NY」地址應該轉換成「City+Hall,New+York,NY」.
如果您對地址的地理編碼程序有任何疑問,您可以使用這個「地理編碼公用程式」測試地址. 下方範例會產生加州柏克萊的靜態地圖 :
http://maps.google.com/maps/api/staticmap?center=Berkeley,CA&zoom=14&size=400x400&sensor=false



縮放等級 :
「Google 地圖」的地圖設有採用整數的「縮放等級」,以定義目前檢視的解析度。在預設道路地圖檢視中,縮放等級範圍為 0 (最低縮放等級,從中可檢視整個世界地圖) 至 21+ 之間 (最高縮放等級,從中可檢視個別建築物). 在「Google 地圖」中,縮放等級 0 能夠顯示整個地球。之後每提升一個縮放等級,水平和垂直維度都會放大兩倍。如要進一步瞭解如何實作縮放功能,請參閱 Google Maps API 說明文件.

如果您要求特定縮放等級,系統卻沒有對應的地圖方塊,那麼 Static Maps API 將傳回空白圖片. 下方範例會要求兩個 center 值相同,但縮放等級分別為 12 和 14 的曼哈頓地圖 :

(zoom=12)


(zoom=14)

圖片大小 :
擷取的圖片大小最高可達 640 x 640 像素size 參數接受由 x 字元分隔兩個值的字串。640x640 是允許的最大圖片尺寸。請注意,如果 center 參數搭配 size 參數使用,也會以絕對方式定義地圖圖片的涵蓋區域. 下方範例要求顯示在地球赤道上、縮放等級為 1 的「部分」區域 :
http://maps.google.com/maps/api/staticmap?center=0,0&zoom=1&size=400x50&sensor=true_or_false

圖片格式 :
圖片可以用幾種常見的網頁圖形格式傳回:GIF、JPEG 以及 PNG。format 參數接受下列值其中之一 :
png8 或 png (預設) 會指定 8 位元的 PNG 格式。
png32 會指定 32 位元的 PNG 格式。
gif 會指定 GIF 格式。
jpg 會指定 JPEG 壓縮格式。
jpg-baseline 會指定非漸進式的 JPEG 壓縮格式

jpg 和 jpg-baseline 提供的圖片檔案通常最小,但這是因為它們使用的是「高失真率」的壓縮,很有可能降低圖片的品質。gif、png8 和 png32 使用的則是低失真率的壓縮.
多數 JPEG 圖片皆為漸進式,也就是會先載入粗略的圖片,再隨著更多資料載入逐步修飾圖片解析度。這樣一來,網頁就能快速載入圖片,這也是目前 JPEG 最廣泛的應用。不過,部分 JPEG 的應用 (尤其是列印) 需要非漸進式 (基礎) 的圖片。這個時候可以使用非漸進式的 jpg-baseline 格式.

地圖類型 :
Google Static Maps API 會以下列幾種格式建立地圖 :
roadmap:(預設) 標準道路圖圖片,與一般在「Google 地圖」網站中顯示的一樣。如果沒有另外指定 maptype 值,Static Maps API 就會根據預設使用 roadmap 方塊。
satellite:衛星圖片。
terrain:實際立體模型地圖圖片,可顯示地形和植被。
hybrid:衛星和道路圖的混合圖片,在衛星圖片上顯示一層透明的主要街道和位置名稱


標記 :
markers 參數會為一系列位置設定一系列 (一或多個) 標記。單一 markers 宣告內定義的每個標記皆需採用相同的視覺樣式;如果您想顯示不同樣式的標記,您必須提供多個 markers參數並於每個參數設定不同樣式. 參數接受一系列指派值 (標記描述元),格式如下 :
markers=markerStyles|markerLocation1|markerLocation2|...

這一系列 markerStyles 是在 markers 宣告的開頭完成宣告,且包含零或多個以直立線 (|) 字元分隔的樣式描述元,之後則是一系列 (一或多個) 同樣以直立線 (|) 字元分隔的位置。(如果您正在進行網址編碼,直立線字元在 ASCII 裡為 %7C).

因為樣式資訊和位置資訊同樣是以直立線字元分隔,所以樣式資訊必須優先出現在標記描述元中。否則,只要 Static Map 伺服器在標記描述元中讀到任一位置,所有其他標記參數也會一律被當成位置!

- 標記樣式
標記樣式描述元集是一系列以直立線 (|) 字元分隔的指派值。這個樣式描述元會定義視覺屬性,用來顯示這個標記描述元中的標記。這些樣式描述元包含下列指派金鑰/值 :
size: (選用) 從 {tiny, mid, small} 集合中指定標記的大小。如未設定 size 參數,標記將會採用預設的大小。
color: (選用) 會指定 24 位元色彩 (例如:color=0xFFFFCC),或是從 {black, brown, green, purple, yellow, blue, gray, orange, red, white} 系列指定預先定義的色彩。
請注意,標記並不支援透明度 (必須使用 32 位元十六進位色彩值指定),但是路徑提供相關支援。
label: (選用) 會從 {A-Z, 0-9} 系列指定單一大寫英數字元。(大寫字元的要求是這個 API 版本新增的規定)。請注意,要使用預設和 mid 大小的標記,才能顯示 alphanumeric-character參數。tiny 和 small 標記則無法顯示英數字元

Ps. 您可能希望使用自訂圖示,而不要使用這些標記 (如需詳細資訊,請參閱「自訂圖示)。

- 標記位置
每個標記描述元皆需包含一系列 (一或多個) 位置,以定義標記在地圖上的放置位置。這些位置可以指定為 緯度/經度值地址,且必須以直立線 (|) 字元分隔.

這個位置參數會定義標記在地圖上的位置。在地圖已設定 center 和 zoom 的前提下,如果位置不在地圖上,標記將不會出現在建構的圖片中。然而,如果這些參數並未設定,靜態地圖伺服器就會自動建構圖片,並於其中納入提供的標記. 標記宣告範本顯示如下。請注意,我們會定義一系列樣式和三個位置 :
http://maps.google.com/maps/api/staticmap?center=Williamsburg,Brooklyn,NY&zoom=13&size=400x400&
markers=color:blue|label:S|11211|11206|11222&sensor=true_or_false



如要定義不同樣式的標記,我們必須提供多個 markers 參數。這一系列 markers 參數會定義三個標記:在 62.107733, -145.5419 標示「S」的藍色標記、在「Delta Junction, AK」的小型綠色標記,以及在「Tok, AK」標示「C」的中型黃色標記。下方範例會顯示這些標記 :
http://maps.google.com/maps/api/staticmap?center=63.259591,-144.667969&zoom=6&size=400x400\
&markers=color:blue|label:S|62.107733,-145.541936&markers=size:tiny|color:green|Delta+Junction,AK\
&markers=size:mid|color:0xFFFF00|label:C|Tok,AK&sensor=false



使用 Swing 整合 Google Static Maps API :
因為需求所以我開發了以下 App 方便我們使用 Google Static Maps, 並能透過外部描述檔動態建立 Google Map 的 Marker. 該 App 的 GUI 描述如下 :


而描述檔的說明如下 :


執行檔可以到  這裡 下載.

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!