Giới thiệu
Mình đang thực hiện chức năng sử dụng Google Map API để vẽ bản đồ trong dự án, trong đó có một số yêu cầu của Khách cần thực hiện, nên mình viết bài này để chia sẻ lại cách thức thực hiện những yêu cầu đó. Tóm tắt lại yêu cầu của Khách như sau
- Tạo bản đồ có mini map để đổi chế độ view thay cho button mặc định, khi di chuyển map chính thì mini map cũng sẽ di chuyển theo
- Tạo bản đồ với nhiều marker, thay icon marker
- Ẩn Google logo, footer của Google Map
Mini map chính là phần map nhỏ của bản đồ Google Map mà chúng ta hay dùng, nó giống như hình sau đây:
Tạo Map từ Google Map API
Đầu tiên chúng ta cần viết mã HTML như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <span class="token operator"><</span><span class="token operator">!</span><span class="token constant">DOCTYPE</span> html<span class="token operator">></span> <span class="token operator"><</span>html<span class="token operator">></span> <span class="token operator"><</span>head<span class="token operator">></span> <span class="token operator"><</span>title<span class="token operator">></span>Mini Google Map<span class="token operator"><</span><span class="token operator">/</span>title<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> Include Google Map <span class="token constant">API</span> <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>script src<span class="token operator">=</span><span class="token string">"https://maps.googleapis.com/maps/api/js?key=AIzaSyBIwzALxUPNbatRBj3Xi1Uhp0fFzwWNBkE&callback=initMap"</span> defer <span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>head<span class="token operator">></span> <span class="token operator"><</span>body<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> Element tạo map chính <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>div id<span class="token operator">=</span><span class="token string">"map"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token comment">// Function initMap được gọi sau khi tải xong Google Map API, nó sẽ tạo một bản đồ mới</span> <span class="token keyword">function</span> <span class="token function">initMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>Map</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"map"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> center<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">-</span><span class="token number">33.91721</span><span class="token punctuation">,</span> <span class="token number">151.2263</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// xác định vị trí trung tâm của map</span> zoom<span class="token operator">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token comment">// set zoom default là 8 (maximum là 20)</span> mapTypeControl<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment">// Ẩn button thay đổi mapType mặc định </span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator"><</span>style<span class="token operator">></span> #map <span class="token punctuation">{</span> height<span class="token operator">:</span> <span class="token number">100</span><span class="token operator">%</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> html<span class="token punctuation">,</span> body <span class="token punctuation">{</span> height<span class="token operator">:</span> <span class="token number">100</span><span class="token operator">%</span><span class="token punctuation">;</span> margin<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span> padding<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span> position<span class="token operator">:</span> relative<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>body<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>html<span class="token operator">></span> |
Tạo markers
Tiếp theo chúng ta cần tạo ra một danh sách marker bằng cách tao 1 mảng fakeMarkers, sau đó chạy vòng lặp để tạo marker và info window như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <span class="token operator"><</span>script<span class="token operator">></span> <span class="token operator">...</span> <span class="token keyword">function</span> <span class="token function">initMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>Map</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"map"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> center<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">-</span><span class="token number">33.91721</span><span class="token punctuation">,</span> <span class="token number">151.2263</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// xác định vị trí trung tâm của map</span> zoom<span class="token operator">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token comment">// set zoom default là 8 (maximum là 20)</span> mapTypeControl<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment">// Ẩn button thay đổi mapType mặc định </span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> fakeMarkers <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91721</span><span class="token punctuation">,</span> <span class="token number">151.2263</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 1'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91662347903106</span><span class="token punctuation">,</span> <span class="token number">151.22879464019775</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 2'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.916365282092855</span><span class="token punctuation">,</span> <span class="token number">151.22937399734496</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 3'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91665018901448</span><span class="token punctuation">,</span> <span class="token number">151.2282474695587</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 4'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.919543720969806</span><span class="token punctuation">,</span> <span class="token number">151.23112279762267</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 5'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91608037421864</span><span class="token punctuation">,</span> <span class="token number">151.23288232673644</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 6'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91851096391805</span><span class="token punctuation">,</span> <span class="token number">151.2344058214569</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 7'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91818154739766</span><span class="token punctuation">,</span> <span class="token number">151.2346203981781</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 8'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> position<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>LatLng</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33.91727341958453</span><span class="token punctuation">,</span> <span class="token number">151.23348314155578</span><span class="token punctuation">)</span><span class="token punctuation">,</span> title<span class="token operator">:</span> <span class="token string">'Info Window 9'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Tạo mảng markers và mảng infoWindow</span> <span class="token keyword">const</span> markers <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">const</span> infoWindow <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Duyệt vòng lặp fakeMarkers</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> fakeMarkers<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> markers<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>Marker</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment">// Tạo item markeer</span> position<span class="token operator">:</span> fakeMarkers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>position<span class="token punctuation">,</span> icon<span class="token operator">:</span> <span class="token string">'https://developers.google.com/maps/documentation/javascript/examples/full/images/info-i_maps.png'</span><span class="token punctuation">,</span> <span class="token comment">// Thay icon marker default</span> map<span class="token operator">:</span> map<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Tạo HTML cho content info window </span> <span class="token keyword">const</span> dom <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> dom<span class="token punctuation">.</span>className <span class="token operator">=</span> <span class="token string">'gmap-info-window'</span><span class="token punctuation">;</span> dom<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><div class="gmap-info-title"></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>fakeMarkers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>title<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></div></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> <span class="token comment">// Tạo các info </span> infoWindow<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">window<span class="token punctuation">.</span>google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>InfoWindow</span><span class="token punctuation">(</span><span class="token punctuation">{</span> content<span class="token operator">:</span> dom <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Thêm event khi click vào marker sẽ hiển thị lên info window tương ứng marker đó</span> markers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">addListener</span><span class="token punctuation">(</span><span class="token string">"click"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> infoWindow<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>map<span class="token punctuation">,</span> markers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator">...</span> |
Tạo mini map
Để tạo được mini map thì mình sẽ tạo ra một map mới neo ở một element HTML có id=”mini-map” với typeMap của minimap sẽ là dạng satellite (mặc định ở map chính đang là dạng roadmap). Tiếp theo sẽ thêm event khi click vào minimap sẽ thay đổi map chính về satellite và ở mini map sẽ thay đổi typeMap về roadmap, cụ thể code như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> Element tạo mini map <span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</span>div id<span class="token operator">=</span><span class="token string">"mini-map"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span> <span class="token comment">// JS tạo mini map mà thêm event</span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token operator">...</span> <span class="token comment">// Tạo mini map</span> <span class="token keyword">const</span> mapMini <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">google<span class="token punctuation">.</span>maps<span class="token punctuation">.</span>Map</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"mini-map"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> zoomControl<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> mapTypeControl<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> fullscreenControl<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> draggable<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> zoom<span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span> mapTypeId<span class="token operator">:</span> <span class="token string">'satellite'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Đặt giá trị center của mini map lấy center của map lớn</span> mapMini<span class="token punctuation">.</span><span class="token function">setCenter</span><span class="token punctuation">(</span>map<span class="token punctuation">.</span><span class="token function">getCenter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Thêm event khi click mini map thì đổi mapType của 2 map cho nhau</span> mapMini<span class="token punctuation">.</span><span class="token function">addListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> miniType <span class="token operator">=</span> mapMini<span class="token punctuation">.</span><span class="token function">getMapTypeId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> newMiniType <span class="token operator">=</span> miniType <span class="token operator">===</span> <span class="token string">'satellite'</span> <span class="token operator">?</span> <span class="token string">'roadmap'</span> <span class="token operator">:</span> <span class="token string">'satellite'</span><span class="token punctuation">;</span> map<span class="token punctuation">.</span><span class="token function">setMapTypeId</span><span class="token punctuation">(</span>miniType<span class="token punctuation">)</span><span class="token punctuation">;</span> mapMini<span class="token punctuation">.</span><span class="token function">setMapTypeId</span><span class="token punctuation">(</span>newMiniType<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Đặt lại giá trị center của mini map khi map lớn thay đổi vị trí</span> map<span class="token punctuation">.</span><span class="token function">addListener</span><span class="token punctuation">(</span><span class="token string">'center_changed'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> mapMini<span class="token punctuation">.</span><span class="token function">setCenter</span><span class="token punctuation">(</span>map<span class="token punctuation">.</span><span class="token function">getCenter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> |
Kết quả sẽ được như hình dứoi đây
Thêm CSS ẩn footer và logo Google
Để ẩn thì chúng ta cần override lại CSS mặc định của Google Map, đoạn code như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token operator">...</span> <span class="token operator"><</span>style<span class="token operator">></span> a<span class="token punctuation">[</span>href<span class="token operator">^=</span><span class="token string">"http://maps.google.com/maps"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> a<span class="token punctuation">[</span>href<span class="token operator">^=</span><span class="token string">"https://maps.google.com/maps"</span><span class="token punctuation">]</span><span class="token punctuation">{</span> display<span class="token operator">:</span>none <span class="token operator">!</span>important <span class="token punctuation">}</span> <span class="token punctuation">.</span>gmnoprint a<span class="token punctuation">,</span> <span class="token punctuation">.</span>gmnoprint span<span class="token punctuation">,</span> <span class="token punctuation">.</span>gm<span class="token operator">-</span>style<span class="token operator">-</span>cc <span class="token punctuation">{</span> display<span class="token operator">:</span>none<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span>gmnoprint div <span class="token punctuation">{</span> background<span class="token operator">:</span>none <span class="token operator">!</span>important<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>style<span class="token operator">></span> |
Các bạn có thể xem kết quả ở link sau đây
Kết luận
Mong rằng bài viết có thể giúp ích được cho các bạn đang tìm hiểu về Google Map API, nếu có câu hỏi hoặc góp ý nào hãy viết dưới comment nhé, thanks!