Google Maps 자바스크립트 API로 여러 마커를 좋은 느낌으로 표시
14199 단어 자바스크립트GoogleMapsAPI
소스는 여기
덧붙여 API Key는 취득하고 있는 것을 전제로 진행합니다.
취득이 아직인 분은 여기 를 참고로 해 주세요.
Google Map 표시
기본적으로 문서을 읽으면 쉽게 표시 할 수 있습니다.
<div id="map"><!-- Google Map表示 --></div>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
<script>
function initMap() {
// 日本の中央を表示する
const defaultSettings = {zoom: 15, center: {lat: 40.804365, lng: 141.134867}};
const map = new google.maps.Map(
document.querySelector('#map'),
defaultSettings
);
}
</script>
<div id="map"><!-- Google Map表示 --></div>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
<script>
function initMap() {
// 日本の中央を表示する
const defaultSettings = {zoom: 15, center: {lat: 40.804365, lng: 141.134867}};
const map = new google.maps.Map(
document.querySelector('#map'),
defaultSettings
);
}
</script>
div
를 준비 initMap
정의 div
의 DOM
와 줌 레벨이나 초기 표시 위치를 설정이것만
API Key 취득 쪽이 귀찮네요.
지정된 위치에 마커 추가
이쪽도 간단합니다.
문서
// 表示データ
const data = [
{ name: "東京タワー", lat: 35.6585805, lng: 139.7454329 },
{ name: "京都タワー", lat: 34.9875441, lng: 135.7592164 },
{ name: "通天閣", lat: 34.6524992, lng: 135.5063058 }
];
function initMap() {
// 省略
// 現在表示されているinfoWindowオブジェクト
let currentWindow;
data.map(d => {
// マーカーをつける
const marker = new google.maps.Marker({
position: {lat: d.lat, lng: d.lng},
map: map
});
// マーカークリックしたら地名をポップアップさせる
marker.addListener('click', () => {
currentWindow && currentWindow.close();
const infoWindow = new google.maps.InfoWindow({content: d.name});
infoWindow.open(map, marker);
currentWindow = infoWindow;
});
});
}
json을 map
로 돌려 Marker
객체를 만듭니다.
모처럼이므로 마커를 클릭하면 그 지명이 표시되도록했습니다.
// 表示データ
const data = [
{ name: "東京タワー", lat: 35.6585805, lng: 139.7454329 },
{ name: "京都タワー", lat: 34.9875441, lng: 135.7592164 },
{ name: "通天閣", lat: 34.6524992, lng: 135.5063058 }
];
function initMap() {
// 省略
// 現在表示されているinfoWindowオブジェクト
let currentWindow;
data.map(d => {
// マーカーをつける
const marker = new google.maps.Marker({
position: {lat: d.lat, lng: d.lng},
map: map
});
// マーカークリックしたら地名をポップアップさせる
marker.addListener('click', () => {
currentWindow && currentWindow.close();
const infoWindow = new google.maps.InfoWindow({content: d.name});
infoWindow.open(map, marker);
currentWindow = infoWindow;
});
});
}
Marker
각 개체에 click
이벤트 부여 infoWindow
개체가 있으면 해당 창을 닫습니다.infoWindow
오브젝트를 작성해 window를 연다 infoWindow
개체 저장 infoWindow
오브젝트를 보관 유지하는 것이 조금 불격입니다만, 이것 이외에 방법이 없을 것 같습니다.열려있는 window를 얻을 수 있으면 좋지만 ......
마커가 화면에 맞도록 합니다.
마커를 볼 수 있었으면 좋지만 화면에 맞지 않습니다.
그럴 때는 fitBounds
메소드를 사용합니다.
인수에는, LatLngBounds
클래스로 범위의 인스턴스를 건네줍니다.LatLngBounds
의 인수에는 위도 경도의 최소치, 최대치를 건네줍니다.
// マーカーがいい感じに表示できるよう調整
map.fitBounds(new google.maps.LatLngBounds(
// sw
{
lat: Math.min(...data.map(d => d.lat)),
lng: Math.min(...data.map(d => d.lng))
},
// ne
{
lat: Math.max(...data.map(d => d.lat)),
lng: Math.max(...data.map(d => d.lng))
}
));
여기서 중요한 것은 Map
객체를 만들 때 지정한 maxZoom
옵션입니다.
function initMap() {
// 日本の中央を表示する
const defaultSettings = {zoom: 15, /* これ */ maxZoom: 15, center: {lat: 40.804365, lng: 141.134867}};;
const map = new google.maps.Map(
document.querySelector('#map'),
defaultSettings
);
// 以下省略
}
이 옵션이 없으면, 마커가 1개이거나, 마커끼리가 극단에 가까우면, 확대되어 너무 보기 좋게 되어 버립니다.
이런 식으로
동적으로 확대율을 변경하는 방법
기본적으로 fitBounds
이나 maxZoom
옵션으로 부족하다고 생각합니다만, 어떠한 조건을 붙여 확대율을 동적으로 변경해야 할 경우는 다음과 같이 합니다.
const listener = google.maps.event.addListener(map, 'idle', () => {
// 実際には何らかの条件で拡大率を取得設定する
map.getZoom() > 15 && map.setZoom(15);
google.maps.event.removeListener(listener);
});
Map 이벤트로 addListener
하고 줌 레벨을 바꾸고 있습니다.
왜 이런 귀찮은 일을 해야 하는가?
실은 fitBounds
를 실행한 뒤는 setZoom()
도 getZoom()
도 효과가 없습니다.
how do I get the zoom level after fitBounds
google.maps.event
그렇다면 무엇이든 좋을 것 같았기 때문에, 다양한 처리가 완료한 타이밍에 실행된다 idle
이벤트로 처리하도록(듯이) 했습니다.
버그인지 사양인지는 모릅니다만, 확대율을 설정할 수 없는 경우는, 상기와 같이 해 주세요.
참고
Google Maps Platform Documentation
Reference
이 문제에 관하여(Google Maps 자바스크립트 API로 여러 마커를 좋은 느낌으로 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KeisukeKudo/items/62ab555d19ddc8b6e068
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// マーカーがいい感じに表示できるよう調整
map.fitBounds(new google.maps.LatLngBounds(
// sw
{
lat: Math.min(...data.map(d => d.lat)),
lng: Math.min(...data.map(d => d.lng))
},
// ne
{
lat: Math.max(...data.map(d => d.lat)),
lng: Math.max(...data.map(d => d.lng))
}
));
function initMap() {
// 日本の中央を表示する
const defaultSettings = {zoom: 15, /* これ */ maxZoom: 15, center: {lat: 40.804365, lng: 141.134867}};;
const map = new google.maps.Map(
document.querySelector('#map'),
defaultSettings
);
// 以下省略
}
기본적으로
fitBounds
이나 maxZoom
옵션으로 부족하다고 생각합니다만, 어떠한 조건을 붙여 확대율을 동적으로 변경해야 할 경우는 다음과 같이 합니다.const listener = google.maps.event.addListener(map, 'idle', () => {
// 実際には何らかの条件で拡大率を取得設定する
map.getZoom() > 15 && map.setZoom(15);
google.maps.event.removeListener(listener);
});
Map 이벤트로
addListener
하고 줌 레벨을 바꾸고 있습니다.왜 이런 귀찮은 일을 해야 하는가?
실은
fitBounds
를 실행한 뒤는 setZoom()
도 getZoom()
도 효과가 없습니다.how do I get the zoom level after fitBounds
google.maps.event
그렇다면 무엇이든 좋을 것 같았기 때문에, 다양한 처리가 완료한 타이밍에 실행된다 idle
이벤트로 처리하도록(듯이) 했습니다.버그인지 사양인지는 모릅니다만, 확대율을 설정할 수 없는 경우는, 상기와 같이 해 주세요.
참고
Google Maps Platform Documentation
Reference
이 문제에 관하여(Google Maps 자바스크립트 API로 여러 마커를 좋은 느낌으로 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KeisukeKudo/items/62ab555d19ddc8b6e068
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Google Maps 자바스크립트 API로 여러 마커를 좋은 느낌으로 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KeisukeKudo/items/62ab555d19ddc8b6e068텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)