1편을 보고오지 않았다면
먼저 보고 오시기를 권장 드립니다.
https://want-all.tistory.com/3
Flutter (플러터) - 구글지도 사용 - (1) 환경세팅
기피 기능 중 하나인 지도를 구현하기 위해서는상당히, 많은 작업이 필요하다. 이편에서는 Flutter 프로젝트 내부에서구글 맵을 생성하는 내용에 대하여포스팅을 하려고 한다. 플러터에서
want-all.tistory.com
이번 편에서는
화면에 지도를 구현 하는 방식에 대해서 포스팅 합니다.
1) 위젯 자체의 생성
GoogleMap(
buildingsEnabled: false, // 건물 3D 높이 표현
onMapCreated: (GoogleMapController controller) async {
LocationMapController.to.mapController = controller.obs;
controller.setMapStyle('''[
{
"featureType": "poi.business",
"elementType": "all",
"stylers": [
{ "visibility": "off" }
]
},
{
"featureType": "road",
"elementType": "labels",
"stylers": [
{"visibility": "off"}
]
},
{
"featureType": "transit.station.bus",
"elementType": "all",
"stylers": [
{ "visibility": "off" }
]
},
{
"featureType": "administrative",
"elementType": "labels",
"stylers": [
{ "visibility": "off" }
]
}
]''');
},
onTap: (LatLng) {
controller.preview.value = false;
},
circles: Set.from(controller.regionsRadius.map((element) => element)),
markers: Set.from(controller.regionsMarkers.map((element) => element)),
initialCameraPosition: const CameraPosition(
zoom: 12.5,
//! 서울 광진구 자양동 624-26 센터 고정 좌표
target: LatLng(37.53539088994158, 127.08281443453849),
tilt: 0, // 기울기
),
compassEnabled: false, // 나침반 유무
myLocationEnabled: true, // 현재 위치 파란 점 활성화
myLocationButtonEnabled: false, // 현재 위치로 이동하는 버튼 활성화
minMaxZoomPreference:
const MinMaxZoomPreference(10, 16), // 최소 및 최대 줌 레벨 설정
mapToolbarEnabled: false,
zoomControlsEnabled: false,
)
각 필드 설명.
- buildingsEnabled : 건물 높이 3D 표현 ( 상세한 지도를 보려면 거의 반 필수적으로 켜줘야 함)
- onMapCreated : 지도 생길 때 작동 함수
- 현재는 setMapStyle 이란 옵션을 활용하여 지도에서 보이는 도로명 주소, 특정 마커들을 내가 원하는 것만 보이게 커스텀 함.
Android용 Maps SDK 스타일 참조 | Maps SDK for Android | Google for Developers
새로운 지도 스타일이 곧 Google Maps Platform에 제공될 예정입니다. 이 지도 스타일 지정 업데이트에는 새로운 기본 색상 팔레트와 지도 환경 및 사용성 개선사항이 포함됩니다. 모든 지도 스타일이
developers.google.com
- onTap : 지도 클릭시 실행되는 콜백 함수
- markers : 지도에 그려질 마커
- initialCameraPosition : 초기 지도의 좌표와 줌 배율
이 정도가 중요한 설정 정도고,
나머지는 전부 주석을 추가 해놓았으니 확인해보면 좋을 것 같다.
2) 지도 위의 마커의 실시간 변화를 위한 소켓 적용
본인의 프로덕트에서는 지도의 마커가 유동성있게 변경되어야 해서,
소켓 (실시간 통신) 을 적용 시켜놓아야 했는데,
그에 따른 코드까지 기술 합니다.
StreamBuilder(
stream: Socket.getResponse,
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
var decodeData = Model.fromJson(snapshot.data);
controller.removeMarker(decodeData.id);
controller.makePin(decodeData);
}
return Obx(
() => GoogleMap(
당연히 계속 움직이는 데이터라면 StreamBuilder로 감싸줘야 하고,
stream : 어떤 데이터가 계속 들어와 ? < 를 설정해주는 부분입니다.
builder : 그래서 뭘 그릴건데 ?
여기서
snapshot 데이터가 실시간 변경 데이터 입니다.
구글 지도에서는 마커를 그렸으면, 그 상태에서 수정하는 것이 아닌
"기존 마커의 삭제" 이후 "새 마커의 생성" 의 방식으로 이루어 집니다.
따라서
모델 형식에 따라 데이터를 받아오고,
기존 마커 삭제 -> 새 마커 생성
의 코드를 순서대로 적용해주면 완료 입니다.
고생하셨습니다.
'개발 - Flutter' 카테고리의 다른 글
선택 안됨 Flutter (플러터) - 구글지도 사용 - (4) 커스텀 마커 (0) | 2024.10.07 |
---|---|
Flutter (플러터) - 구글지도 사용 - (3) 마커, 반경 생성 (0) | 2024.10.07 |
Flutter (플러터) - 구글지도 사용 - (1) 환경세팅 (2) | 2024.10.07 |
[ 001 ] Flutter (플러터) - 텍스트 내 링크 연동 (0) | 2024.10.07 |