Skip to content

Commit fb55d58

Browse files
feat : lasg commit
1 parent 5e00266 commit fb55d58

File tree

5 files changed

+351
-83
lines changed

5 files changed

+351
-83
lines changed

src/views/MapView.vue

+68-46
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,21 @@ import "vue-simple-range-slider/css";
1010
import { useRoute, useRouter } from 'vue-router';
1111
import BarChart from "@/Component/BarChart.vue";
1212
13+
const goChat = (house) => {
14+
console.log("채팅버튼 선택")
15+
console.log(house.aptNm)
16+
}
17+
18+
19+
1320
const map = ref(null); // Kakao Map 객체
1421
const polygons = ref([]); // 생성된 폴리곤 객체 배열
1522
const overlays = ref([]); // 생성된 오버레이 객체 배열
1623
const activePolygon = ref(null); // 현재 활성화된 폴리곤
1724
const level = ref(12); // 현재 줌 레벨
1825
const detailMode = ref(""); // 현재 디테일 모드 ("do" 또는 "sig")
1926
const centerData = ref({}); // 센터 데이터를 저장할 객체
27+
2028
const clickedArea = ref("");
2129
2230
// Center 데이터 로드
@@ -29,7 +37,6 @@ const loadCenterData = async () => {
2937
console.error("Error loading center.json:", error);
3038
}
3139
};
32-
3340
const sigData = ref({}); // 시/군/구 경계 데이터 저장
3441
3542
const loadSigData = async () => {
@@ -69,7 +76,7 @@ const onLoadKakaoMap = async (mapRef) => {
6976
Object.entries(centerData.value).forEach(([areaName, areaData]) => {
7077
if (areaData.districts) {
7178
Object.entries(areaData.districts).forEach(([districtName, coords]) => {
72-
console.log(`Adding overlay for district: ${districtName} at coords:`, coords);
79+
// console.log(`Adding overlay for district: ${districtName} at coords:`, coords);
7380
7481
const content = document.createElement("div");
7582
content.innerHTML = `
@@ -89,17 +96,15 @@ const onLoadKakaoMap = async (mapRef) => {
8996
9097
// 오버레이 클릭 이벤트 디버깅
9198
content.addEventListener("click", () => {
92-
console.log(`${districtName} clicked!`);
93-
const overlayPosition = new kakao.maps.LatLng(coords.lat, coords.lng);
99+
console.log(`${districtName} clicked!`);
94100
95-
// 맵 이동 및 줌 레벨 감소
96-
map.value.panTo(overlayPosition);
97-
map.value.setLevel(map.value.getLevel() - 2); // 줌 레벨 감소
101+
const overlayPosition = districtOverlay.getPosition(); // 오버레이의 위치 가져오기
98102
99-
// 기존 폴리곤 제거 후 새 폴리곤 생성
100-
removePolygon();
101-
displayDistrictPolygon(districtName, areaData.districts[districtName]);
102-
});
103+
map.value.setCenter(overlayPosition);
104+
105+
// 줌 레벨 설정
106+
map.value.setLevel(4); // 줌 레벨 설정
107+
});
103108
});
104109
}
105110
});
@@ -112,7 +117,6 @@ const loadPolygonData = async (path) => {
112117
try {
113118
const response = await axios.get(path);
114119
const geojson = response.data;
115-
116120
const areas = geojson.features.map((unit) => {
117121
const coordinates = unit.geometry.coordinates[0];
118122
const name = unit.properties.SIG_KOR_NM;
@@ -153,6 +157,7 @@ const displayPolygon = (area) => {
153157
});
154158
155159
overlays.value.push(overlay);
160+
console.log(`Created overlay for ${area.name} with content:`, area.name);
156161
157162
// 폴리곤 및 오버레이 이벤트 등록
158163
kakao.maps.event.addListener(polygon, "mouseover", () => {
@@ -168,24 +173,43 @@ const displayPolygon = (area) => {
168173
});
169174
170175
kakao.maps.event.addListener(polygon, "click", () => {
171-
console.log(`${area.name} clicked!`);
172-
clickedArea.value = area.name;
173-
console.log(`=================>${area.name}`)
174-
map.value.panTo(new kakao.maps.LatLng(center.lat, center.lng));
175-
map.value.setLevel(9);
176-
177-
if (activePolygon.value) {
178-
activePolygon.value.setOptions({ fillColor: "#fff" });
176+
console.log(`${area.name} clicked!`);
177+
178+
// 폴리곤 이름으로 오버레이 찾기
179+
const overlay = overlays.value.find((o) => {
180+
const overlayContent = o.getContent(); // HTML 노드 전체
181+
if (!overlayContent) {
182+
console.error(`Overlay content is undefined for area: ${area.name}`);
183+
return false;
179184
}
180185
181-
activePolygon.value = polygon;
182-
polygon.setOptions({ fillColor: "#ffcccb" });
186+
// HTML 콘텐츠에서 텍스트 추출
187+
const overlayText = overlayContent.innerText?.trim(); // innerText를 사용
188+
console.log(`Checking overlay: "${overlayText}" against "${area.name}"`);
189+
return overlayText === area.name; // 텍스트 비교
183190
});
191+
192+
if (overlay) {
193+
const overlayPosition = overlay.getPosition(); // 오버레이의 위치 가져오기
194+
console.log(`Setting center to overlay position: ${overlayPosition}`);
195+
map.value.setCenter(overlayPosition); // 지도 중심 이동
196+
map.value.setLevel(9); // 줌 레벨 설정
197+
} else {
198+
console.warn(`No overlay found for area: ${area.name}`);
199+
}
200+
201+
// 폴리곤 색상 변경
202+
if (activePolygon.value) {
203+
activePolygon.value.setOptions({ fillColor: "#fff" });
204+
}
205+
206+
activePolygon.value = polygon;
207+
polygon.setOptions({ fillColor: "#ffcccb" });
208+
});
209+
184210
};
185211
186212
const displayDistrictPolygon = (name, coords) => {
187-
console.log(`Creating polygon for district: ${name}`);
188-
console.log(`Coordinates received:`, coords); // coords 디버깅
189213
190214
// coords가 올바른 배열인지 확인
191215
if (!coords || !Array.isArray(coords) || coords.length === 0) {
@@ -207,7 +231,6 @@ const displayDistrictPolygon = (name, coords) => {
207231
polygon.setMap(map.value);
208232
polygons.value.push(polygon);
209233
210-
console.log(`Polygon created for district: ${name}`);
211234
};
212235
213236
// 폴리곤 및 오버레이 제거
@@ -225,7 +248,6 @@ const removeOverlays = () => {
225248
onMounted(async () => {
226249
await loadCenterData();
227250
});
228-
229251
// 필터 버튼
230252
const filters = ["가격", "면적", "사용승인일", "층수"];
231253
@@ -241,7 +263,7 @@ const fetchData = async (params) => {
241263
};
242264
243265
onMounted(async () => {
244-
266+
245267
console.log(route.params);
246268
console.log("Route query:", route.query);
247269
console.log("onMounted 시작")
@@ -297,11 +319,11 @@ const toggleSlider = (filter) => {
297319
298320
const applyFilter1 = async() => {
299321
300-
const query1 = { buildingUse: '아파트',
322+
const query1 = { buildingUse: '아파트',
301323
fromArea: state.면적[0],
302324
toArea:state.면적[1],
303325
keyword:state.검색어 }
304-
326+
305327
const queryString1 = new URLSearchParams(query1).toString();
306328
await fetchData(queryString1); // 데이터 로드
307329
};
@@ -344,7 +366,7 @@ const findDealsByAptseq = async (aptSeq) => {
344366
try {
345367
console.log(`Fetching deals for aptSeq: ${aptSeq}`);
346368
await houseInfoStore.fetchHouseDeals(aptSeq); // Pinia 스토어 호출
347-
369+
348370
} catch (error) {
349371
console.error("거래 정보를 가져오는데 실패했습니다:", error);
350372
}
@@ -361,12 +383,12 @@ class TrieNode {
361383
this.isEndOfWord = false;
362384
}
363385
}
364-
386+
365387
class Trie {
366388
constructor() {
367389
this.root = new TrieNode();
368390
}
369-
391+
370392
insert(word) {
371393
let node = this.root;
372394
for (const char of word) {
@@ -377,7 +399,7 @@ class TrieNode {
377399
}
378400
node.isEndOfWord = true;
379401
}
380-
402+
381403
search(prefix) {
382404
let node = this.root;
383405
for (const char of prefix) {
@@ -388,7 +410,7 @@ class TrieNode {
388410
}
389411
return this._collectWords(node, prefix);
390412
}
391-
413+
392414
_collectWords(node, prefix) {
393415
const results = [];
394416
if (node.isEndOfWord) {
@@ -400,7 +422,7 @@ class TrieNode {
400422
return results;
401423
}
402424
}
403-
425+
404426
const houseNames = ref([]);
405427
const searchQuery = ref("");
406428
const filteredNames = ref([]);
@@ -452,7 +474,7 @@ const updateSearchResults = () => {
452474
<!--검색 창-->
453475
<div class="relative w-[370px] ml-4 mr-2 ">
454476
<input
455-
v-model="searchQuery"
477+
v-model="searchQuery"
456478
type="text"
457479
@input="updateSearchResults"
458480
placeholder="찾고자하는 아파트 이름을 입력하세요"
@@ -566,7 +588,7 @@ const updateSearchResults = () => {
566588
</div>
567589
</div>
568590
</div>
569-
<!-- 필요한 필터 수 만큼 반복 -->
591+
<!-- 필요한 필터 수 만큼 반복 -->
570592
<button type="button" class="relative inline-block text-left ml-2 h-8 px-2 py-2 bg-white border border-gray-300 shadow-sm focus:ring-indigo-500">
571593
<svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" @click="initFilter">
572594
<path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/>
@@ -588,7 +610,7 @@ const updateSearchResults = () => {
588610
<div v-for="name in houseNames" :key="name.aptSeq">
589611
{{ name.aptNm }}
590612
</div>
591-
</div>
613+
</div>
592614
<div v-for="house in houseInfos" :key="house.id" >
593615
<CardView
594616
:jibun="house.jibun"
@@ -600,7 +622,7 @@ const updateSearchResults = () => {
600622
:legalName="house.dongName"
601623
:minPropertyPrice="house.minPrice"
602624
:maxPropertyPrice="house.maxPrice"
603-
@click="handleCardClick(house)"
625+
@click="handleCardClick(house)"
604626
/>
605627
<!-- 오른쪽 뷰 -->
606628
<div
@@ -625,7 +647,7 @@ const updateSearchResults = () => {
625647
<img src="@/assets/icons/heart.svg" width="20px">
626648
</button>
627649
<button class="pt-1">
628-
<img src="@/assets/icons/chat_icon.png" width="20px">
650+
<img src="@/assets/icons/chat_icon.png" width="20px" @click=goChat(house)>
629651
</button>
630652
</div>
631653
</div>
@@ -644,7 +666,7 @@ const updateSearchResults = () => {
644666
{{ house.gugunName }}
645667
{{ house.dongName }}
646668
{{ house.jibun }}
647-
</span>
669+
</span>
648670
</div>
649671
<div class="flex flex-row mb-2">
650672
<div class = "flex flex-row mr-2 ">
@@ -676,7 +698,7 @@ const updateSearchResults = () => {
676698
<span class="text-left text-lg font-PretendardSemiBold mt-4 border-b-4 px-2 py-1">
677699
거래정보
678700
</span>
679-
701+
680702
<table class="min-w-full border-collapse border border-gray-200 mt-4">
681703
<thead>
682704
<tr class="bg-blue-100 text-sm">
@@ -697,8 +719,8 @@ const updateSearchResults = () => {
697719
</tbody>
698720
</table>
699721
<div>
700-
701-
</div>
722+
723+
</div>
702724
</div>
703725
</div>
704726
</div>
@@ -714,7 +736,7 @@ const updateSearchResults = () => {
714736
style="width: 100%; height: 100%;"
715737
class="absolute z-0 ">
716738
<div v-for="house in houseInfos" :key="house.id">
717-
<KakaoMapMarker
739+
<KakaoMapMarker
718740
:lat="parseFloat(house.latitude)"
719741
:lng="parseFloat(house.longitude)">
720742
</KakaoMapMarker>
@@ -741,4 +763,4 @@ div {
741763
pointer-events: auto; /* 오버레이가 클릭 가능하도록 */
742764
z-index: 1000; /* 오버레이가 다른 요소 위에 표시되도록 */
743765
}
744-
</style>
766+
</style>

0 commit comments

Comments
 (0)