LandingMap.js
5.74 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*global kakao*/
import React, { useEffect, useState } from "react";
import { Input, } from "reactstrap";
import { Label, Row, Col, FormGroup } from "reactstrap";
import appKey from "../config/appKey.json";
const LandingMap = (props) => {
const [FDatas, setFDatas] = useState([]);
const [selectedOption, setselectedOption] = useState('');
window.onload = function() {
let init = document.getElementById('init');
init.click();
}
useEffect(() => {
const script = document.createElement("script");
script.async = true;
script.src = `https://dapi.kakao.com/v2/maps/sdk.js?appkey=${appKey.value}&autoload=false`;
document.head.appendChild(script);
script.onload = () => {
kakao.maps.load(() => {
let container = document.getElementById("map");
let options = {
center: new kakao.maps.LatLng(37.2479109441, 127.0773045246),
level: 3,
};
let map = new window.kakao.maps.Map(container, options);
let positions = [];
// 마커 이미지를 생성합니다
// 마커 이미지의 이미지 크기 입니다
let imageSize = new kakao.maps.Size(40, 40);
let imageSrc_cafe = "cafe_icon.png";
let imageSrc_meal = "meal_icon.png";
let imageSrc_pub = "pub_icon.png";
const CreateMarkerImage = (type) => {
if (type === "술집" || type === "호프")
return new kakao.maps.MarkerImage(imageSrc_pub, imageSize);
else if (type === "카페" || type === "디저트")
return new kakao.maps.MarkerImage(imageSrc_cafe, imageSize);
else return new kakao.maps.MarkerImage(imageSrc_meal, imageSize);
};
for (let i = 0; i < FDatas.length; i++) {
const temp = FDatas[i];
positions.push({
title: temp.name,
latlng: new kakao.maps.LatLng(temp.latitude, temp.longitude),
image: CreateMarkerImage(temp.type),
});
}
for (let i = 0; i < positions.length; i++) {
// 마커를 생성합니다
let marker = new kakao.maps.Marker({
map: map, // 마커를 표시할 지도
position: positions[i].latlng, // 마커를 표시할 위치
image: positions[i].image, // 마커 이미지
});
marker.setMap(map);
const name = positions[i].title
// 마커를 클릭했을 때 마커 위에 표시할 인포윈도우를 생성합니다
let iwContent = `<div style="padding:5px;">${name}</div>`, // 인포윈도우에 표출될 내용으로 HTML 문자열이나 document element가 가능합니다
iwRemoveable = true; // removeable 속성을 ture 로 설정하면 인포윈도우를 닫을 수 있는 x버튼이 표시됩니다
// 인포윈도우를 생성합니다
let infowindow = new kakao.maps.InfoWindow({
content : iwContent,
removable : iwRemoveable
});
// 마커에 클릭이벤트를 등록합니다
kakao.maps.event.addListener(marker, 'click', function() {
// 마커 위에 인포윈도우를 표시합니다
infowindow.open(map, marker);
});
}
});
};
}, [FDatas]);
useEffect(()=> {
var result = [];
if(selectedOption === 'mealRadio') {
for(let i=0; i<props.datas.length; i++) {
const temp = props.datas[i];
if(temp.type !== '카페' && temp.type !== '디저트' && temp.type !== '술집' && temp.type !== '호프') {
result.push(temp);
}
}
} else if(selectedOption === 'cafeRadio') {
for(let i=0; i<props.datas.length; i++) {
const temp = props.datas[i];
if(temp.type === '카페' || temp.type === '디저트') {
result.push(temp);
}
}
} else if(selectedOption === 'pubRadio') {
for(let i=0; i<props.datas.length; i++) {
const temp = props.datas[i];
if(temp.type === '술집' || temp.type === '호프') {
result.push(temp);
}
}
}
setFDatas(result);
}, [selectedOption, props]);
const handleOptionChange = (e) => {
setselectedOption(e.target.value);
}
return (
<>
<hr className="my-2" />
<Row>
<Col>
<span className="font-weight-bold">MEALKHU MAP</span>
</Col>
<Col>
<Row>
<Col>
<FormGroup >
<Label className="float-right" >
<Input
id="init"
checked={selectedOption === 'mealRadio'}
value="mealRadio"
onChange={handleOptionChange}
type="radio" name="radio1" />식사
</Label>
</FormGroup>
</Col>
<Col>
<FormGroup >
<Label className="float-right">
<Input
value="cafeRadio"
checked={selectedOption === 'cafeRadio'}
onChange={handleOptionChange}
type="radio" name="radio1" />카페
</Label>
</FormGroup>
</Col>
<Col>
<FormGroup >
<Label className="float-right">
<Input
value = "pubRadio"
checked={selectedOption === 'pubRadio'}
onChange={handleOptionChange}
type="radio" name="radio1" />술집
</Label>
</FormGroup>
</Col>
</Row>
</Col>
</Row>
<div
id="map"
style={{
width: "100%",
height: "27rem",
}}
></div>
<p>※같은 건물에 위치한 식당의 경우, 좌표가 겹쳐서 보이지 않는 경우가 있습니다. 식당들의 자세한 정보는 menu에서 확인해주세요.</p>
</>
);
};
export default LandingMap;