Google Maps JavaScript APIの基礎

Demo

HTML

	<script src="//maps.googleapis.com/maps/api/js?key=【APIキー】"></script>
	

JavaScript

	jQuery(()=>{
		var map1 = jQuery('#map1')
	
		var map = new google.maps.Map( map1[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
	});
	

クリックイベントとその場所のplaceIdと緯度経度を取得

Demo

HTML

	<div id="map1" style="width:480px;height:320px;"></div>
	lat: <span id="lat"></span><br>
	lng: <span id="lng"></span><br>
	place_id: <span id="place_id"></span><br>
	
JavaScript

	jQuery(()=>{
		var map1 = jQuery('#map1')
	
		var map = new google.maps.Map( map1[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		map.addListener( "click", function ( argument ) {
			console.log( argument ) ;
			var latLng = argument.latLng;
			var lat = latLng.lat();
			var lng = latLng.lng();
			var place_id = argument.placeId;
			
			jQuery('#lat').html(lat);
			jQuery('#lng').html(lng);
			
			if(place_id == null) place_id = '';
			jQuery('#place_id').html(place_id);
	
		}) ;
		
	});
	

マーカーの表示 | マーカークリックイベント | 吹き出し

Demo

HTML

	<div id="map1" style="width:640px;height:480px;"></div>
	
JavaScript

	var map; // Mapsオブジェクト
	var infoWindow1; // 吹き出しウィンドウ
	var marker; // マーカーオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		// マーカーの作成
		marker = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
		}) ;
		
		// アイコンを変更する
		marker.setOptions({
			icon: {
				url: 'icon/sakana.png',
				scaledSize: new google.maps.Size(32, 32) // サイズ
			}
		});
		
		// 吹き出しオブジェクトの作成
		infoWindow1 = new google.maps.InfoWindow({ 
			content: '<div class="text-success">テスト<br>畑</div>'
		});
		
		// マーカーのクリックイベント
		marker.addListener('click', ()=> {
			infoWindow1.open(map, marker); // 吹き出し表示
			
		});
		
	});
	

動的に吹き出しのコンテンツを変更する場合


	infoWindow1.setContent("<div>うなご</div>");
	

複数マーカーの表示切替

Demo

HTML


	<div id="map1" style="width:640px;height:320px;"></div>
	
	<div>
		<input type="checkbox" checked onclick="check1(this, 0)" /> テスト1<br>
		<input type="checkbox" checked onclick="check1(this, 1)" /> テスト2<br>
		<input type="checkbox" checked onclick="check1(this, 2)" /> テスト3<br>
		<input type="checkbox" checked onclick="check1(this, 3)" /> テスト4<br>
		<input type="checkbox" checked onclick="check1(this, 4)" /> テスト5<br>
	</div>
	

JavaScript


	var m_map; // Mapsオブジェクト
	var m_infoWindows = []; // 吹き出しウィンドウ
	var m_markers = []; // マーカーオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		m_map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		// データ
		var data = [
			{icon:'sakana.png', hukidasi_html:"<span>テスト1</span>", lat:26.69740142, lng:127.9333379},
			{icon:'book.png', hukidasi_html:"<span>テスト2</span>", lat:26.7011587, lng:127.938874},
			{icon:'inu.png', hukidasi_html:"<span>テスト3</span>", lat:26.70100534, lng:127.9283598},
			{icon:'tatunootosigo.png', hukidasi_html:"<span>テスト4</span>", lat:26.69640457, lng:127.927244},
			{icon:'tougyu.png', hukidasi_html:"<span>テスト5</span>", lat:26.69723524, lng:127.9286671},
		];
		
		for(var i in data){
			var ent = data[i];
			
			// マーカーを作成
			var marker = new google.maps.Marker( {
				map: m_map ,
				position: new google.maps.LatLng( ent.lat, ent.lng ) ,
			}) ;
			
			// アイコンを変更する
			marker.setOptions({
				icon: {
					url: 'icon/' + ent.icon,
					scaledSize: new google.maps.Size(32, 32) // サイズ
				}
			});
			
			// 吹き出しオブジェクトの作成
			var infoWindows = new google.maps.InfoWindow({ 
				content: ent.hukidasi_html
			});
			
			m_infoWindows.push(infoWindows);
			
			m_markers.push(marker);
		}
		
		// マーカーにクリックイベントを追加
		for(var i in data){
			markerEvent(i);
		}
	
	});
	
	
	/**
	 * マーカーにクリックイベントを追加
	 * @param i インデックス
	 */
	function markerEvent(i) {
		m_markers[i].addListener('click', ()=> {
			m_infoWindows[i].open(m_map, m_markers[i]); // 吹き出しの表示
		});
	}
	
	
	/**
	 * チェックボックスのクリックイベント
	 * @param elm チェックボックス要素
	 * @param i インデックス
	 */
	function check1(elm, i){
		var elm = jQuery(elm);
		if(elm.prop('checked')){
			m_markers[i].setVisible(true);
		}else{
			m_markers[i].setVisible(false);
		}
		
	}
	

クリック場所にマーカーを表示する

Demo Demo2 ピンポイント型

HTML

	<div id="map1" style="width:640px;height:480px;"></div>
	
JavaScript


	var map; // Mapsオブジェクト
	var infoWindow1; // 吹き出しウィンドウ
	var marker; // マーカーオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		// マーカーの作成
		marker = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
		}) ;
		
		// アイコンを変更する
		marker.setOptions({
			icon: {
				url: 'icon/sakana.png',
				scaledSize: new google.maps.Size(32, 32) // サイズ
			}
		});
		
		
		// 地図上をクリックしたらマーカーを移動させる
		map.addListener( "click", function ( argument ) {
			
			marker.setPosition(argument.latLng);
	
	//		var latLng = argument.latLng;
	//		var lat = latLng.lat();
	//		var lng = latLng.lng();
	//
	//		var latLng = new google.maps.LatLng( lat, lng);
	//		marker.setPosition(latLng);
	
		}) ;
		
	});
	

マーカー複数 | マーカーをクリックしたとき、マーカーを識別するインデックスを取得する


	for(var i in data){
	
		var marker = new google.maps.Marker( ... 略 ...
		
		// マーカーのクリックイベント
		google.maps.event.addListener(marker, 'click', function(self, marker, index) {
			 return function() {
				 console.log('index=' + index);
				 self._exsample(index); // 同じクラス内のメソッドを呼び出す thisは使えない。
			}}(this, marker,i));
	}
	

マーカーの緯度経度を取得またはセット

マーカーから緯度経度を取得


	var lat = marker.getPosition().lat();
	var lng = marker.getPosition().lng();
	


緯度経度をマーカーにセットする


	var lat = 26.69740142087048;
	var lng = 127.9333379497375;
	var latLng = new google.maps.LatLng(lat, lng);
	marker.setPosition(latLng);
	

Directions API | 距離と所要時間の取得、およびルートのライン描画

Demo

HTML


	<div id="map1" style="width:640px;height:480px;float:left;"></div>
	<div style="padding:10px">
		<div id="err" class="text-danger"></div>
		<div>
			<select id="travel_mode">
				<option value="DRIVING">自動車</option>
				<option value="BICYCLING">自転車</option>
				<option value="TRANSIT">電車/公共交通機関</option>
				<option value="WALKING">徒歩</option>
			</select>
		</div>
		<div>
			距離:<span id="dist1"></span> (<span id="dist2"></span>)
		</div>
		<div>
			時間:<span id="time1"></span> (<span id="time2"></span>)
		</div>
		<div>
			開始住所:<span id="start_address"></span>
		</div>
		<div>
			終了住所:<span id="end_address"></span>
		</div>
	</div>
	

JavaScript


	var map; // Mapsオブジェクト
	var infoWindow1; // 吹き出しウィンドウ
	var marker; // マーカーオブジェクト
	var marker2; // マーカーオブジェクト
	var linePath; // ラインオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 13 ,
		});
		
		// マーカーの作成
		marker = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
		}) ;
		
		marker2 = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.698666640945667, 127.92767312429805 ) ,
		}) ;
		
		// アイコンを変更する
		marker.setOptions({
			icon: {
				url: 'icon/sakana.png',
				scaledSize: new google.maps.Size(32, 32) // サイズ
			}
		});
		marker2.setOptions({
			icon: {
				url: 'icon/inu.png',
				scaledSize: new google.maps.Size(32, 32) // サイズ
			}
		});
		
		// 吹き出しオブジェクトの作成
		infoWindow1 = new google.maps.InfoWindow({ 
			content: '<div class="text-success">テスト<br>畑</div>'
		});
		
		// マーカーのクリックイベント
		marker.addListener('click', ()=> {
			infoWindow1.open(map, marker); // 吹き出し表示
			
		});
		
		// ▼ 地図上をクリックしたらマーカーを移動、および距離、所要時間、ルートを描画する
		map.addListener( "click", function ( argument ) {
			
			jQuery('#err').html('');
			
			// マーカーの位置をクリック位置に移動する。
			marker2.setPosition(argument.latLng);
	
			// 開始位置を取得
			var origLatLng = marker.getPosition();
			var origin = origLatLng.lat() + ',' + origLatLng.lng();
	
			// 終了位置(クリック位置)を取得
			var destLatLng = marker2.getPosition();
			var destination = destLatLng.lat() + ',' + destLatLng.lng();
	
			// 移動方法を取得
			var travel_mode = jQuery('#travel_mode').val();
			if(travel_mode == null) return;
	
			// 距離やルート情報を取得する
			var directionsService = new google.maps.DirectionsService();
			var directionsRequest = {
				origin: origin,
				destination: destination,
				travelMode: google.maps.DirectionsTravelMode[travel_mode],
				unitSystem: google.maps.UnitSystem.METRIC
			};
			directionsService.route(directionsRequest, function (response, status) {
				
				if (status == google.maps.DirectionsStatus.OK) {					
	
					console.log('routes_count=' + response.routes.length);
					if(response.routes[0] == null){
						jQuery('#err').append('No root');
						return;
					}
					
					var route = response.routes[0];
					
					var legs = route['legs'];
					console.log('legs_count=' + legs.length);
					
					if(legs[0] == null){
						jQuery('#err').append('No root 2');
						return;
					}
					var leg = legs[0];
					
					
					// 距離:distance: {text: "3.7 km", value: 3693}
					// 時間:duration: {text: "6分", value: 342}
					var dist1 = leg.distance.text;
					var dist2 = leg.distance.value;
					var time1 = leg.duration.text;
					var time2 = leg.duration.value;
					jQuery('#dist1').html(dist1);
					jQuery('#dist2').html(dist2);
					jQuery('#time1').html(time1);
					jQuery('#time2').html(time2);
		
					// 開始住所、終了住所
					jQuery('#start_address').html(leg.start_address);
					jQuery('#end_address').html(leg.end_address);
					
					// ライン(ルート)をクリアする
					if(linePath) linePath.setMap(null);
					
					// ラインを描画する
					linePath = new google.maps.Polyline({
						path: route.overview_path,
						geodesic: true,
						strokeColor: '#FF0000',
						strokeOpacity: 0.5,
						strokeWeight: 6
					 });
					linePath.setMap(map);
					
				}
				else{
					//Error has occured
					alert(status);
					jQuery('#err').append('アクセスエラー');
					jQuery('#err').append(status);
					
				}
			});
			
		}) ;
		
	});
	

Google Maps JavaScript API | Mapsをページ内で移動したときどうなるか検証

jQueryのinsertBeforeまたはinsertAfterでMapsを移動しても問題ないと思われる。

Demo

HTML

	<div id="map1" style="width:300px;height:200px;"></div>
	<div id="a1" style="width:auto;height:80px;background-color:#b6ebce">
		マップを移動します。<br>
		<input type="button" value="↓" onclick="test1()" class="btn btn-success" />
		<input type="button" value="↑" onclick="test2()" class="btn btn-success" />
	</div>
	

JavaScript
	var map; // Mapsオブジェクト
	var infoWindow1; // 吹き出しウィンドウ
	var marker; // マーカーオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		// マーカーの作成
		marker = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
		}) ;
		
		// アイコンを変更する
		marker.setOptions({
			icon: {
				url: 'icon/sakana.png',
				scaledSize: new google.maps.Size(32, 32) // サイズ
			}
		});
		
		// 吹き出しオブジェクトの作成
		infoWindow1 = new google.maps.InfoWindow({ 
			content: '<div class="text-success">テスト<br>畑</div>'
		});
		
		// マーカーのクリックイベント
		marker.addListener('click', ()=> {
			infoWindow1.open(map, marker); // 吹き出し表示
			
		});
		
	});
	
	
	function test1(){
		$('#a1').insertBefore('#map1');
	}
	
	function test2(){
		$('#a1').insertAfter('#map1');
	}
	

Geocoding API | 住所検索と緯度経度の取得

Demo

HTML

	<input type="text" id="address_text" value="東京スカイツリー" />
	<input type="button" class="btn btn-success" value="TEST実行" onclick="test1()" />
	<div id="err" style="color:red"></div>
	<div id="full_address"></div>
	<div id="place_id"></div>
	<div id="lat_lng"></div>
	<div id="map1" style="width:640px;height:480px;"></div>
	

JavaScript

	var map; // Mapsオブジェクト
	var infoWindow1; // 吹き出しウィンドウ
	var marker; // マーカーオブジェクト
	
	jQuery(()=>{
		var mapElm = jQuery('#map1')
	
		// 地図を作成
		map = new google.maps.Map( mapElm[0], {
			center: new google.maps.LatLng(26.698820, 127.933059 ),
			zoom: 15 ,
		});
		
		// マーカーの作成
		marker = new google.maps.Marker( {
			map: map ,
			position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
		}) ;
		
	});
	
	
	function test1(){
		jQuery('#err').html('');
		
		// 住所、地名、ランドマークなどを入力
		var address_text = jQuery('#address_text').val();
	
		// 住所、地名、ランドマークなどから正規住所、プレースID、緯度経度を取得する
		var geocoder = new google.maps.Geocoder();  //ジオコーディングのインスタンスの生成
		geocoder.geocode({address: address_text}, (results, status) => {
			if (status === 'OK' && results[0]){
					var result = results[0];
		
					// 地図を住所の位置へ移動させる
					map.setCenter(result.geometry.location);
					
					// マーカーを住所の位置へ移動させる
					marker.setPosition(result.geometry.location)
					
					// 正規住所
					jQuery('#full_address').html(result.formatted_address);
					
					// プレースID
					jQuery('#place_id').html('プレースID:' + result.place_id);
					
					// 緯度経度
					var lat = result.geometry.location.lat();
					var lng = result.geometry.location.lng();
					jQuery('#lat_lng').html(lat + ', ' + lng);
					
	
				}else{
					jQuery('#err').html('失敗:' + status);
				}
			}); 
		
	}
	

住所から緯度経度を取得【クラスのメソッド版】

APIの読込
<script src="//maps.googleapis.com/maps/api/js?key=APIキー"></script>

JavaScript

	/**
	 * 住所から緯度経度を取得する
	 * 
	 * @note
	 * 住所、地名、ランドマークなどから正規住所、プレースID、緯度経度を取得する
	 * 
	 * @param string address_text 住所
	 * @param function callback コールバック(緯度経度など)
	 */
	_getLatLngByAddr(address_text, callback){

		// ジオコーダーオブジェクトの生成
		if(this.geocoder == null){
			this.geocoder = new google.maps.Geocoder();  //ジオコーディングのインスタンスの生成
		}
		var geocoder = this.geocoder;

		// 住所から緯度経度などの情報を取得する
		geocoder.geocode({address: address_text}, (results, status) => {
			if (status === 'OK' && results[0]){
					var result = results[0];
		
					// 正規住所
					var formatted_address = result.formatted_address;
					
					// プレースID
					var place_id = result.place_id;
					
					// 緯度経度
					var lat = result.geometry.location.lat();
					var lng = result.geometry.location.lng();

					// レスポンスに値をセットし、レスポンスをコールバックに渡す
					var res = {
							formatted_address:formatted_address,
							place_id:place_id,
							lat:lat,
							lng:lng,
					};
					callback(res);
	
				}else{
					var res = {
							err:'見つかりませんでした。',
							err_status:status
					}
					callback(res);
				}
			}); 
		
	}
	

緯度経度から住所を取得する | google.maps.Geocoder

HTML
	<script src="//maps.googleapis.com/maps/api/js?key=APIキー"></script>
	~ 略 ~
	<input type="text" id="test_tb" value='@26.6944679,127.8773471' style="width:70%" /><br>
	<button onclick="test()">住所取得</button><br>
	<div id="res" class="text-success"></div>
	

JavaScript
	function test(){
		
		let latlng_str = jQuery('#test_tb').val();
		let res = _strToLatLng(latlng_str);
		if(res==null) {
			console.log('エラー');
			return;
		}
		let lat = res.lat;
		let lng = res.lng;
	
		_getAddrFromLatLng(lat, lng, callback1);
	}
	
	/**
	 * 緯度経度文字列を緯度と経度に分割する
	 * @param latlng_str 緯度経度文字列
	 * @returns object 緯度経度
	 */
	function _strToLatLng(latlng_str){
		latlng_str=latlng_str.replace('@', '');
		let ary = latlng_str.split(',');
		if(ary.length != 2) return null;
		let lat = ary[0] + '';
		let lng = ary[1] + '';
		lat = lat.trim();
		lng = lng.trim();
		return {lat:lat, lng:lng};
		
	}
	
	function callback1(res){
		let addr = res.formatted_address;
		jQuery('#res').html(addr);
	}
	
	/**
	 * 緯度経度から住所を取得する
	 * 
	 * @param function callback コールバック(緯度経度など)
	 */
	function _getAddrFromLatLng(lat, lng, callback){
	
		// ジオコーダーオブジェクトの生成
		if(this.geocoder == null){
			this.geocoder = new google.maps.Geocoder();  //ジオコーディングのインスタンスの生成
		}
		var geocoder = this.geocoder;
		
		let latLng = new google.maps.LatLng( lat, lng );
	
		// 住所から緯度経度などの情報を取得する
		geocoder.geocode({latLng: latLng}, (results, status) => {
			if (status === 'OK' && results[0]){
					var result = results[0];
		
					// 正規住所
					var formatted_address = result.formatted_address;
					
					// プレースID
					var place_id = result.place_id;
					
					// 緯度経度
					var lat = result.geometry.location.lat();
					var lng = result.geometry.location.lng();
	
					// レスポンスに値をセットし、レスポンスをコールバックに渡す
					var res = {
							formatted_address:formatted_address,
							place_id:place_id,
							lat:lat,
							lng:lng,
					};
					callback(res);
	
				}else{
					var res = {
							err:'見つかりませんでした。',
							err_status:status
					}
					callback(res);
				}
			}); 
		
	}
	

複数住所から一括緯度経度取得するバッチ処理

Demo


地図の四隅の座標を取得する

Demo

HTML

	<div id="map1" style="width:640px;height:480px;"></div>
	
	<table class="tbl2"><tbody>
	<tr><td id="l_t">xxx</td><td></td><td id="r_t">xxx</td></tr>
	<tr><td></td><td id="center">xxx</td><td></td></tr>
	<tr><td id="l_b">xxx</td><td></td><td id="r_b">xxx</td></tr>
	</tbody></table>
	
JavaScript


var map; // Mapsオブジェクト
var infoWindow1; // 吹き出しウィンドウ
var marker; // マーカーオブジェクト

jQuery(()=>{
	var mapElm = jQuery('#map1')

	// 地図を作成
	map = new google.maps.Map( mapElm[0], {
		center: new google.maps.LatLng(26.698820, 127.933059 ),
		zoom: 15 ,
	});
	
	// マーカーの作成
	marker = new google.maps.Marker( {
		map: map ,
		position: new google.maps.LatLng( 26.69740142087048, 127.9333379497375 ) ,
	}) ;
	
	// アイコンを変更する
	marker.setOptions({
		icon: {
			url: 'icon/sakana.png',
			scaledSize: new google.maps.Size(32, 32) // サイズ
		}
	});
	
	// 吹き出しオブジェクトの作成
	infoWindow1 = new google.maps.InfoWindow({ 
		content: '<div class="text-success">テスト<br>畑</div>'
	});
	
	// ▼ マップ読込完了イベント
	google.maps.event.addListener(map, 'bounds_changed', function() {
		
		// 中央座標
		var latLng = map.getBounds().getCenter();
		var lat = latLng.lat();
		var lng = latLng.lng();
		jQuery('#center').html(lat + ', ' + lng);
		
		// 左上
		var lat = map.getBounds().getNorthEast().lat();
		var lng = map.getBounds().getNorthEast().lng();
		jQuery('#r_t').html(lat + ', ' + lng);
		

		// 右下
		var lat = map.getBounds().getSouthWest().lat();
		var lng = map.getBounds().getSouthWest().lng();  
		jQuery('#l_b').html(lat + ', ' + lng);

	});

	
	// マーカーのクリックイベント
	marker.addListener('click', ()=> {
		infoWindow1.open(map, marker); // 吹き出し表示
		
	});
	
	// 地図上をクリックしたらマーカーを移動させる
	map.addListener( "click", function ( argument ) {
		
		marker.setPosition(argument.latLng);

		var latLng = argument.latLng;
		var lat = latLng.lat();
		var lng = latLng.lng();
		
		// 中央座標
		jQuery('#center').html(lat + ', ' + lng);
		
		// 左上
		var lat = map.getBounds().getNorthEast().lat();
		var lng = map.getBounds().getNorthEast().lng();
		jQuery('#r_t').html(lat + ', ' + lng);
		
		// 右下
		var lat = map.getBounds().getSouthWest().lat();
		var lng = map.getBounds().getSouthWest().lng();  
		jQuery('#l_b').html(lat + ', ' + lng);


	}) ;
	
});
	

マーカーの表示切替

Demo


	var visible = marker.getVisible();
	if(visible == true){
		marker.setVisible(false);
	}else{
		marker.setVisible(true);
	}