| | |
| | | <template> |
| | | <view class="pageBox"> |
| | | <!-- 顶部导航 --> |
| | | <headNav :idIndex="idIndex" text="中医地域医谱" /> |
| | | <headNav :idIndex="idIndex" text="地域图谱" style="z-index: 999" /> |
| | | <view |
| | | class="flex flex-center" |
| | | style="width: 100%; margin: 0.2rem 0 0.34rem; justify-content: flex-start" |
| | | style="width: 100%; margin: 20px 0 34px; justify-content: flex-start" |
| | | > |
| | | <advancedSearch |
| | | class="Search" |
| | | placehold="输入姓名/别名/朝代/传主职业搜索" |
| | | placehold="输入姓名/别名/时期/传主职业搜索" |
| | | @onSearch="onSearch" |
| | | :isAvancedTrue="false" |
| | | :keyword="keyword" |
| | | /> |
| | | <ul class="flex"> |
| | | <li style="" v-for="(item, index) in dynasty" :key="item.id"> |
| | | <!-- <ul class="flex"> |
| | | <li v-for="(item, index) in dynasty" :key="item.id"> |
| | | <view |
| | | @click="SchoolClick(item.id)" |
| | | class="flex flex-center font-family school" |
| | |
| | | " |
| | | > |
| | | <view |
| | | class="" |
| | | :style="{ background: item.color }" |
| | | style=" |
| | | margin-right: 0.07rem; |
| | |
| | | border-radius: 50%; |
| | | " |
| | | ></view> |
| | | <view class="" style="color: #2c2c2c; font-size: 0.12rem">{{ |
| | | <view style="color: #2c2c2c; font-size: 0.12rem">{{ |
| | | item.name |
| | | }}</view> |
| | | </view> |
| | | </li> |
| | | </ul> |
| | | </ul> --> |
| | | </view> |
| | | <!-- 搜索后的弹框 --> |
| | | <el-card |
| | |
| | | height: 3.2rem; |
| | | width: 3rem; |
| | | position: fixed; |
| | | z-index: 999999999999; |
| | | z-index: 99; |
| | | left: 1rem; |
| | | top: 2.2rem; |
| | | " |
| | |
| | | >关闭</el-button |
| | | > |
| | | </div> |
| | | <view class="" style="overflow: auto; height: 2.5rem"> |
| | | <ul class="information" v-for="(item, index) in SearchArr" :key="index"> |
| | | <li style="font-size: 0.18rem; font-weight: 700">{{ item.name }}</li> |
| | | <li>生卒年: {{ item.birthAndDeath }}</li> |
| | | <li>来源: {{ item.source }}</li> |
| | | <view style="overflow: auto; height: 2.5rem" v-loading="loading"> |
| | | <div |
| | | v-if="!loading && SearchArr.length == 0" |
| | | style=" |
| | | position: absolute; |
| | | top: 30%; |
| | | left: 0; |
| | | right: 0; |
| | | text-align: center; |
| | | font-size: 0.2rem; |
| | | color: #666; |
| | | " |
| | | > |
| | | 暂无搜索数据 |
| | | </div> |
| | | <ul |
| | | class="information" |
| | | v-for="(item, index) in SearchArr" |
| | | :key="index" |
| | | style="cursor: pointer" |
| | | @click="showCard(item)" |
| | | > |
| | | <li style="font-size: 0.18rem; font-weight: 700"> |
| | | {{ item.name ? item.name : "-" }} |
| | | </li> |
| | | <li> |
| | | 生卒年: |
| | | {{ item.birthAndDeath ? item.birthAndDeath : "-" }} |
| | | </li> |
| | | <li>来源: {{ item.source ? item.source : "-" }}</li> |
| | | <li>籍贯: {{ item.nativPlace ? item.nativPlace : "-" }}</li> |
| | | <li |
| | | v-if="SearchArr.length - 1 !== index" |
| | | style="margin: 0.1rem 0; border-bottom: 1px solid #d8d8d8" |
| | |
| | | </view> |
| | | </el-card> |
| | | <!-- echarts里面的数据点击后弹框 --> |
| | | <el-card |
| | | class="box-card echartsTrue" |
| | | v-show="isEchTrue" |
| | | style=" |
| | | overflow: inherit; |
| | | width: 3rem; |
| | | position: fixed; |
| | | z-index: 999999999999; |
| | | " |
| | | :style="{ top: isTop, left: isLeft }" |
| | | > |
| | | <div slot="header" class="clearfix"> |
| | | <span>{{ information[0].content }}</span> |
| | | |
| | | <div class="mapBox" id="mapBox" v-loading="mapLoading"> |
| | | <div id="map"></div> |
| | | <div |
| | | class="markerDataListBox" |
| | | v-if="isEchTrue" |
| | | style="overflow: inherit; width: 3rem; position: absolute; z-index: 999" |
| | | :style="{ top: isTop, left: isLeft }" |
| | | > |
| | | <div class="markerDataList"> |
| | | <div class="markerDataContentBox"> |
| | | <div v-if="currentMark.length == 1"> |
| | | <ul class="information"> |
| | | <li> |
| | | 姓名: |
| | | {{ currentMark[0].name ? currentMark[0].name : "-" }} |
| | | </li> |
| | | <li> |
| | | 别名: |
| | | {{ currentMark[0].nikeName ? currentMark[0].nikeName : "-" }} |
| | | </li> |
| | | <li> |
| | | 籍贯: |
| | | {{ |
| | | currentMark[0].nativePlace |
| | | ? currentMark[0].nativePlace |
| | | : "-" |
| | | }} |
| | | </li> |
| | | <li> |
| | | 医学分科: |
| | | {{ currentMark[0].barnch ? currentMark[0].barnch : "-" }} |
| | | </li> |
| | | <li |
| | | class="medicalLi" |
| | | :title="currentMark[0].medical ? currentMark[0].medical : '-'" |
| | | > |
| | | 小传: |
| | | {{ currentMark[0].medical ? currentMark[0].medical : "-" }} |
| | | </li> |
| | | </ul> |
| | | <el-button |
| | | class="flex" |
| | | @click="viewMoreClick(currentMark[0])" |
| | | style=" |
| | | width: 100%; |
| | | padding: 3px 0; |
| | | font-size: 0.12rem; |
| | | color: #597aa5; |
| | | " |
| | | type="text" |
| | | >查看更多>></el-button |
| | | > |
| | | </div> |
| | | <el-collapse v-else> |
| | | <el-collapse-item |
| | | v-for="(item, index) in currentMark" |
| | | :name="index" |
| | | :key="index" |
| | | > |
| | | <template slot="title"> |
| | | <div class="titleImg"> |
| | | <i class="el-icon-user"></i> |
| | | </div> |
| | | <span>{{ item.name }}</span> |
| | | </template> |
| | | <ul class="information"> |
| | | <li> |
| | | 姓名: |
| | | {{ item.name ? item.name : "-" }} |
| | | </li> |
| | | <li>别名: {{ item.nikeName ? item.nikeName : "-" }}</li> |
| | | <li>籍贯: {{ item.nativePlace ? item.nativePlace : "-" }}</li> |
| | | <li>医学分科: {{ item.barnch ? item.barnch : "-" }}</li> |
| | | <li |
| | | class="medicalLi" |
| | | :title="item.medical ? item.medical : '-'" |
| | | > |
| | | 小传: {{ item.medical ? item.medical : "-" }} |
| | | </li> |
| | | </ul> |
| | | <el-button |
| | | class="flex" |
| | | @click="viewMoreClick(item)" |
| | | style=" |
| | | width: 100%; |
| | | padding: 3px 0; |
| | | font-size: 0.12rem; |
| | | color: #597aa5; |
| | | " |
| | | type="text" |
| | | >查看更多>></el-button |
| | | > |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- <el-card class="box-card echartsTrue" v-show="isEchTrue"> |
| | | <div slot="header" class="clearfix"> |
| | | <span v-if="currentMark">{{ |
| | | currentMark.name ? currentMark.name : "-" |
| | | }}</span> |
| | | <el-button |
| | | style=" |
| | | float: right; |
| | | padding: 3px 0; |
| | | font-size: 0.12rem; |
| | | color: #597aa5; |
| | | " |
| | | @click="isEchTrue = false" |
| | | type="text" |
| | | >关闭</el-button |
| | | > |
| | | </div> |
| | | <ul class="information" v-if="currentMark"> |
| | | <li> |
| | | 姓名: |
| | | {{ currentMark.name ? currentMark.name : "-" }} |
| | | </li> |
| | | <li>别名: {{ currentMark.nikeName ? currentMark.nikeName : "-" }}</li> |
| | | <li> |
| | | 籍贯: {{ currentMark.nativePlace ? currentMark.nativePlace : "-" }} |
| | | </li> |
| | | <li>医学分科: {{ currentMark.barnch ? currentMark.barnch : "-" }}</li> |
| | | <li |
| | | class="medicalLi" |
| | | :title="currentMark.medical ? currentMark.medical : '-'" |
| | | > |
| | | 小传: {{ currentMark.medical ? currentMark.medical : "-" }} |
| | | </li> |
| | | </ul> |
| | | <el-button |
| | | class="flex" |
| | | @click="viewMoreClick" |
| | | style=" |
| | | float: right; |
| | | width: 100%; |
| | | padding: 3px 0; |
| | | font-size: 0.12rem; |
| | | color: #597aa5; |
| | | " |
| | | @click="isEchTrue = false" |
| | | type="text" |
| | | >关闭</el-button |
| | | >查看更多>></el-button |
| | | > |
| | | </div> |
| | | <ul class="information"> |
| | | <li v-for="(item, index) in information" :key="index"> |
| | | {{ item.label }}: {{ item.content }} |
| | | </li> |
| | | </ul> |
| | | <el-button |
| | | class="flex" |
| | | @click="viewMoreClick" |
| | | style="width: 100%; padding: 3px 0; font-size: 0.12rem; color: #597aa5" |
| | | type="text" |
| | | >查看更多>></el-button |
| | | > |
| | | </el-card> |
| | | <!-- echarts地图 --> |
| | | <!-- <view id="main" style="width: 100vw; position: relative"></view> --> |
| | | <div id="map"></div> |
| | | </el-card> --> |
| | | </div> |
| | | |
| | | <!-- 朝代 --> |
| | | <view |
| | | class="flex flex-center" |
| | | style="width: 100%; position: fixed; bottom: 0.33rem; left: 0" |
| | | style=" |
| | | width: 100%; |
| | | position: fixed; |
| | | bottom: 0.33rem; |
| | | left: 0; |
| | | right: 0; |
| | | z-index: 99; |
| | | overflow: auto; |
| | | " |
| | | > |
| | | <ul class="flex"> |
| | | <li |
| | |
| | | class="flex flex-center" |
| | | style="height: 0.35rem; background-color: #fff; color: #244a7b" |
| | | > |
| | | {{ item.coord }} |
| | | {{ item.start }} |
| | | </view> |
| | | <view |
| | | class="flex flex-center font-family" |
| | | style=" |
| | | padding: 0.05rem 0.19rem; |
| | | min-width: 0.6rem; |
| | | height: 0.3rem; |
| | | line-height: 0.3rem; |
| | | text-align: center; |
| | | color: #fff; |
| | | font-size: 0.14rem; |
| | | margin-top: 0.03rem; |
| | |
| | | background: dynasty1Color == item.id ? '#244A7B' : '#597AA5', |
| | | }" |
| | | > |
| | | {{ item.name }} |
| | | {{ item.dynastyChs }} |
| | | </view> |
| | | </li> |
| | | </ul> |
| | |
| | | <!-- <script src="https://api.map.baidu.com/api?v=3.0&ak=5USVDAhhS4ssz44HLq3gNPZai7naXf4Q&callback=initializeMap"></script> --> |
| | | <!-- 5USVDAhhS4ssz44HLq3gNPZai7naXf4Q --> |
| | | <script> |
| | | import { loadBMap } from "@/static/map.js"; |
| | | import L from "leaflet"; |
| | | import * as echarts from "echarts"; |
| | | import "echarts/extension/bmap/bmap"; |
| | | import "leaflet.chinatmsproviders"; |
| | | import "echarts/extension/bmap/bmap"; |
| | | import { |
| | | getRetrieval, |
| | | getDynasty, |
| | | getPreCount, |
| | | getDynastyData, |
| | | } from "@/api/index.js"; |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | loading: true, |
| | | mapLoading: true, |
| | | // echarts元素点击时出来的弹窗和坐标 |
| | | keyword: "", |
| | | isEchTrue: false, |
| | | isLeft: 0, |
| | | isTop: 0, |
| | |
| | | }, |
| | | ], |
| | | // 下面的朝代1 |
| | | dynasty1Color: 1, |
| | | dynasty1Color: "", |
| | | dynasty1: [ |
| | | { |
| | | name: "夏朝", |
| | |
| | | // 朝代 |
| | | dynasty: [ |
| | | { |
| | | name: "夏朝", |
| | | name: "夏", |
| | | color: "#90BBD8", |
| | | id: 1, |
| | | }, |
| | | { |
| | | name: "商朝", |
| | | name: "商", |
| | | color: "#EDD28B", |
| | | id: 2, |
| | | }, |
| | |
| | | id: 3, |
| | | }, |
| | | { |
| | | name: "秦朝", |
| | | name: "秦", |
| | | color: "#9CC27A", |
| | | id: 4, |
| | | }, |
| | | { |
| | | name: "汉朝", |
| | | name: "汉", |
| | | color: "#5B6CB9", |
| | | id: 5, |
| | | }, |
| | | { |
| | | name: "隋朝", |
| | | name: "隋", |
| | | color: "#8860A8", |
| | | id: 6, |
| | | }, |
| | | { |
| | | name: "唐朝", |
| | | name: "唐", |
| | | color: "#DE8E66", |
| | | id: 7, |
| | | }, |
| | | { |
| | | name: "明", |
| | | color: "#DE8E66", |
| | | id: 8, |
| | | }, |
| | | ], |
| | | // 搜索后是否显示弹框 |
| | | isSearch: false, |
| | | currentMark: null, |
| | | SearchArr: [ |
| | | { |
| | | id: 1, |
| | |
| | | source: "国图规范档,CBDB,上图古籍数据库 籍贯:湖北", |
| | | }, |
| | | ], |
| | | zoomLevel: 5, |
| | | oldMarkList: [], |
| | | aggregatedData: [], |
| | | openData: null, |
| | | }; |
| | | }, |
| | | onLoad(options) { |
| | | this.idIndex = options.id; |
| | | console.log("optionsoptionsoptions", options.id); |
| | | }, |
| | | mounted() { |
| | | // this.$nextTick(() => { |
| | | // loadBMap("1NJdwrI1CfT6lrykVhDkmWgsO6O2bjQK").then(() => { |
| | | // this.innt(); |
| | | // }); |
| | | // }) |
| | | this.initMap(); |
| | | this.getDynastyList(); |
| | | this.getDataList(); |
| | | this.getHaveDataDynasty(); |
| | | }, |
| | | methods: { |
| | | getHaveDataDynasty() { |
| | | getDynastyData().then((res) => { |
| | | console.log(res, "getHaveDataDynasty"); |
| | | }); |
| | | }, |
| | | getDynastyList() { |
| | | getDynasty().then((res) => { |
| | | this.dynasty1 = res.list; |
| | | console.log("dynasty1", res.list); |
| | | }); |
| | | }, |
| | | showCard(info) { |
| | | const item = this.markerList.find((f) => f.id == info.id); |
| | | this.openData = item; |
| | | var latlng = L.latLng(item.yCoord, item.xCoord); |
| | | this.map.setView(latlng, 12); |
| | | }, |
| | | getDataList() { |
| | | this.SearchArr = []; |
| | | this.loading = true; |
| | | this.mapLoading = true; |
| | | // 这里改成了分页的接口,需要调用多次取出所有数据 |
| | | let times = 0; |
| | | getPreCount({ |
| | | keyword: this.keyword, |
| | | dynasty: this.dynasty1Color, |
| | | }).then(async (res) => { |
| | | const totalCount = res.object; |
| | | if (totalCount % 200 == 0) { |
| | | times = totalCount / 200 - 1; |
| | | } else { |
| | | times = Math.floor(totalCount / 200); |
| | | } |
| | | console.log(times, "times"); |
| | | if (times == 0 || times < 0) times = 1; |
| | | let markerList = []; |
| | | for (let i = 1; i <= times; i++) { |
| | | const curData = await this.getDataPageInfo(i); |
| | | if (curData) { |
| | | markerList = [...markerList, ...curData]; |
| | | } |
| | | if (i == 1) { |
| | | this.mapLoading = false; |
| | | this.markerList = markerList; |
| | | this.initMap(); |
| | | } else { |
| | | this.handleMapIcon(this.markerList); |
| | | } |
| | | |
| | | if (i == times) { |
| | | this.SearchArr = markerList.map((item) => ({ |
| | | birthAndDeath: item?.BIRTH_YEAR[0]?.content1 |
| | | ? item?.BIRTH_YEAR[0]?.content1 + |
| | | "-" + |
| | | item?.DEATH_YEAR[0]?.content1 |
| | | : "-", |
| | | name: item?.NAME[0]?.content1, |
| | | source: "-", |
| | | nativPlace: item?.NATIVE_PLACE[0].content1, |
| | | id: item.id, |
| | | })); |
| | | this.loading = false; |
| | | this.markerList = markerList; |
| | | this.handleMapIcon(this.markerList); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | async getDataPageInfo(count) { |
| | | const res = await getRetrieval({ |
| | | keyword: this.keyword, |
| | | dynasty: this.dynasty1Color, |
| | | page: count, |
| | | pageSize: 200, |
| | | }); |
| | | if (res.object) { |
| | | let markerList = []; |
| | | const listData = res.object.personList; |
| | | for (let i = 0; i < listData.length; i++) { |
| | | const item = listData[i]; |
| | | if (item.NATIVE_PLACE?.length > 0) { |
| | | item.NATIVE_PLACE.forEach((citem) => { |
| | | if (citem.xCoord && citem.yCoord) { |
| | | const currentDynasty = this.dynasty1.find( |
| | | (f) => f.id == item.PERIOD[0].content1 |
| | | ); |
| | | if (currentDynasty) { |
| | | item.dynastyInfo = currentDynasty; |
| | | } |
| | | markerList.push({ ...citem, ...item }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | return markerList; |
| | | } else { |
| | | return []; |
| | | } |
| | | }, |
| | | onMapMoveEnd() { |
| | | console.log("地图拖动了"); |
| | | if (this.openData) { |
| | | this.handleMapIcon(this.markerList); |
| | | } else { |
| | | this.isEchTrue = false; |
| | | } |
| | | }, |
| | | //初始化地图 |
| | | initMap() { |
| | | this.isEchTrue = false; |
| | | if (this.map) { |
| | | this.map.remove(); |
| | | } |
| | | var map = L.map("map", { |
| | | attributionControl: false, |
| | | preferCanvas: true, |
| | | withPopup: L.latLng(34.261, 108.96), |
| | | }).setView([39.91667, 116.41667], 4); |
| | | |
| | | attributionControl: false, |
| | | }).setView([34.3227, 108.5525], this.zoomLevel); |
| | | map.on("moveend", this.onMapMoveEnd); |
| | | map.on("zoomend", () => { |
| | | var zoomLevel = map.getZoom(); // 获取当前地图的缩放级别 |
| | | console.log("当前地图缩放级别为:", zoomLevel); |
| | | this.zoomLevel = zoomLevel; |
| | | this.isEchTrue = false; |
| | | this.handleMapIcon(this.markerList); |
| | | }); |
| | | L.tileLayer |
| | | .chinaProvider("TianDiTu.Normal.Map", { |
| | | key: "76bc34ead7e30e663a4eded8aeaf5860", |
| | | // maxZoom: 18, |
| | | // minZoom: 5, |
| | | maxZoom: 18, |
| | | minZoom: 3, |
| | | }) |
| | | .addTo(map); |
| | | L.tileLayer |
| | | .chinaProvider("TianDiTu.Normal.Annotion", { |
| | | key: "76bc34ead7e30e663a4eded8aeaf5860", |
| | | maxZoom: 18, |
| | | minZoom: 3, |
| | | }) |
| | | .addTo(map); |
| | | this.map = map; |
| | | this.handleMapIcon(this.markerList); |
| | | }, |
| | | |
| | | let DefaultIcon1 = L.icon({ |
| | | iconUrl: this.icoName, |
| | | iconSize: [24, 41], // 图标的大小 【值1,值2】 为具体你自定义图标的尺寸,比如我图标尺寸是32×52,表示该图标:宽度32像素,高度:52像素,那么值1:就是32,值2:就是52 |
| | | iconAnchor: [24, 41], // 图标将对应标记点的位置 这个是重点, 【值1,值2】,值1:为图标坐标第一个值(即32)的一半,值2:为图标坐标第二个值(即52) |
| | | popupAnchor: [1, -24], // 该点是相对于iconAnchor弹出信息的位置 这个是我手动调出来的,文档默认原始值是[-1,-76],我是去一半值,取一半值调出来的 |
| | | }); |
| | | const marker1 = L.marker([34.261, 108.96], { |
| | | icon: DefaultIcon1, |
| | | }).addTo(map); |
| | | L.marker([39.90609, 116.38543], { |
| | | icon: DefaultIcon1, |
| | | }) |
| | | .addTo(map) |
| | | .bindPopup(this.popContent); //北京 |
| | | L.marker([29.55546, 106.5448], { |
| | | icon: DefaultIcon1, |
| | | }).addTo(map); // 重庆 |
| | | L.marker([30.56781, 114.30222], { |
| | | icon: DefaultIcon1, |
| | | }).addTo(map); //湖北 |
| | | L.marker([18.23522, 109.51085], { |
| | | icon: DefaultIcon1, |
| | | }).addTo(map); //海南 |
| | | handleMapIcon(data) { |
| | | if (this.oldMarkList.length) { |
| | | for (let j = 0; j < this.oldMarkList.length; j++) { |
| | | const oldMark = this.oldMarkList[j]; |
| | | oldMark.remove(); |
| | | } |
| | | this.oldMarkList = []; |
| | | } |
| | | // 按层级处理数据合并和icon的渲染 |
| | | // 获取天地图比例尺(地图1cm:实际cm) |
| | | const scale = { |
| | | 1: 295829355.45456564, |
| | | 2: 147914677.72728282, |
| | | 3: 73957338.863641411, |
| | | 4: 36978669.431820706, |
| | | 5: 18489334.715910353, |
| | | 6: 9244667.3579551764, |
| | | 7: 4622333.6789775882, |
| | | 8: 2311166.8394887941, |
| | | 9: 1155583.419744397, |
| | | 10: 577791.70987219852, |
| | | 11: 288895.85493609926, |
| | | 12: 144447.92746804963, |
| | | 13: 72223.963734024815, |
| | | 14: 36111.981867012408, |
| | | 15: 18055.990933506204, |
| | | 16: 9027.9954667531019, |
| | | 17: 4513.997733376551, |
| | | 18: 2256.9988666882755, |
| | | 19: 1128.4994333441377, |
| | | 20: 564.24971667206887, |
| | | }; |
| | | // 根据比例尺计算当前地图1厘米的经纬度差值 |
| | | const cmData = scale[this.zoomLevel] / 100; // 将厘米转换为米 |
| | | const longitudeToM = 92064.1; // 1经度对应米 |
| | | const latitudeToM = 111195.1; // 1纬度对应米 |
| | | const longitudeRange = cmData / longitudeToM; // 地图1cm的经度差 |
| | | const latitudeRange = cmData / latitudeToM; // 地图1cm的纬度差 |
| | | console.log("longitudeRange", longitudeRange); |
| | | console.log("latitudeRange", latitudeRange); |
| | | // 根据经纬度差值将地图一厘米内所有点合并并记录数量 |
| | | const aggregatedData = []; |
| | | for (let i = 0; i < data.length; i++) { |
| | | const item = data[i]; |
| | | // 判断当前点是否存在在1cm内的相关数据 |
| | | const mateData = aggregatedData.find( |
| | | (aItem) => |
| | | Math.abs(aItem.mainX - item.xCoord) < longitudeRange && |
| | | Math.abs(aItem.mainY - item.yCoord) < latitudeRange |
| | | ); |
| | | if (!mateData) { |
| | | // 无匹配数据时,将当前点坐标设为中心点坐标,虹吸合并周围1cm内的点 |
| | | const obj = { |
| | | mainX: item.xCoord, |
| | | mainY: item.yCoord, |
| | | contentX: "", |
| | | contentY: "", |
| | | xList: [], |
| | | yList: [], |
| | | data: [], |
| | | }; |
| | | obj.xList.push(item.xCoord); |
| | | obj.yList.push(item.yCoord); |
| | | obj.data.push(item); |
| | | aggregatedData.push(obj); |
| | | } else { |
| | | // 有匹配数据时,将当前点进行合并 |
| | | mateData.xList.push(item.xCoord); |
| | | mateData.yList.push(item.yCoord); |
| | | mateData.data.push(item); |
| | | } |
| | | } |
| | | // 根据聚合经度和纬度列表的最大最小值,取中心点坐标 |
| | | for (let j = 0; j < aggregatedData.length; j++) { |
| | | const aggregatedItem = aggregatedData[j]; |
| | | const maxX = Math.max(...aggregatedItem.xList); |
| | | const minX = Math.min(...aggregatedItem.xList); |
| | | const maxY = Math.max(...aggregatedItem.yList); |
| | | const minY = Math.min(...aggregatedItem.yList); |
| | | aggregatedItem.contentX = (maxX - minX) / 2 + minX; |
| | | aggregatedItem.contentY = (maxY - minY) / 2 + minY; |
| | | |
| | | marker1.on("click", (e) => { |
| | | this.isEchTrue = true; |
| | | console.log(document.querySelector(".echartsTrue").offsetWidth); |
| | | console.log(document.querySelector(".echartsTrue").offsetHeight); |
| | | this.$nextTick(() => { |
| | | this.isTop = |
| | | e.containerPoint.y - |
| | | document.querySelector(".echartsTrue").offsetHeight / 2 + |
| | | "px"; |
| | | this.isLeft = |
| | | e.containerPoint.x - |
| | | document.querySelector(".echartsTrue").offsetWidth / 2 + |
| | | "px"; |
| | | // 添加标记 |
| | | let icon = L.divIcon({ |
| | | html: `<div class='ripple' style='box-shadow: 0 0 20px ${ |
| | | aggregatedItem.data.length > 30 ? 30 : aggregatedItem.data.length |
| | | }px #cc2edf78;'>${ |
| | | aggregatedItem.data.length < 100 |
| | | ? aggregatedItem.data.length |
| | | : "99+" |
| | | }</div>`, |
| | | iconSize: [30, 30], |
| | | className: "map-circle", |
| | | }); |
| | | }); |
| | | const temp_mark = L.marker( |
| | | [aggregatedItem.contentY, aggregatedItem.contentX], |
| | | { |
| | | icon: icon, |
| | | } |
| | | ); |
| | | this.oldMarkList.push(temp_mark); |
| | | temp_mark.addTo(this.map); |
| | | temp_mark.on("click", (e) => { |
| | | setTimeout(() => { |
| | | this.isEchTrue = true; |
| | | this.currentMark = aggregatedItem.data.map((item) => { |
| | | return { |
| | | name: item?.NAME[0]?.content1, |
| | | nikeName: item?.ALIAS[0]?.content2, |
| | | nativePlace: item?.content1, |
| | | barnch: item?.MEDICAL_BRANCH[0]?.content1, |
| | | medical: item?.BIOGRAPHY, |
| | | id: item.id, |
| | | }; |
| | | }); |
| | | this.isTop = e.containerPoint.y - 435 + "px"; |
| | | this.isLeft = e.containerPoint.x - 180 + "px"; |
| | | }, 300); |
| | | }); |
| | | } |
| | | console.log("aggregatedData", aggregatedData); |
| | | this.aggregatedData = aggregatedData; |
| | | if (this.openData) { |
| | | setTimeout(() => { |
| | | if (this.openData) { |
| | | let aggregated = null; |
| | | for (let i = 0; i < this.aggregatedData.length; i++) { |
| | | const aggregatedItem = this.aggregatedData[i]; |
| | | const d = aggregatedItem.data.find( |
| | | (f) => f.id == this.openData.id |
| | | ); |
| | | if (d) { |
| | | aggregated = aggregatedItem; |
| | | } |
| | | } |
| | | this.currentMark = aggregated.data.map((item) => { |
| | | return { |
| | | name: item?.NAME[0]?.content1, |
| | | nikeName: item?.ALIAS[0]?.content2, |
| | | nativePlace: item?.content1, |
| | | barnch: item?.MEDICAL_BRANCH[0]?.content1, |
| | | medical: item?.BIOGRAPHY, |
| | | id: item.id, |
| | | }; |
| | | }); |
| | | this.isEchTrue = true; |
| | | this.$nextTick(() => { |
| | | this.isTop = |
| | | document.getElementById("mapBox").offsetHeight / 2 - 435 + "px"; |
| | | this.isLeft = |
| | | document.getElementById("mapBox").offsetWidth / 2 - 180 + "px"; |
| | | }); |
| | | } |
| | | |
| | | this.openData = null; |
| | | }, 300); |
| | | } |
| | | }, |
| | | |
| | | // 点击下面的朝代按钮 |
| | | dynastyBottomClick(id) { |
| | | console.log(id); |
| | | this.dynasty1Color = id; |
| | | this.getDataList(); |
| | | }, |
| | | onSearch(val) { |
| | | console.log(val); |
| | | // |
| | | this.isSearch = true; |
| | | this.keyword = val.text; |
| | | this.map.invalidateSize(); |
| | | |
| | | this.getDataList(); |
| | | }, |
| | | // 点击上面的朝代按钮 |
| | | SchoolClick(id) { |
| | | console.log(id); |
| | | }, |
| | | SchoolClick(id) {}, |
| | | // 查看更多>> |
| | | viewMoreClick() { |
| | | viewMoreClick(data) { |
| | | uni.navigateTo({ |
| | | url: "/pages/character/detail", |
| | | url: "/pages/character/detail?id=" + data.id, |
| | | }); |
| | | }, |
| | | }, |
| | |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .echartsTrue::before { |
| | | .markerDataListBox { |
| | | width: 360px !important; |
| | | height: 400px; |
| | | } |
| | | |
| | | .markerDataListBox::before { |
| | | content: ""; |
| | | width: 0; |
| | | height: 0; |
| | | position: absolute; |
| | | bottom: -0.18rem; |
| | | left: 1.2rem; |
| | | bottom: -18px; |
| | | left: 160px; |
| | | /* background-color: red; */ |
| | | border-left: 0.2rem solid transparent; |
| | | border-left: 20px solid transparent; |
| | | /* 左边透明 */ |
| | | border-right: 0.2rem solid transparent; |
| | | border-right: 20px solid transparent; |
| | | /* 右边透明 */ |
| | | border-top: 0.2rem solid #fff; |
| | | border-top: 20px solid #fff; |
| | | /* 顶部红色 */ |
| | | z-index: 999; |
| | | } |
| | | |
| | | .markerDataList { |
| | | width: 100%; |
| | | height: 100%; |
| | | background: #fff; |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | box-shadow: 0 0 10px 0 #000; |
| | | } |
| | | |
| | | .markerDataList ::v-deep .el-collapse-item { |
| | | border-left: 1px solid #ebeef5; |
| | | border-right: 1px solid #ebeef5; |
| | | } |
| | | |
| | | ::v-deep .el-collapse-item__header.is-active { |
| | | border-bottom-color: #ebeef5; |
| | | } |
| | | |
| | | ::v-deep .el-collapse-item__header { |
| | | padding-left: 10px; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .markerDataContentBox { |
| | | width: 100%; |
| | | height: 100%; |
| | | overflow: auto !important; |
| | | padding: 6px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .titleImg { |
| | | display: inline-block; |
| | | width: 24px; |
| | | height: 24px; |
| | | border-radius: 50%; |
| | | background-color: #4c48fb; |
| | | color: #fff; |
| | | margin-right: 10px; |
| | | text-align: center; |
| | | line-height: 24px; |
| | | } |
| | | |
| | | ::v-deep .el-card__header { |
| | |
| | | padding: 0.08rem 0.13rem; |
| | | font-size: 0.14rem; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | ::v-deep .el-collapse-item__content { |
| | | padding-bottom: 10px; |
| | | } |
| | | |
| | | .markerDataContentBox .information { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .information li { |
| | |
| | | margin-left: 0.19rem; |
| | | } |
| | | |
| | | .mapBox { |
| | | height: 100%; |
| | | width: 100%; |
| | | margin: 0 auto; |
| | | position: relative; |
| | | } |
| | | #map { |
| | | height: 600px; |
| | | height: 100%; |
| | | width: 100%; |
| | | margin: 0 auto; |
| | | font-size: 14px !important; |
| | | z-index: 10 !important; |
| | | } |
| | | |
| | | ::v-deep .ripple { |
| | | width: 100%; |
| | | height: 100%; |
| | | border-radius: 50%; |
| | | background: #4c48fb; |
| | | color: #fff; |
| | | text-align: center; |
| | | line-height: 30px; |
| | | } |
| | | |
| | | /* @keyframes ripple-animation { |
| | | to { |
| | | transform: translate(-50%, -50%) scale(0); |
| | | opacity: 0; |
| | | } |
| | | } */ |
| | | |
| | | ::v-deep .cleanupBtn { |
| | | right: 60px !important; |
| | | } |
| | | |
| | | ::v-deep .widget_input { |
| | | min-width: 240px !important; |
| | | } |
| | | |
| | | .medicalLi { |
| | | height: 50px; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | display: -webkit-box; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 2; |
| | | } |
| | | </style> |