本文展示如何以 PHP 後端處理地址地理編碼 (Geocoding),配合 Google Maps JavaScript API v2 (經典版) 前端顯示互動地圖,支援地圖類型切換 (一般/衛星/混合)、縮放等級選擇、自訂標記點,程式碼結構清晰分離 PHP 與 JS 邏輯。
map.php<?php
// 簡易輔助函式:產生 SELECTED 屬性
function selected($param, $value) {
if ($param == $value) echo ' selected="selected"';
}
// 1. 取得表單參數 (預設值)
$scale = isset($_REQUEST['scale']) ? (int)$_REQUEST['scale'] : 10;
$maptype = isset($_REQUEST['maptype']) ? $_REQUEST['maptype'] : 'G_NORMAL_MAP';
// 2. 地理編碼:將地址轉為經緯度
// 注意:實際專案應快取結果,避免重複呼叫 API 超額
$apiKey = 'YOUR_GOOGLE_MAPS_API_KEY'; // 申請於 Google Cloud Console
$address = '48 Spa Road, Melksham, UK'; // 可改為 $_REQUEST['address']
// 舊版 Geocoding API (已棄用,示範用)
// $url = "https://maps.google.com/maps/geo?q=" . urlencode($address) . "&output=csv&key=$apiKey";
// $result = file($url);
// list($status, $accuracy, $lat, $lng) = explode(',', $result[0]);
// 示範用固定座標 (Melksham, UK)
$lat = 51.369318;
$lng = -2.133457;
?>
<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>Well House Manor, Melksham - Google Maps Demo</title>
<!-- Google Maps API v2 (舊版,新專案請用 v3) -->
<script src="https://maps.google.com/maps?file=api&v=2&key=<?= $apiKey ?>" type="text/javascript"></script>
<style>
#map {width: 450px; height: 550px; border: 1px solid #ccc;}
.controls {margin-bottom: 10px;}
label {margin-right: 10px;}
</style>
</head><body onload="load()" onunload="GUnload()">
<table><tr valign="top"><td>
<h1>Well House Manor, Melksham</h1>
<img src="/get_pic/2010/03/20100525003348607.jpg" alt="館舍照片"><br>
• Business Hotel in Melksham<br>
• All rooms fitted to superior standard<br>
• Internet Access throughout<br>
• Plenty of parking and close to town centre<br><br>
<a href="https://www.wellhousemanor.co.uk" target="_blank">Well House Manor website</a><hr>
<div class="controls">
<form method="post" action="">
縮放等級:
<select name="scale">
<option value="7"<?php selected($scale, 7); ?>>概覽 (7)</option>
<option value="10"<?php selected($scale, 10); ?>>縣市 (10)</option>
<option value="13"<?php selected($scale, 13); ?>>城鎮 (13)</option>
<option value="16"<?php selected($scale, 16); ?>>街道 (16)</option>
<option value="19"<?php selected($scale, 19); ?>>建築 (19)</option>
</select>
地圖類型:
<select name="maptype">
<option value="G_NORMAL_MAP"<?php selected($maptype, 'G_NORMAL_MAP'); ?>>一般地圖</option>
<option value="G_SATELLITE_MAP"<?php selected($maptype, 'G_SATELLITE_MAP'); ?>>衛星圖</option>
<option value="G_HYBRID_MAP"<?php selected($maptype, 'G_HYBRID_MAP'); ?>>混合圖</option>
</select>
<input type="submit" value="套用">
</form>
</div>
<p>日期:<?= date('F, jS l Y') ?></p>
</td><td>
<div id="map"></div>
</td></tr></table>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(<?= $lat ?>, <?= $lng ?>), <?= $scale ?>);
map.setMapType(<?= $maptype ?>);
var marker = new GMarker(new GLatLng(<?= $lat ?>, <?= $lng ?>));
map.addOverlay(marker);
marker.openInfoWindowHtml("<b>Well House Manor</b><br>48 Spa Road, Melksham, UK");
}
}
//]]>
</script>
</body></html>
| 項目 | v2 (舊) | v3 (新) |
|---|---|---|
| 載入方式 | <script src="...v=2&key=..."> | <script src="https://maps.googleapis.com/maps/api/js?key=...&callback=initMap" async defer> |
| 地圖物件 | new GMap2(el) | new google.maps.Map(el, opts) |
| 座標物件 | new GLatLng(lat, lng) | new google.maps.LatLng(lat, lng) |
| 標記物件 | new GMarker(latLng) | new google.maps.Marker({position, map, title}) |
| 資訊視窗 | marker.openInfoWindowHtml(html) | new google.maps.InfoWindow({content}) + open(map, marker) |
| 地圖類型 | G_NORMAL_MAP 等常數 | google.maps.MapTypeId.ROADMAP/SATELLITE/HYBRID/TERRAIN |
| 事件綁定 | GEvent.addListener | google.maps.event.addListener / marker.addListener |