지역의 일부를 덮는 반투명 패널이있는 Google지도가 있습니다. 지도에서 부분적으로 가려진 부분을 고려하여지도의 중심점을 조정하고 싶습니다. 아래 이미지를 참조하십시오. 이상적으로는 십자선과 핀이 배치되는 위치가지도의 중심점이됩니다.
그게 말이 되길 바랍니다.
이유는 간단합니다. 확대 / 축소 할 때 50 % 50 %가 아닌 십자선 위에지도를 중앙에 배치해야합니다. 또한지도에 마커를 플로팅하고 순서대로 이동합니다. 지도가 중심에있을 때 오프셋 위치에 있어야합니다.
미리 감사드립니다!
답변
관련 이전 답변 을 찾으면 특별히 어렵지 않습니다 .
지도의 중심을 세계 좌표로 변환하고, 원하는 위치에 겉보기 중심을 배치하기 위해지도의 중심이 필요한 위치를 찾은 다음 실제 중심을 사용하여지도의 중심을 다시 조정해야합니다 .
API는 항상 뷰포트의 중앙에지도를 중앙에 위치 시키므로 사용 map.getCenter()
하는 경우 명백한 중심이 아닌 실제 중심을 반환 하므로주의해야합니다 . API를 오버로드하여 해당 메서드 getCenter()
와 setCenter()
메서드를 대체 할 수 있다고 생각하지만 그렇게 하지 않았습니다.
아래 코드. 온라인 예 . 이 예에서 버튼을 클릭하면지도의 중심 (도로 교차로가 있음)이 100px 아래로 200px 왼쪽으로 이동합니다.
function offsetCenter(latlng, offsetx, offsety) {
// latlng is the apparent centre-point
// offsetx is the distance you want that point to move to the right, in pixels
// offsety is the distance you want that point to move upwards, in pixels
// offset can be negative
// offsetx and offsety are both optional
var scale = Math.pow(2, map.getZoom());
var worldCoordinateCenter = map.getProjection().fromLatLngToPoint(latlng);
var pixelOffset = new google.maps.Point((offsetx/scale) || 0,(offsety/scale) ||0);
var worldCoordinateNewCenter = new google.maps.Point(
worldCoordinateCenter.x - pixelOffset.x,
worldCoordinateCenter.y + pixelOffset.y
);
var newCenter = map.getProjection().fromPointToLatLng(worldCoordinateNewCenter);
map.setCenter(newCenter);
}
답변
또한 maps 객체의 panBy (x : number, y : number) 함수를 살펴보십시오.
문서는 함수에 대해 다음과 같이 언급합니다.
지정된 거리 (픽셀)만큼지도 중심을 변경합니다. 거리가지도의 너비와 높이보다 작 으면 전환이 부드럽게 애니메이션됩니다. 지도 좌표계는 서쪽에서 동쪽 (x 값)과 북쪽에서 남쪽 (y 값)으로 증가합니다.
다음과 같이 사용하십시오.
mapsObject.panBy(200, 100)
답변
다음은 픽셀 대신 백분율을 사용할 수 있으므로 반응 형 디자인에서 더 유용 할 수있는 더 간단한 방법입니다. 세계 좌표도없고 LatLngs to Points도 없습니다!
var center; // a latLng
var offsetX = 0.25; // move center one quarter map width left
var offsetY = 0.25; // move center one quarter map height down
var span = map.getBounds().toSpan(); // a latLng - # of deg map spans
var newCenter = {
lat: center.lat() + span.lat()*offsetY,
lng: center.lng() + span.lng()*offsetX
};
map.panTo(newCenter); // or map.setCenter(newCenter);
답변
다음 panBy()
은지도 API의 방법을 사용하여 문제를 해결하는 예입니다 . http://jsfiddle.net/upsidown/2wej9smf/
답변
또 다른 가장 간단한 해결책을 찾았습니다. fitBounds 메서드를 사용하는 경우 선택적 두 번째 인수를 해당 메서드에 전달할 수 있습니다. 이 인수는 패딩이며 경계를 맞추는 동안 고려됩니다.
// pass single side:
map.fitBounds(bounds, { left: 1000 })
// OR use Number:
map.fitBounds(bounds, 20)
추가 읽기 : 공식 문서 .
답변
앤드류가 답입니다. 그러나 제 경우에는 map.getBounds ()가 계속해서 undefined를 반환했습니다. bounds_changed 이벤트를 기다리면서 수정 한 다음 함수를 호출하여 중심을 오프셋했습니다. 이렇게 :
var center_moved = false;
google.maps.event.addListener(map, 'bounds_changed', function() {
if(!center_moved){
offsetCenter(map.getCenter(), 250, -200);
center_moved = true;
}
});
답변
오래된 질문입니다. 하지만 CSS 중심적인 방법은 어떻습니까?
http://codepen.io/eddyblair/pen/VjpNQQ
내가 한 일은 :
-
컨테이너에지도와 오버레이를
overflow: hidden
-
오버레이를
position: absolute
-
음수를 설정하여 오버레이 너비 (패딩 및 오프셋 포함)만큼 지도의 겉보기 너비 를 확장했습니다
margin-left
. -
그런 다음 https://www.google.com/permissions/geoguidelines/attr-guide.html 을 준수하기 위해 위젯 및 속성을 배치했습니다
div
.
이렇게하면지도의 중심이 원하는 영역의 중심과 일직선이됩니다. js는 표준 맵 js입니다.
스트리트 뷰의 아이콘 위치 변경은 독자를위한 연습입니다. 🙂
당신은 왼쪽, 단지 변화 라인에 오버레이 원하는 경우 24
margin-left
에 margin-right
라인 (32) right
에을 left
.