728x90
1. 문제상황
우리 사이트는 각 대리점별로 위치와 리뷰를 담은 디테일 페이지가 있다. 이번에는 이 디테일 페이지 맨 위에 로드뷰를 띄워서 위치를 더 확실히 알려주려고 한다.
(공식문서 참고!https://apis.map.kakao.com/web/sample/roadviewOverlay1/)
2. 매장 detail 페이지에 매장 로드뷰를 띄워보자!
url.py
urlpatterns = [
...
path('<int:pk>', views.detail, name="store_detail"),
...
]
👉🏻먼저 매장 디테일 페이지로 가는 url을 파주자! '<int:pk>' 자리에 매장 id값을 넣어주어 각 매장의 디테일 페이지로 이동할 수 있다.
views.py
def detail(request, pk):
store = get_object_or_404(Store, pk=pk)
return render(request, 'store/detail.html', locals())
👉🏻url에서 받아온 id(=pk)값으로 매장을 찾아 template으로 return 해준다.
detail.html
<!-- 로드뷰를 표시할 div 입니다 -->
<div id="roadview" class="image-container"></div>
👉🏻먼저 로드뷰를 띄울 div를 판다.
var roadviewContainer = document.getElementById('roadview'); //로드뷰를 표시할 div
var roadview = new kakao.maps.Roadview(roadviewContainer); //로드뷰 객체
var roadviewClient = new kakao.maps.RoadviewClient(); //좌표로부터 로드뷰 파노ID를 가져올 로드뷰 helper객체
var geocoder = new kakao.maps.services.Geocoder(); // 주소-좌표 변환 객체를 생성
function Roadview (){
// 주소로 좌표를 검색합니다
geocoder.addressSearch('{{ store.location }}', function(result, status) {
// 정상적으로 검색이 완료됐으면
if (status === kakao.maps.services.Status.OK) {
var position = new kakao.maps.LatLng(result[0].y, result[0].x);
// 특정 위치의 좌표와 가까운 로드뷰의 panoId를 추출하여 로드뷰를 띄운다.
roadviewClient.getNearestPanoId(position, 50, function(panoId) {
roadview.setPanoId(panoId, position); //panoId와 중심좌표를 통해 로드뷰 실행
rvResetValue.panoId = panoId;
});
setTimeout(rvMarker, 1500);
function rvMarker() {
// 로드뷰에 올릴 마커를 생성합니다.
var rMarker = new kakao.maps.Marker({
position: position,
map: roadview //map 대신 roadview(로드뷰 객체)로 설정하면 로드뷰에 올라갑니다.
});
// 로드뷰에 올릴 장소명 인포윈도우를 생성합니다.
var rLabel = new kakao.maps.InfoWindow({
position: position,
content: '{{ store.name }}'
});
rLabel.open(roadview, rMarker);
// 로드뷰 마커가 중앙에 오도록 로드뷰의 viewpoint 조정 합니다.
var projection = roadview.getProjection(); // viewpoint(화면좌표)값을 추출할 수 있는 projection 객체를 가져옵니다.
// 마커의 position과 altitude값을 통해 viewpoint값(화면좌표)를 추출합니다.
var viewpoint = projection.viewpointFromCoords(rMarker.getPosition(), rMarker.getAltitude());
roadview.setViewpoint(viewpoint); //로드뷰에 뷰포인트를 설정합니다.
}
}
});
}
Roadview();
👉🏻전체 코드는 다음과 같다.
var roadviewContainer = document.getElementById('roadview'); //로드뷰를 표시할 div
var roadview = new kakao.maps.Roadview(roadviewContainer); //로드뷰 객체
var roadviewClient = new kakao.maps.RoadviewClient(); //좌표로부터 로드뷰 파노ID를 가져올 로드뷰 helper객체
var geocoder = new kakao.maps.services.Geocoder(); // 주소-좌표 변환 객체를 생성
👉🏻먼저 로드뷰를 띄울 기본적인 도구들을 세팅한다.
function Roadview (){
// 주소로 좌표를 검색합니다
geocoder.addressSearch('{{ store.location }}', function(result, status) {
// 정상적으로 검색이 완료됐으면
if (status === kakao.maps.services.Status.OK) {
var position = new kakao.maps.LatLng(result[0].y, result[0].x);
// 특정 위치의 좌표와 가까운 로드뷰의 panoId를 추출하여 로드뷰를 띄운다.
roadviewClient.getNearestPanoId(position, 50, function(panoId) {
roadview.setPanoId(panoId, position); //panoId와 중심좌표를 통해 로드뷰 실행
rvResetValue.panoId = panoId;
});
}
});
}
👉🏻그리고 Roadview라는 함수를 만든다.
- view에서 받아온 변수인 store에서 location(주소)값을 addressSearch함수에 넣어 좌표를 검색한다.
- 검색이 완료됐으면 해당 좌표로 로드뷰를 띄운다.
function rvMarker() {
// 로드뷰에 올릴 마커를 생성합니다.
var rMarker = new kakao.maps.Marker({
position: position,
map: roadview //map 대신 roadview(로드뷰 객체)로 설정하면 로드뷰에 올라갑니다.
});
// 로드뷰에 올릴 장소명 인포윈도우를 생성합니다.
var rLabel = new kakao.maps.InfoWindow({
position: position,
content: '{{ store.name }}'
});
rLabel.open(roadview, rMarker);
// 로드뷰 마커가 중앙에 오도록 로드뷰의 viewpoint 조정 합니다.
var projection = roadview.getProjection(); // viewpoint(화면좌표)값을 추출할 수 있는 projection 객체를 가져옵니다.
// 마커의 position과 altitude값을 통해 viewpoint값(화면좌표)를 추출합니다.
var viewpoint = projection.viewpointFromCoords(rMarker.getPosition(), rMarker.getAltitude());
roadview.setViewpoint(viewpoint); //로드뷰에 뷰포인트를 설정합니다.
}
👉🏻그리고 Roadview 함수 안에 rvMarker함수를 추가한다. 이 함수는 로드뷰에 마커와 인포윈도우를 올린다.
- 아까 구한 좌표로 마커를 찍고 위에 인포윈도우를 올린다.
- 로드뷰 마커가 로드뷰의 중앙에 오도록 viewpoint를 조정한다.
728x90
'그 땐 IT활동했지 > 그 땐 영일영 근무했지' 카테고리의 다른 글
[010/Django] secret.json | API KEY 숨기기 (0) | 2022.04.22 |
---|---|
[010/API] Naver API | 블로그, 카페 글 크롤링 해오기 (0) | 2022.04.19 |
[010/API] Kakao Map API | 인포윈도우 커스텀하기 (0) | 2022.04.17 |
[010/API] Kakao Map API | 통신사 카테고리 넣기 (1) | 2022.04.14 |
[010/API] Kakao Map API | 마커 커스텀하기 (0) | 2022.04.13 |