반응형
    
    
    
  이전 블로그에 이어서 지도에 마우스 클릭으로 해당 위치의 좌표값을 취득하는 방법에 대해 알아 보고자 합니다.
geocoding 으로 주소지 또는 POI 정보로 지도 경위도 좌표값을 얻을 수 있는데 Mapbox에서 모든 정보를 가지고 있지 않기 때문에 정확한 위치로 매칭되지 않을 수 있습니다.
2023.12.11 - [개발활용툴] - Mapbox사용법(4) - geocoding
Mapbox사용법(4) - geocoding
Mapbox에서 지원하는 다양한 기능중에서 실제 어플리케이션 개발시 사용할 만한 기능에 대해 설명하고자 합니다. geocoding(지오코딩) 기능은 주소지 또는 POI(시설물) 정보를 텍스트로 입력시 GPS 경
peter-codinglife.tistory.com
정확한 위치 값을 얻기 위해 검색창으로 대략적인 위치로 이동한 후 지도를 확인하고 정확한 위치를 마우스로 클릭하여 좌표값을 얻어오는 방법에 대해 아래와 같이 예시를 통해 설명하겠습니다.
1. 지도에 검색창 추가하기
지도에 geocoding 기능을 addControl 로 아래와 같이 추가합니다.
// Add the control to the map.
map.addControl(
new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl
})
);
2. 마우스 이벤트 설정하기
map.on 함수에 'click' 이벤트 발생시 지도의 속성 데이터를 가져옵니다.
// Example of a MapMouseEvent of type "click"
map.on('click', (e) => {
console.log(e);
// {
//     lngLat: {
//         lng: 40.203,
//         lat: -74.451
//     },
//     originalEvent: {...},
//     point: {
//         x: 266,
//         y: 464
//     },
//      target: {...},
//      type: "click"
// }
});
3. 데이터 입력창으로 좌표값 불러오기
상기 기능을 이용해서 아래와 같이 실제 예시로 GPS좌표를 html form tag의 input tag 로 데이터를 넘겨서 데이터베이스에 저장합니다.
new.ejs 파일
<div id="map" class="mb-3"></div>
<div class="mb-3">
    <label class="form-label" for="geocoord">위치(선택)</label>
    <input
      class="form-control"
      type="text"
      name="campground[geocoord]"
      id="geocoord"
      readonly
    />
</div>
        
<script>
  const mapToken = "<%- process.env.MAPBOX_TOKEN %>";
</script>
<script src="/javascripts/newPageMap.js"></script>
newPageMap.js 파일
mapboxgl.accessToken = mapToken;
const map = new mapboxgl.Map({
  container: "map", // container ID
  style: "mapbox://styles/mapbox/streets-v12", // style URL
  center: [126.978433, 37.56669], // starting position [lng, lat]
  zoom: 10, // starting zoom
});
// Add the control to the map.
map.addControl(
  new MapboxGeocoder({
    accessToken: mapboxgl.accessToken,
    mapboxgl: mapboxgl,
  })
);
// Add Zomm In/Out Control to the map.
map.addControl(new mapboxgl.NavigationControl()); 
map.on("click", (e) => {
  console.log("e", e);
  const coord = JSON.stringify(e.lngLat);
  const geometryData = JSON.parse(coord);
  // console.log("lng", geometryData.lng);
  console.log("coord", coord);
  new mapboxgl.Marker()
    .setLngLat([geometryData.lng, geometryData.lat])
    .addTo(map);
  document.getElementById("geocoord").value = [
    geometryData.lng,
    geometryData.lat,
  ];
});
mapboxgl.setRTLTextPlugin(
  "https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.js"
);
map.addControl(
  new MapboxLanguage({
    defaultLanguage: "ko",
  })
);
- map.on('click'). 이벤트로 취득한 데이터 (e) 값은 다음과 같이 다양합니다.

- 이 데이터중에서 GPS 좌표에 해당되는 lngLat 값을 JSON 포맷으로 변경하고 parsing 하여 geometryData 로 저장합니다.
- 해당 좌표값을 지도에 표출하기 위해 Marker에 좌표 값을 지정합니다.
- 검색창에서 강남역 을 검색하고 여러 데이터중 첫번째 리스트를 선택합니다.

- 검색한 데이터는 파란색 아이콘 위치로 이동합니다. 마우스로 분당선 강남역 위치를 클릭하면 그린색 아이콘이 추가되고 해당 좌표값을 가져 옵니다.
- 좌표값은 document.getElementById("geocoord").value 를 통해 input tag의 id 가 geocoord 인 입력필드로 보냅니다.

- 해당 위치값을 데이터베이스에 저장하도록 합니다.
- [참고] input tag로 입력한 좌표값은 string type이어서 number type으로 변경이 필요
- 텍스트로 넘겨 받은 데이터를 배열로 바꾸고, 좌표 소숫점 자리를 6자리로 조정하고, 숫자 타입으로 변경
 
    const geoCoord = req.body.campground.geocoord
      .split(",")
      .map((i) => Number(i).toFixed(6));
    const newGeoCoord = geoCoord.map((i) => Number(i));
반응형
    
    
    
  '개발활용툴' 카테고리의 다른 글
| 날씨 API - OpenWeather 사용하기(2) (0) | 2023.12.14 | 
|---|---|
| 날씨 API - OpenWeather 사용하기(1) (0) | 2023.12.13 | 
| Mapbox사용법(4) - geocoding (3) | 2023.12.11 | 
| Mapbox 사용법(3) Marker 표출하기 (0) | 2023.11.13 | 
| Mapbox 사용법 (2) - 클러스터 사용예제 (0) | 2023.11.12 | 
 
										
									 
										
									 
										
									