AiIndustriaLandDetail.vue 81 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879
  1. <template>
  2. <div class="industria-land-detail">
  3. <div class="map-content">
  4. <div class="content">
  5. <div :id="id" class="map">
  6. <div
  7. class="radar-scan-an"
  8. v-show="radarShow"
  9. :style="`width: ${radarScanStyle.width}; heigth: ${radarScanStyle.height}; top: ${radarScanStyle.top};left: ${radarScanStyle.left};`"
  10. >
  11. <!-- <radar-scan-animation /> -->
  12. </div>
  13. </div>
  14. <div class="right-tool">
  15. <div class="layer-container c">
  16. <div
  17. class="layer-panel"
  18. @click="toggleIdentity"
  19. :class="{ checked: showIndentify }"
  20. >
  21. <img
  22. src="~@/assets/image/icon-i-checked.png"
  23. class="img"
  24. v-if="showIndentify"
  25. />
  26. <img src="~@/assets/image/icon-i-normal.png" class="img" v-else />
  27. <span :class="{ c: showIndentify }">属性识别</span>
  28. </div>
  29. </div>
  30. <div class="layer-container">
  31. <div
  32. class="layer-panel"
  33. :class="{ checked: showLayerControl }"
  34. @click="toggleLayerControl"
  35. >
  36. <img
  37. src="~@/assets/image/icon-layer-checked.png"
  38. class="img"
  39. v-if="showLayerControl"
  40. />
  41. <img src="~@/assets/image/icon-layer.png" class="img" v-else />
  42. <span :class="{ c: showLayerControl }">图层控制</span>
  43. </div>
  44. <div class="layer-content-border" v-if="showLayerControl">
  45. <vue-perfect-scrollbar class="layer-content" :settings="settings">
  46. <div
  47. class="item"
  48. v-for="(item, index) in layers"
  49. :key="index + '-13'"
  50. >
  51. <div class="name">
  52. {{ item.name }}
  53. </div>
  54. <div
  55. class="item"
  56. v-for="(_item, _index) in item.layers"
  57. :key="_index + '-14'"
  58. style="margin: 5px 0"
  59. >
  60. <Checkbox
  61. v-model="_item.checked"
  62. class="checkbox"
  63. @click.native.stop=""
  64. @on-change="switchMapLayer(_item)"
  65. >{{ _item.name }}
  66. </Checkbox>
  67. </div>
  68. </div>
  69. </vue-perfect-scrollbar>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="legend-panel" v-if="showLegend">
  74. <div class="name-panel">
  75. <div class="name">图例</div>
  76. <img
  77. class="img"
  78. src="~@/assets/image/icon-legend-close.png"
  79. @click="showLegend = false"
  80. />
  81. </div>
  82. <div class="layer-legend">
  83. <div v-for="(item, index) in legend" :key="index" class="item">
  84. <div class="label" :class="{ c: item.children }">
  85. <i
  86. :style="{ background: item.fill, borderColor: item.border }"
  87. v-if="item.children == undefined"
  88. ></i
  89. >{{ item.name }}
  90. </div>
  91. <div
  92. v-for="(citem, index) in item.children"
  93. :key="index"
  94. class="zl"
  95. >
  96. <i
  97. :style="{
  98. background: citem.fill == 'transparent' ? '' : citem.fill,
  99. borderColor: citem.border,
  100. }"
  101. ></i
  102. >{{ citem.name }}&nbsp;&nbsp;&nbsp;
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. <div v-if="!showQuery" class="topdiv">
  108. <div class="m-textarea-panel">
  109. <textarea
  110. v-model="inputText"
  111. type="text"
  112. autocapitalize="off"
  113. autocomplete="off"
  114. spellcheck="false"
  115. autocorrect="off"
  116. placeholder="您可以试着这样问我,如“帮我在萧山区推荐一宗60亩左右的工业用地”"
  117. autofocus=""
  118. >
  119. </textarea>
  120. <AIBtn @click.native="hotQuestionReset()" />
  121. </div>
  122. </div>
  123. <vue-perfect-scrollbar
  124. :settings="settings"
  125. class="left-panel"
  126. v-if="showQuery"
  127. >
  128. <!-- <div class="back-icon" @click="back"></div> -->
  129. <div v-for="(item, index) in hzData" :key="index">
  130. <div class="title" @click="resetAnswer(index)">
  131. {{ item.name }}
  132. </div>
  133. <div class="jsz" v-if="item.loading">
  134. <Spin />
  135. {{ hintText }}
  136. </div>
  137. <!-- <div class="tab-panel" v-if="false">
  138. <div
  139. class="item"
  140. v-for="(item, index) in tabs"
  141. :key="index"
  142. @click="toggleTab(index)"
  143. >
  144. <div class="name" :class="{ selected: index == tabIndex }">
  145. {{ item }}
  146. </div>
  147. <div class="line" v-if="index == tabIndex"></div>
  148. </div>
  149. </div> -->
  150. <div class="tab-content" v-if="!showResult">
  151. <div class='summary-content'>
  152. <div class='summary-icon'>
  153. <img src="~@/assets/image/cyyd/summary-icon.png" />
  154. </div>
  155. <vue-markdown-it
  156. :source="item.summary"
  157. :options="{
  158. html: true,
  159. linkify: true,
  160. }"
  161. />
  162. </div>
  163. </div>
  164. </div>
  165. <template v-if="showResult">
  166. <div class="xg-title">
  167. <img src="~@/assets/image/cyyd/fk.png" />
  168. <div class="name">回答</div>
  169. </div>
  170. <p class='xg-des'>为您找到以下{{ xgdk ? xgdk.length : 0 }}个地块</p>
  171. <div class="table-panel">
  172. <template v-if="xgdk && xgdk.length > 0">
  173. <div
  174. class="dkitem"
  175. :class="{ dkitemchecked: i == dkIndex }"
  176. @mouseover="mouseover(i)"
  177. @mouseout="mouseout(i)"
  178. @click="showDetailModal(citem, i)"
  179. v-for="(citem, i) in xgdk"
  180. :key="i"
  181. >
  182. <div class="number">{{ i + 1 }}</div>
  183. <div class="content">
  184. <h3>{{ citem.name }}</h3>
  185. <p>
  186. <span>面积:{{ citem.area ? citem.area.toFixed(2) : '-' }}亩</span>
  187. <span>单价:{{ citem.unit_price ? citem.unit_price.toFixed(2) : '-' }}</span>
  188. <span>行政区:{{ citem.county ? citem.county : '-' }}</span>
  189. </p>
  190. </div>
  191. </div>
  192. <!-- <div
  193. class="tr"
  194. @mouseover="mouseover(i)"
  195. @mouseout="mouseout(i)"
  196. v-for="(citem, i) in xgdk"
  197. :key="i"
  198. :class="[{ checked: i == dkIndex || i == hoverDkIndex }]"
  199. >
  200. <div class="it xh">{{ i + 1 }}</div>
  201. <div class="it c" @click="showDetailModal(citem, i)">
  202. {{ citem.name }}
  203. </div>
  204. <div class="it">
  205. {{ citem.area ? (citem.area * 0.0015).toFixed(2) : "-" }}
  206. </div>
  207. <div class="it text">
  208. {{ citem.unit_price ? citem.unit_price : "-" }}
  209. </div>
  210. <div class="it blue xh">
  211. {{
  212. citem.comprehensive_score
  213. ? citem.comprehensive_score
  214. : "-"
  215. }}
  216. </div>
  217. <div class="it xh">
  218. <img
  219. class="info"
  220. @click="goLocation(citem, i)"
  221. src="~@/assets/image/icon-loc-blue.png"
  222. />
  223. </div>
  224. </div> -->
  225. </template>
  226. <div v-else class="hintText">未查询到相关地块数据!</div>
  227. </div>
  228. <div class="xg-title" v-if="false">
  229. <img src="~@/assets/image/cyyd/xgdk.png" />
  230. <div class="name">相关组织</div>
  231. <img src="~@/assets/image/cyyd/xs.png" />
  232. </div>
  233. <div class="table-panel" v-if="false">
  234. <div class="th" v-if="xgzz.length > 0">
  235. <div class="it xh">序号</div>
  236. <div class="it">组织名称</div>
  237. <div class="it">组织描述</div>
  238. </div>
  239. <div v-else>暂无数据</div>
  240. <div class="tr" v-for="(item, i) in xgzz" :key="i">
  241. <div class="it xh">{{ i + 1 }}</div>
  242. <div class="it">
  243. {{ item.name }}
  244. </div>
  245. <div class="it">{{ item.zzms }}</div>
  246. </div>
  247. </div>
  248. </template>
  249. <div class="textarea-panel">
  250. <textarea
  251. v-model="zwinputText"
  252. type="text"
  253. autocapitalize="off"
  254. autocomplete="off"
  255. spellcheck="false"
  256. autocorrect="off"
  257. maxlength="1000"
  258. placeholder="请提问"
  259. autofocus=""
  260. >
  261. </textarea>
  262. <AIBtn @click.native="zwsend" />
  263. </div>
  264. <Spin size="large" class="span" fix v-if="loading"></Spin>
  265. </vue-perfect-scrollbar>
  266. <znxz-detail
  267. @close="hideDetail"
  268. @location="goPointMark"
  269. v-if="showDetail"
  270. ref="znxz"
  271. @toggle="toggleInfoTab"
  272. @gowkt="goWkt"
  273. @clear="clearMark"
  274. :item="detailData"
  275. ></znxz-detail>
  276. <znxz-compare v-if="shwoCompare" :map="map" ref="compre"></znxz-compare>
  277. <znxz-collect v-if="shwoCollect" @dkinfo="dkInfo"></znxz-collect>
  278. <feek-back
  279. ref="feek"
  280. @close="hideFeekBackModal"
  281. :question="querQuestion"
  282. :answer="answer"
  283. ></feek-back>
  284. </div>
  285. </div>
  286. <flow-chart ref="flow" @close="hideModal"></flow-chart>
  287. <land-table ref="table" @close="hideTableModal"></land-table>
  288. <Modal
  289. class="info-modal"
  290. footer-hide
  291. v-model="questionModal"
  292. :styles="{ top: '200px' }"
  293. width="40%"
  294. >
  295. <textarea
  296. class="input"
  297. v-model="input"
  298. type="text"
  299. autocapitalize="off"
  300. autocomplete="off"
  301. spellcheck="false"
  302. enterkeyhint="reset"
  303. autocorrect="off"
  304. placeholder="请输入,Enter发送"
  305. autofocus=""
  306. @keyup.enter.stop="reset()"
  307. ></textarea>
  308. <div class="bottom">
  309. <div class="name" @click="input = ''">清空</div>
  310. <div class="send-btn" @click="reset">发送</div>
  311. </div>
  312. </Modal>
  313. </div>
  314. </template>
  315. <script>
  316. import polygons from '../../../static/json/杭州市.json'
  317. import industrialTop from '@/components/IndustrialTop'
  318. import znxzDetail from './ZnxzDetail.vue'
  319. import znxzCompare from './ZnxzCompare.vue'
  320. import L from 'leaflet'
  321. import Proj from 'proj4leaflet'
  322. import ArrayQueue from '@/struct/ArrayQueue'
  323. import axios from 'axios'
  324. import { arcgisToGeoJSON } from '@terraformer/arcgis'
  325. import znxzCollect from './ZnxzCollect.vue'
  326. import loginMethods from '@/api/login'
  327. import { v4 as uuid } from 'uuid'
  328. import { fetchEventSource } from '@microsoft/fetch-event-source'
  329. import dynamicMapLayer from 'esri-leaflet/src/Layers/DynamicMapLayer'
  330. import FlowChart from './FlowChart.vue'
  331. import FeekBack from './ProblemFeedBack.vue'
  332. import LandTable from './LandTable.vue'
  333. import * as turf from '@turf/turf'
  334. import { getWmtsLayer } from '@/util/leaflet'
  335. import wkt from 'wellknown'
  336. import VueMarkdownIt from 'vue-markdown-it'
  337. import landMethods from '@/api/land'
  338. import AIBtn from '@/components/AIBtn.vue'
  339. export default {
  340. components: {
  341. industrialTop,
  342. znxzDetail,
  343. znxzCompare,
  344. znxzCollect,
  345. FlowChart,
  346. LandTable,
  347. FeekBack,
  348. VueMarkdownIt,
  349. AIBtn
  350. },
  351. data() {
  352. return {
  353. radarScanStyle: {
  354. width: '100%',
  355. height: '100%',
  356. left: 0,
  357. top: 0
  358. },
  359. hzData: [],
  360. showQuery: false,
  361. radarShow: false,
  362. input: '',
  363. hotQestionList: [
  364. {
  365. name: '请帮我在杭州市萧山机场附近推荐几块总价不超过2000万的工业用地'
  366. },
  367. {
  368. name: '帮我在萧山区推荐一宗60亩左右的工业用地'
  369. },
  370. {
  371. name: '请帮我杭州市找几块在开发区内,园区主导产业为新能源的工业用地'
  372. },
  373. {
  374. name: '请在杭州市杭州东站附近15公里范围内推荐几块面积在35亩左右,公共设施相对完善的工业用地'
  375. },
  376. {
  377. name: '请帮我在杭州市余杭区找几块面积在50亩左右,总价不超过3000万,周边5公里内有地铁站的地块'
  378. }
  379. ],
  380. inputText: '',
  381. shwoCompare: false,
  382. shwoCollect: false,
  383. answer: '',
  384. markerLayer: null,
  385. questionModal: false,
  386. showLegend: true,
  387. hintText: '思考中...',
  388. dkIndex: -1,
  389. hoverDkIndex: -1,
  390. summary: '',
  391. wt: null,
  392. count: 0,
  393. activeItem: { id: 1 },
  394. id: 'industriaMap' + new Date().getTime(),
  395. latitude: 31.86119,
  396. longitude: 117.283042,
  397. layers: [],
  398. showResult: false,
  399. showDetail: false,
  400. zoomLevel: 8,
  401. zhuiwen: false,
  402. dkGeo: null,
  403. dkGeoJson: null,
  404. activeIndex: 0,
  405. tabIndex: 0,
  406. map: null,
  407. xgzz: [],
  408. zoom: 0,
  409. xgdk: [],
  410. interval: null,
  411. zwinputText: '',
  412. loading: false,
  413. ctrlAbout: null,
  414. eventSource: null,
  415. messages: [],
  416. gInterval: 3 * 1000 * 60,
  417. checkInterval: null,
  418. histories: new ArrayQueue(5),
  419. tabs: ['全部建设用地', '新建建设用地', '存量建设用地'],
  420. steps: [
  421. {
  422. name: '问题分析'
  423. },
  424. {
  425. name: '地块搜索'
  426. },
  427. {
  428. name: '整理答案'
  429. },
  430. {
  431. name: '回答完成'
  432. }
  433. ],
  434. querQuestion: '',
  435. settings: {
  436. maxScrollbarLength: 60
  437. },
  438. geojsonLayer: null,
  439. wktToGeojsonLayer: null,
  440. identifyGeojsonLayer: null,
  441. type: null,
  442. modal: false,
  443. showTableModal: true,
  444. showLayerControl: false,
  445. polyline: null,
  446. dkMarkerLayer: [],
  447. startTime: 0,
  448. showIndentify: false,
  449. detailData: null,
  450. // detailData: {
  451. // 'id': 48668,
  452. // 'OBJECTID': null,
  453. // 'xzq': null,
  454. // 'xzqmc': '萧山区',
  455. // 'xzqdm': '330109',
  456. // 'dkmc': '湘湖国家旅游度假区建设工矿仓储项目',
  457. // 'dkbh': '萧政工出[2025]11号',
  458. // 'dkmj': 60.714,
  459. // 'tdyt': '工业用地',
  460. // 'jzdj': null,
  461. // 'kfq': null,
  462. // 'dkid': '1895353609416212480',
  463. // 'dklx': '立即可用',
  464. // 'is_valid': null,
  465. // 'dlmc': null,
  466. // 'group_name': null,
  467. // 'shape_leng': null,
  468. // 'lysx': 1,
  469. // 'kfqdm': null,
  470. // 'kfqmc': null,
  471. // 'tdzl': null,
  472. // 'kfcd': null,
  473. // 'is_bdz': null,
  474. // 'bzd_gdzctz': null,
  475. // 'bzd_mjss': null,
  476. // 'bzd_dwnh': null,
  477. // 'bzd_dwpf': null,
  478. // 'rjl_min': null,
  479. // 'rjl_max': null,
  480. // 'is_publish': null,
  481. // 'lxr': null,
  482. // 'lxdh': null,
  483. // 'lxdz': null,
  484. // 'cryear': null,
  485. // 'crway': null,
  486. // 'wgyy': null,
  487. // 'qjurl': null,
  488. // 'syzt': 1,
  489. // 'remark': null,
  490. // 'district_code': null,
  491. // 'district': null,
  492. // 'available_sequence': 1,
  493. // 'sde_ecgap_klyzy_area': null,
  494. // 'development_degree': 0,
  495. // 'use': 1,
  496. // 'plot_ratio_start': 1.5,
  497. // 'plot_ratio_end': 2,
  498. // 'investment_scale': 420,
  499. // 'tax': 40,
  500. // 'unit_energy_consumption_added': '≥13.8万元/吨标煤',
  501. // 'unit_emission_added': '≥5640万元/吨',
  502. // 'bz': null,
  503. // 'create_time': null,
  504. // 'create_worker_id': null,
  505. // 'update_time': null,
  506. // 'update_worker_id': null,
  507. // 'is_pub': 1,
  508. // 'image_url': null,
  509. // 'intr_url': null,
  510. // 'zyid': '1895353609416212480',
  511. // 'bzdj': null,
  512. // 'is_bzd': 1,
  513. // 'sskfq': null,
  514. // 'introduce': null,
  515. // 'xmid': null,
  516. // 'coord': '[120.1791595,30.036971]',
  517. // 'sde_ecgap_klyzy_fid': null,
  518. // 'dksyh': '1895353609416212480',
  519. // 'reason_for_invalid': null,
  520. // 'is_nz': 1,
  521. // 'is_tg': 1,
  522. // 'contact_address': null,
  523. // 'is_ng': null,
  524. // 'file_name': null,
  525. // 'address': '位于萧山区义桥镇,东至空地,南至空地,西至空地,北至云临路。',
  526. // 'period': 30,
  527. // 'status': 1,
  528. // 'crfs': 2,
  529. // 'xzt_url': null,
  530. // 'data_from': 'from dealland',
  531. // 'image_id': null,
  532. // 'name': '湘湖国家旅游度假区建设工矿仓储项目',
  533. // 'sfsj': 1,
  534. // 'isbuild': null,
  535. // 'is_incircle': null,
  536. // 'circlename': null,
  537. // 'instance_id': '01954d7c502234619461953e090100e3',
  538. // 'sde_ecgap_klyzy_area_1': 60.714,
  539. // 'shape_Length': null,
  540. // 'shape_Area': null
  541. //
  542. // },
  543. legend: [
  544. // {
  545. // name: "可利用资源",
  546. // fill: "#e48b8b50",
  547. // border: "#000000",
  548. // },
  549. // {
  550. // name: "永久基本农田",
  551. // fill: "#fefe6050",
  552. // border: "#d7d6d6",
  553. // },
  554. // {
  555. // name: "生态保护红线",
  556. // fill: "#4d9757",
  557. // border: "#4d9757",
  558. // },
  559. // {
  560. // name: "控规详细性规划",
  561. // children: [
  562. // {
  563. // name: "工业",
  564. // fill: "#66290080",
  565. // border: "#66290080",
  566. // },
  567. // ],
  568. // },
  569. {
  570. name: '可利用资源',
  571. children: [
  572. {
  573. name: '公告地块',
  574. fill: 'green',
  575. border: 'green'
  576. },
  577. {
  578. name: '计划地块',
  579. fill: 'blue',
  580. border: 'blue'
  581. }
  582. // {
  583. // name: "商业",
  584. // fill: "",
  585. // border: "rgb(230,0,0)",
  586. // },
  587. ]
  588. }
  589. ],
  590. mockData: {
  591. summary: `### 萧政工出(2020)2号
  592. - **行政区**: 萧山区
  593. - **规划用途**: 工业用地
  594. - **用地面积**: 24.9435亩
  595. - **土地坐落**: 东至规划工业用地,南至规划支路,西至规划工业用地,北至机场北辅路。
  596. ### 2. 双桥单元XH020203-15地块
  597. - **行政区**: 西湖区
  598. - **规划用途**: 工业用地
  599. - **用地面积**: 21756.0 平方米
  600. - **土地坐落**: 西湖区(双桥单元XH020203-15地块,东至规划支路,南至规划云梦路,西至智强路,北至肖圣街)`,
  601. dks: [
  602. {
  603. id: 7286,
  604. name: '双桥单元XH020203-16地块',
  605. xzqmc: '西湖区',
  606. tdyt: '工业用地',
  607. address:
  608. '西湖区(双桥单元XH020203 -16地块,东至数治路,南至规划云梦路,西至规划支路,北至肖圣街)',
  609. dkmj: 24027.0,
  610. center_wkt: 'POINT(120.036582554545 30.3277712108271)'
  611. },
  612. {
  613. id: 7285,
  614. name: '双桥单元XH020203-15地块',
  615. xzqmc: '西湖区',
  616. tdyt: '工业用地',
  617. address:
  618. '西湖区(双桥单元XH020203-15地块,东至规划支路,南至规划云梦路,西至智强路,北至肖圣街)',
  619. dkmj: 21756.0,
  620. comprehensive_score: 88.0,
  621. center_wkt: 'POINT(120.03392658277 30.3271936782775)'
  622. }
  623. ]
  624. },
  625. mockInterval: null
  626. }
  627. },
  628. mounted() {
  629. this.$nextTick(() => {
  630. this.activeIndex = 0
  631. this.initMap()
  632. this.calcRadarScan()
  633. // this.checkPermision();
  634. })
  635. },
  636. created() {
  637. if (this.$route.params && this.$route.params.keyword) {
  638. this.inputText = this.$route.params.keyword
  639. }
  640. this.zwinputText = ''
  641. this.type = this.$route.params.type
  642. },
  643. methods: {
  644. toggleLayerControl() {
  645. this.showLayerControl = !this.showLayerControl
  646. if (!this.showLegend) {
  647. this.showLegend = true
  648. }
  649. },
  650. toggleIdentity() {
  651. this.showIndentify = !this.showIndentify
  652. if (this.showIndentify) {
  653. this.map.on('click', this.mapClick)
  654. } else {
  655. this.map.off('click', this.mapClick)
  656. if (this.showDetail) {
  657. this.hideDetail()
  658. }
  659. if (this.identifyGeojsonLayer) {
  660. this.map.removeLayer(this.identifyGeojsonLayer)
  661. }
  662. }
  663. },
  664. back() {
  665. this.showDetail = false
  666. this.showQuery = false
  667. this.radarShow = false
  668. if (this.dkMarkerLayer) {
  669. this.dkMarkerLayer.forEach((item) => {
  670. this.map.removeLayer(item)
  671. })
  672. this.dkMarkerLayer = []
  673. }
  674. if (this.ctrlAbout) {
  675. this.ctrlAbout.abort()
  676. }
  677. this.loading = false
  678. if (this.interval) {
  679. clearInterval(this.interval)
  680. }
  681. if (this.mockInterval) {
  682. clearInterval(this.mockInterval)
  683. }
  684. this.inputText = ''
  685. },
  686. checkPermision() {
  687. let that = this
  688. loginMethods
  689. .permission()
  690. .then((res) => {
  691. if (res && res.code == 200) {
  692. that.permission = res.data
  693. if (that.permission) {
  694. that.activeIndex = 0
  695. // if (that.type) {
  696. // that.tabs.forEach((item, index) => {
  697. // if (that.type == item) {
  698. // that.activeIndex = index;
  699. // }
  700. // });
  701. // }
  702. // that.toggleTab(that.activeIndex);
  703. // that.xgdk = [
  704. // {
  705. // id: 7162,
  706. // name: "桐庐经济开发区85号工业地块",
  707. // county: "桐庐县",
  708. // location: "桐庐县中联路和城南路交叉口西北侧",
  709. // area: 33042,
  710. // comprehensive_score: 98,
  711. // center_wkt: "POINT(119.683179367182 29.7668594386792)",
  712. // },
  713. // {
  714. // id: 6936,
  715. // name: "桐庐县江南镇工业园区2023-2号地块",
  716. // county: "桐庐县",
  717. // location: "桐庐县窄溪路和金堂路交叉口南侧",
  718. // area: 32730,
  719. // comprehensive_score: 96,
  720. // center_wkt: "POINT(119.776661041068 29.8674845992439)",
  721. // },
  722. // {
  723. // id: 6053,
  724. // name: "青山湖科技城单元 LA011102-02、 LA011102-03 地块",
  725. // county: null,
  726. // location:
  727. // "青山湖科技城单元LA011102-02、LA011102-03地块(东至鹤川路,南至蒋墅街,西至发达路,北至科技大道)",
  728. // area: 31965,
  729. // comprehensive_score: 93,
  730. // center_wkt: "POINT(119.833330942318 30.2587063318842)",
  731. // },
  732. // {
  733. // id: 7003,
  734. // name: "梅城镇五马洲工业园区C-04-1号",
  735. // county: "建德市",
  736. // location: "梅城镇五马洲工业园区",
  737. // area: 33431,
  738. // comprehensive_score: 69,
  739. // center_wkt: "POINT(119.455506193026 29.5194122302608)",
  740. // },
  741. // {
  742. // id: 5913,
  743. // name: "青山湖科技城单元LA010206-02地块",
  744. // county: null,
  745. // location:
  746. // "青山湖科技城单元LA010206-02地块(东至泉口服务中心,南至市地街,西至干校路,北至长西线)",
  747. // area: 32489,
  748. // comprehensive_score: 65,
  749. // center_wkt: "POINT(119.792292133488 30.3242359513533)",
  750. // },
  751. // {
  752. // id: 6975,
  753. // name: "塘栖张家墩产业园地块1",
  754. // county: "临平区",
  755. // location:
  756. // "塘栖镇酒店埭社区;东至规划绿地、南至规划绿地、西至规划绿地、北至张家墩路。",
  757. // area: 32228,
  758. // comprehensive_score: 60,
  759. // center_wkt: "POINT(120.16357939569 30.4705788185453)",
  760. // },
  761. // {
  762. // id: 5411,
  763. // name: "富政工出[2024]9号",
  764. // county: "富阳区",
  765. // location: "鹿山街道工业功能区",
  766. // area: 34575,
  767. // comprehensive_score: 60,
  768. // center_wkt: "POINT(119.896504461223 29.9860460585603)",
  769. // },
  770. // {
  771. // id: 7365,
  772. // name: "义桥镇建设工矿仓储项目",
  773. // county: "萧山区",
  774. // location:
  775. // "位于萧山区义桥镇田丰村、七里店村、勤里村,东至田丰村、七里店村土地,南至七里店村土地,西至田丰村土地,北至田丰村、勤里村土地。",
  776. // area: 33797,
  777. // comprehensive_score: 57,
  778. // center_wkt: "POINT(120.162338981989 30.0555790489407)",
  779. // },
  780. // {
  781. // id: 7223,
  782. // name: "浦沿单元BJ040501-14地块",
  783. // county: "滨江区",
  784. // location:
  785. // "东至规划量子巷;南至浦炬街绿化;西至紫云路;北至规划回龙庵路。",
  786. // area: 33867,
  787. // comprehensive_score: 55,
  788. // center_wkt: "POINT(120.157534740039 30.1548281617972)",
  789. // },
  790. // {
  791. // id: 7013,
  792. // name: "杭州钱江经济开发区奉欣路以南工业地块三(C-3)",
  793. // county: "余杭区",
  794. // location: "仁和街道奉口村",
  795. // area: 35231,
  796. // comprehensive_score: 55,
  797. // center_wkt: "POINT(120.069254227924 30.4426198260172)",
  798. // },
  799. // ];
  800. // that.showXgdkCenterPoint();
  801. }
  802. }
  803. })
  804. .finally(() => {
  805. if (!this.permission) {
  806. this.$Message.error('用户信息验证失败,请重新登录!')
  807. setTimeout(() => {
  808. this.logout()
  809. }, 1000)
  810. }
  811. })
  812. },
  813. fullInput(item) {
  814. if (!this.loading) {
  815. this.activeIndex = 0
  816. this.inputText = item.name
  817. this.showQuery = false
  818. } else {
  819. this.$Messages.info('正在请求中,请稍后!')
  820. }
  821. },
  822. logout() {
  823. this.$store.dispatch('LogOut').then(() => {
  824. this.$router.push({ name: 'login' })
  825. })
  826. },
  827. reset() {
  828. if (this.input == '' || this.input == null) {
  829. this.$Message.info('请输入')
  830. return
  831. }
  832. this.inputText = this.input
  833. this.zwinputText = ''
  834. this.questionModal = false
  835. this.histories = new ArrayQueue(5)
  836. // this.hzData = [];
  837. // var item = { name: this.inputText, loading: true };
  838. // this.hzData.push(item);
  839. this.toggleTab(0)
  840. },
  841. hotQuestionReset() {
  842. if (this.inputText == '' || this.inputText == null) {
  843. // this.$Message.info("请输入");
  844. // return;
  845. this.inputText = '帮我在萧山区推荐一宗60亩左右的工业用地'
  846. }
  847. this.zwinputText = ''
  848. this.questionModal = false
  849. this.histories = new ArrayQueue(5)
  850. this.toggleTab(0)
  851. },
  852. zwsend() {
  853. if (!this.zwinputText) {
  854. this.zwinputText = '帮我在萧山区推荐一宗60亩左右的工业用地'
  855. }
  856. var item = { name: this.zwinputText, loading: true }
  857. // this.hzData = [item]
  858. this.hzData.push(item)
  859. this.activeIndex = 0
  860. this.send()
  861. },
  862. //ai超时超过3.5分钟 或者报错处理,结束请求提示未查询到信息
  863. checkTimeOut() {
  864. if (this.loading) {
  865. this.xgdk = []
  866. this.activeIndex = 0
  867. if (this.ctrlAbout) {
  868. this.ctrlAbout.abort()
  869. }
  870. this.loading = false
  871. if (this.interval) {
  872. clearInterval(this.interval)
  873. }
  874. this.hzData.forEach((item, index) => {
  875. if (index == this.hzData.length - 1) {
  876. this.hzData[index].summary = '未查询到相关信息'
  877. this.hzData[index].loading = false
  878. this.zwinputText = ''
  879. }
  880. })
  881. if (this.checkInterval) {
  882. clearInterval(this.checkInterval)
  883. }
  884. this.showResult = true
  885. this.radarShow = false
  886. }
  887. },
  888. resetAnswer(index) {
  889. if (index == 0) {
  890. this.input = this.inputText
  891. this.questionModal = true
  892. }
  893. },
  894. showFlowChart() {
  895. this.modal = true
  896. this.$nextTick(() => {
  897. this.$refs.flow.open()
  898. })
  899. },
  900. hideModal() {
  901. this.modal = false
  902. },
  903. hideFeekBackModal() {},
  904. showTableInfo() {
  905. this.showTableModal = true
  906. this.$nextTick(() => {
  907. this.$refs.table.open()
  908. })
  909. },
  910. hideTableModal() {
  911. this.showTableModal = false
  912. },
  913. //图层控制
  914. switchMapLayer(item) {
  915. if (item.checked) {
  916. if (item.layer === undefined || item.layer == null) {
  917. if (item.type == 'dynamic') {
  918. item.layer = dynamicMapLayer({
  919. url: item.url,
  920. opacity: 0.8,
  921. f: 'json'
  922. })
  923. }
  924. if (item.type == 'geoserver') {
  925. item.layer = L.tileLayer.wms(item.url, {
  926. // 链接要改对应的
  927. layers: item.layername,
  928. format: 'image/png',
  929. layerID: Math.random(),
  930. transparent: true
  931. })
  932. item.layer.setZIndex(100)
  933. }
  934. if (item.type == 'wmts') {
  935. item.layer = getWmtsLayer(item)
  936. item.layer.setZIndex(100)
  937. }
  938. this.map.addLayer(item.layer)
  939. } else {
  940. this.map.addLayer(item.layer)
  941. }
  942. } else {
  943. if (item.layer != undefined || item.layer != null) {
  944. this.map.removeLayer(item.layer)
  945. }
  946. }
  947. },
  948. initMap() {
  949. let CRS_4490 = new Proj.CRS("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs", {
  950. resolutions: [
  951. 1.4062500262315807,
  952. 0.7031249999891485,
  953. 0.35156249999999994,
  954. 0.17578124999999997,
  955. 0.08789062500000012,
  956. 0.04394531250000006,
  957. 0.021972656250000007,
  958. 0.01098632812500002,
  959. 0.00549316406250001,
  960. 0.0027465820312500017,
  961. 0.0013732910156250009,
  962. 6.866455078124991E-4,
  963. 3.4332275390624957E-4,
  964. 1.7166137695312503E-4,
  965. 8.583068847656251E-5,
  966. 4.291534423828141E-5,
  967. 2.1457672119140645E-5,
  968. 1.0728836059570307E-5,
  969. 5.364418029785169E-6,
  970. 2.6822090642902305E-6,
  971. 1.3411045333348457E-6
  972. ],
  973. origin: [-180, 90]
  974. });
  975. this.layers = window.ApplicationConfig.layerTreeConfig;
  976. this.layers.forEach((item, index) => {
  977. if (index == 0) {
  978. item.checked = true
  979. } else {
  980. item.checked = false
  981. }
  982. })
  983. let myCenter = new L.LatLng(this.latitude, this.longitude) // 设置地图中心
  984. this.map = L.map(this.id, {
  985. zoom:window.ApplicationConfig.mapOptions["zoom"],
  986. center: window.ApplicationConfig.mapOptions["center"],
  987. zoomControl: false,
  988. crs: CRS_4490,
  989. attributionControl: false, //去掉右下角的logo
  990. });
  991. var tk = window.ApplicationConfig.tk;
  992. var tk = "6dfd31e3b55a8466f34997aee5551a9c";
  993. // 添加天地图底图
  994. //底图
  995. // const image = L.tileLayer(
  996. // "http://t{s}.tianditu.gov.cn/img_w/wmts?tk=" +
  997. // tk +
  998. // "&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}",
  999. // {
  1000. // subdomains: [0, 1, 2, 3, 4, 5, 6, 7],
  1001. // zIndex: 1,
  1002. // }
  1003. // );
  1004. // this.map.addLayer(image);
  1005. // const dx = L.tileLayer(
  1006. // "https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk=" +
  1007. // tk,
  1008. // {
  1009. // subdomains: [0, 1, 2, 3, 4, 5, 6, 7],
  1010. // transparent: true,
  1011. // zIndex: 2,
  1012. // }
  1013. // );
  1014. // this.map.addLayer(dx);
  1015. // //注记
  1016. // const cia = L.tileLayer(
  1017. // "http://t{s}.tianditu.gov.cn/cia_w/wmts?tk=" +
  1018. // tk +
  1019. // "&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}",
  1020. // {
  1021. // subdomains: [0, 1, 2, 3, 4, 5, 6, 7],
  1022. // transparent: true,
  1023. // zIndex: 3,
  1024. // }
  1025. // );
  1026. // this.map.addLayer(cia);
  1027. // let dtLayers = {
  1028. // name: "底图",
  1029. // layers: [
  1030. // {
  1031. // name: "浙江影像",
  1032. // id: "zjyx",
  1033. // checked: true,
  1034. // type: "wmts",
  1035. // url: "https://kjzl.zrzyt.zj.gov.cn/zdzy/gtkj/zjgt48/34048bffdd0d4d148ca4a40da7eade21/services/wmts/imgmap/default/oss",
  1036. // layername: "imgmap",
  1037. // },
  1038. // {
  1039. // name: "浙江注记",
  1040. // id: "zjzj",
  1041. // checked: true,
  1042. // type: "wmts",
  1043. // url: "https://zdzy.zrzyt.zj.gov.cn/gtkj/zjgt49/2003392c13044d3ab3097b0a4328ecf2/services/wmts/imgmap_lab/default/oss",
  1044. // layername: "imgmap_lab",
  1045. // },
  1046. // ],
  1047. // };
  1048. // var zjyx = dtLayers.layers[0];
  1049. // this.switchMapLayer(zjyx);
  1050. // var zjzj = dtLayers.layers[1];
  1051. // this.switchMapLayer(zjzj);
  1052. //定位浙江省
  1053. // this.location(polygons)
  1054. //默认加载所有选中图层
  1055. this.layers.forEach(layerGroup=>{
  1056. layerGroup.layers.forEach(oneLayer=>{
  1057. this.switchMapLayer(oneLayer)
  1058. })
  1059. });
  1060. // var gd = this.layers[0].layers[0]
  1061. },
  1062. //属性识别
  1063. mapClick(e) {
  1064. if (this.identifyGeojsonLayer) {
  1065. this.map.removeLayer(this.identifyGeojsonLayer)
  1066. }
  1067. // debugger
  1068. let query =
  1069. window.ApplicationConfig.landUrl +
  1070. '/0/query?where=&text=&objectIds=&time=&geometry=' +
  1071. e.latlng.lng +
  1072. ',' +
  1073. e.latlng.lat +
  1074. '&' +
  1075. 'geometryType=esriGeometryPoint&inSR=4490&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=true&' +
  1076. 'maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&' +
  1077. 'outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&f=json'
  1078. axios.get(query).then((data) => {
  1079. console.log(data)
  1080. if (data.data.features.length < 1) {
  1081. this.$Message.info('未查询到数据')
  1082. return
  1083. }
  1084. var land = data.data.features[0].attributes
  1085. var geojson = arcgisToGeoJSON(data.data.features[0].geometry)
  1086. console.log(turf.getGeom(geojson))
  1087. land.area = turf.area(turf.getGeom(geojson)).toFixed(2) + '平方米'
  1088. var geos = L.geoJSON(geojson, {
  1089. style: function (feature) {
  1090. return { color: '#3BA5FF' }
  1091. }
  1092. })
  1093. this.dkGeo = geos
  1094. this.dkGeoJson = geojson
  1095. this.identifyGeojsonLayer = geos.addTo(this.map)
  1096. this.map.fitBounds(geos.getBounds())
  1097. this.showDetailModal(land, -1)
  1098. })
  1099. },
  1100. location(geo) {
  1101. let t = L.geoJSON(geo, {
  1102. style: function (feature) {
  1103. return { color: 'yellow' }
  1104. }
  1105. })
  1106. this.map.fitBounds(t.getBounds())
  1107. },
  1108. //高亮marker
  1109. hightMarker(i) {
  1110. this.dkMarkerLayer.forEach((item, index) => {
  1111. var className = 'point-div-icon'
  1112. if (item.options.properties.p == i && index == i) {
  1113. className = 'highlight-div-icon'
  1114. }
  1115. if (index == this.hoverDkIndex) {
  1116. className = 'highlight-div-icon'
  1117. }
  1118. if (index == this.dkIndex) {
  1119. className = 'highlight-div-icon'
  1120. }
  1121. var myIcon = L.divIcon({
  1122. html: index > -1 ? '<div>' + (index + 1) + '<div>' : '<div><div>',
  1123. className: className,
  1124. iconSize: [32, 32]
  1125. })
  1126. item.setIcon(myIcon)
  1127. })
  1128. },
  1129. //地块Item hover 和marker 高亮交互
  1130. mouseover(i) {
  1131. this.hoverDkIndex = i
  1132. this.hightMarker(i)
  1133. },
  1134. mouseout(i) {
  1135. this.hoverDkIndex = -1
  1136. this.hightMarker(-1)
  1137. },
  1138. //显示地块详情,先获取地块图斑,定位、路线、和地类分析需要叠加获取相交地块
  1139. showDetailModal(item, index) {
  1140. if (index != -1) {
  1141. this.getActiveItemGeometry(item)
  1142. }
  1143. if (
  1144. (this.activeItem && this.activeItem.id != item.id) ||
  1145. this.activeItem == null
  1146. ) {
  1147. if (this.dkIndex != index) {
  1148. if (this.geojsonLayer) {
  1149. this.map.removeLayer(this.geojsonLayer)
  1150. this.geojsonLayer = null
  1151. }
  1152. }
  1153. this.clearMark()
  1154. this.showDetail = false
  1155. this.activeItem = item
  1156. this.dkIndex = index
  1157. //高亮marker
  1158. this.hightMarker(index)
  1159. } else {
  1160. if (this.geojsonLayer) {
  1161. this.map.removeLayer(this.geojsonLayer)
  1162. this.geojsonLayer = null
  1163. }
  1164. this.showDetail = false
  1165. this.clearMark()
  1166. this.activeItem = null
  1167. }
  1168. this.goLocation(item, index)
  1169. },
  1170. //地块收藏点击查看详情
  1171. dkInfo(item) {
  1172. this.dkGeo = null
  1173. this.dkGeoJson = null
  1174. item.id = item.dk_id ? item.dk_id : item.id
  1175. this.goLocation(item)
  1176. this.showDetail = true
  1177. this.activeItem = item
  1178. },
  1179. //隐藏详情
  1180. hideDetail() {
  1181. this.showDetail = false
  1182. if (this.geojsonLayer) {
  1183. this.map.removeLayer(this.geojsonLayer)
  1184. this.geojsonLayer = null
  1185. }
  1186. if (this.identifyGeojsonLayer) {
  1187. this.map.removeLayer(this.identifyGeojsonLayer)
  1188. }
  1189. this.clearMark()
  1190. },
  1191. //收藏
  1192. doCollect(collect) {
  1193. this.shwoCollect = collect
  1194. this.shwoCompare = false
  1195. if (collect) {
  1196. this.hideDetail()
  1197. }
  1198. try {
  1199. this.$refs.compre.remove()
  1200. } catch (e) {
  1201. }
  1202. },
  1203. //对比
  1204. doCompare(compare) {
  1205. this.shwoCompare = compare
  1206. this.shwoCollect = false
  1207. if (compare) {
  1208. this.hideDetail()
  1209. } else {
  1210. try {
  1211. this.$refs.compre.remove()
  1212. } catch (e) {
  1213. }
  1214. }
  1215. },
  1216. toggle(index) {
  1217. this.activeIndex = index
  1218. this.hideDetail()
  1219. },
  1220. toggleTab(index) {
  1221. if (this.loading) {
  1222. return
  1223. }
  1224. this.tabIndex = index
  1225. if (this.inputText) {
  1226. this.wt = this.inputText
  1227. this.hzData = []
  1228. var item = { name: this.wt, loading: true }
  1229. this.hzData = [item]
  1230. this.count = 0
  1231. this.zwinputText = ''
  1232. this.zhuiwen = false
  1233. this.showQuery = true
  1234. this.send()
  1235. } else {
  1236. this.$Message.info('请输入!')
  1237. }
  1238. },
  1239. toggleZw() {
  1240. this.zhuiwen = !this.zhuiwen
  1241. },
  1242. showFeek() {
  1243. this.$nextTick(() => {
  1244. this.$refs.feek.open()
  1245. })
  1246. },
  1247. //地块图斑定位
  1248. goLocation(item, index) {
  1249. if (this.showDetail && this.activeItem.id != item.id) {
  1250. this.showDetail = false
  1251. }
  1252. // this.activeItem = item;
  1253. if (this.geojsonLayer) {
  1254. this.map.removeLayer(this.geojsonLayer)
  1255. this.geojsonLayer = null
  1256. }
  1257. if (this.identifyGeojsonLayer) {
  1258. this.map.removeLayer(this.identifyGeojsonLayer)
  1259. }
  1260. if (index != undefined) {
  1261. if (this.dkIndex != index) {
  1262. this.dkGeo = null
  1263. this.dkGeoJson = null
  1264. }
  1265. this.dkIndex = index
  1266. }
  1267. if (this.dkGeo) {
  1268. this.geojsonLayer = this.dkGeo.addTo(this.map)
  1269. this.map.fitBounds(this.dkGeo.getBounds())
  1270. } else {
  1271. let query =
  1272. window.ApplicationConfig.geoserverUrl +
  1273. '?service=WFS&version=1.0.0&request=GetFeature&typeName=' +
  1274. window.ApplicationConfig.gdLayerName +
  1275. '&maxFeatures=50&outputFormat=application%2Fjson&cql_filter=dkmc=\'' +
  1276. item.name +
  1277. '\''
  1278. axios.get(query).then((data) => {
  1279. console.log(data)
  1280. if (data.data.features.length < 1) {
  1281. this.$Message.info('未查询到数据')
  1282. return
  1283. }
  1284. this.detailData = data.data.features[0].properties
  1285. var geojson = data.data.features[0].geometry
  1286. var geos = L.geoJSON(geojson, {
  1287. style: function (feature) {
  1288. return { color: '#3BA5FF' }
  1289. }
  1290. })
  1291. this.dkGeo = geos
  1292. this.dkGeoJson = geojson
  1293. this.geojsonLayer = geos.addTo(this.map)
  1294. this.map.fitBounds(geos.getBounds())
  1295. })
  1296. }
  1297. },
  1298. //获取地块信息
  1299. async getActiveItemGeometry(item) {
  1300. return new Promise((resolve, reject) => {
  1301. let query =
  1302. window.ApplicationConfig.geoserverUrl +
  1303. '?service=WFS&version=1.0.0&request=GetFeature&typeName=' +
  1304. window.ApplicationConfig.gdLayerName +
  1305. '&maxFeatures=50&outputFormat=application%2Fjson&cql_filter=dkmc=\'' +
  1306. item.dkmc +
  1307. '\''
  1308. axios.get(query).then((data) => {
  1309. if (data.data.features.length < 1) {
  1310. this.$Message.info('未查询到数据')
  1311. return
  1312. }
  1313. this.detailData = data.data.features[0].properties
  1314. var geojson = data.data.features[0].geometry
  1315. var geos = L.geoJSON(geojson, {
  1316. style: function (feature) {
  1317. return { color: '#3BA5FF' }
  1318. }
  1319. })
  1320. this.dkGeo = geos
  1321. this.dkGeoJson = geojson
  1322. resolve()
  1323. })
  1324. })
  1325. },
  1326. //地图绘制清空
  1327. clearMark() {
  1328. if (this.markerLayer) {
  1329. this.map.removeLayer(this.markerLayer)
  1330. this.markerLayer = null
  1331. }
  1332. if (this.polyline) {
  1333. this.map.removeLayer(this.polyline)
  1334. this.polylines = null
  1335. }
  1336. if (this.wktToGeojsonLayer) {
  1337. this.wktToGeojsonLayer.forEach((item) => {
  1338. this.map.removeLayer(item)
  1339. })
  1340. this.wktToGeojsonLayer = null
  1341. }
  1342. this.dkIndex = -1
  1343. this.hoverDkIndex = -1
  1344. this.hightMarker(-1)
  1345. this.zoom = 0
  1346. this.activeItem = null
  1347. },
  1348. //地类分析-图斑定位-叠加出相交地块
  1349. goWkt(wkts) {
  1350. if (this.wktToGeojsonLayer) {
  1351. this.wktToGeojsonLayer.forEach((item) => {
  1352. this.map.removeLayer(item)
  1353. })
  1354. }
  1355. this.wktToGeojsonLayer = []
  1356. var originGeom = this.dkGeoJson
  1357. //当前地块ID
  1358. if (this.geojsonLayer == null) {
  1359. this.goLocation(this.activeItem, this.dkIndex)
  1360. }
  1361. const bounds = L.latLngBounds()
  1362. wkts.forEach((t) => {
  1363. var geojson = wkt.parse(t)
  1364. //定位
  1365. var geos = L.geoJSON(geojson, {
  1366. style: function (feature) {
  1367. return { color: '#ffff00' }
  1368. }
  1369. })
  1370. var layer = geos.addTo(this.map)
  1371. this.wktToGeojsonLayer.push(layer)
  1372. //相交
  1373. let intersectGeo = turf.intersect(originGeom, geojson)
  1374. if (intersectGeo) {
  1375. var inner = L.geoJSON(intersectGeo, {
  1376. style: function (feature) {
  1377. return { color: '#ff0000' }
  1378. }
  1379. })
  1380. var innnerlayer = inner.addTo(this.map)
  1381. this.wktToGeojsonLayer.push(innnerlayer)
  1382. }
  1383. bounds.extend(geos.getBounds())
  1384. })
  1385. try {
  1386. this.map.fitBounds(bounds)
  1387. } catch (e) {
  1388. console.log('fitBounds error: ', e)
  1389. }
  1390. },
  1391. //详情页tab切换地图绘制相关清空
  1392. toggleInfoTab() {
  1393. if (this.markerLayer) {
  1394. this.map.removeLayer(this.markerLayer)
  1395. this.markerLayer = null
  1396. }
  1397. if (this.polyline) {
  1398. this.map.removeLayer(this.polyline)
  1399. this.polylines = null
  1400. }
  1401. if (this.wktToGeojsonLayer) {
  1402. this.wktToGeojsonLayer.forEach((item) => {
  1403. this.map.removeLayer(item)
  1404. })
  1405. this.wktToGeojsonLayer = null
  1406. }
  1407. },
  1408. //路线绘制
  1409. goPointMark(item) {
  1410. var center = item.center
  1411. var cp = item.cp
  1412. if (this.markerLayer) {
  1413. this.map.removeLayer(this.markerLayer)
  1414. this.markerLayer = null
  1415. }
  1416. if (center != '') {
  1417. var centerList = center.split(',')
  1418. this.markerLayer = L.marker([centerList[1], centerList[0]], {
  1419. icon: L.icon({
  1420. iconUrl: '~@/assets/image/staticImage/icon-end.png', // 标点图标地址
  1421. iconSize: [50, 50] // 图标大小
  1422. })
  1423. })
  1424. .addTo(this.map)
  1425. .bindPopup(item.name)
  1426. if (this.dkGeo) {
  1427. const bounds = L.latLngBounds()
  1428. bounds.extend(this.dkGeo.getBounds())
  1429. var pointLng = L.latLngBounds([[centerList[1], centerList[0]]])
  1430. bounds.extend(pointLng)
  1431. // this.map.fitBounds(bounds);
  1432. this.map.fitBounds(bounds, { padding: [10, 10] })
  1433. if (this.zoom == 0) {
  1434. this.zoom = this.map.getZoom()
  1435. }
  1436. } else {
  1437. let query =
  1438. window.ApplicationConfig.landUrl +
  1439. '/0/query?where=id=' +
  1440. this.activeItem.id +
  1441. '&' +
  1442. 'geometryType=esriGeometryPoint&inSR=4490&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=true&' +
  1443. 'maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&' +
  1444. 'outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&f=json'
  1445. axios.get(query).then((data) => {
  1446. console.log(data)
  1447. if (data.data.features.length < 1) {
  1448. return
  1449. }
  1450. this.land = data.data.features[0].attributes
  1451. var geojson = arcgisToGeoJSON(data.data.features[0].geometry)
  1452. var geos = L.geoJSON(geojson, {
  1453. style: function (feature) {
  1454. return { color: '#3BA5FF' }
  1455. }
  1456. })
  1457. this.dkGeo = geos
  1458. this.dkGeoJson = geojson
  1459. const bounds = L.latLngBounds()
  1460. bounds.extend(geos.getBounds())
  1461. var pointLng = L.latLngBounds([[centerList[1], centerList[0]]])
  1462. bounds.extend(pointLng)
  1463. this.map.fitBounds(bounds, { padding: [10, 10] })
  1464. if (this.zoom == 0) {
  1465. this.zoom = this.map.getZoom()
  1466. }
  1467. })
  1468. }
  1469. }
  1470. //路线
  1471. var token = window.ApplicationConfig.tk
  1472. let that = this
  1473. // var token = "6dfd31e3b55a8466f34997aee5551a9c";
  1474. var routerUrl = window.ApplicationConfig.routeUrl
  1475. var url = `${routerUrl}{"orig":"${center}","dest":"${cp}","style":"1"}&type=search&tk=${token}`
  1476. axios.get(url).then((res) => {
  1477. if (res.data) {
  1478. if (that.polyline) {
  1479. that.map.removeLayer(that.polyline)
  1480. }
  1481. var data = res.data
  1482. .substring(
  1483. res.data.indexOf('<routelatlon>') + 13,
  1484. res.data.indexOf('</routelatlon>')
  1485. )
  1486. .split(';')
  1487. data = data.slice(0, data.length - 1)
  1488. var latlngs = []
  1489. data.forEach((item) => {
  1490. var i = item.split(',').reverse()
  1491. latlngs.push(i)
  1492. })
  1493. that.polyline = L.polyline(latlngs, { color: 'red' }).addTo(that.map)
  1494. // that.map.fitBounds(that.polyline.getBounds());
  1495. if (latlngs.length >= 20) {
  1496. if (item.unit == 'km' && item.distance >= 1.7) {
  1497. that.map.setZoom(that.zoom - 3)
  1498. if (latlngs.length >= 30) {
  1499. that.map.setZoom(that.zoom - 4)
  1500. }
  1501. } else {
  1502. that.map.setZoom(that.zoom - 2)
  1503. }
  1504. } else {
  1505. that.map.setZoom(that.zoom - 1)
  1506. }
  1507. that.$refs.znxz.showDistance(item)
  1508. }
  1509. })
  1510. },
  1511. //所有地块仿百度地图绘制
  1512. showXgdkCenterPoint() {
  1513. if (this.dkMarkerLayer) {
  1514. this.dkMarkerLayer.forEach((item) => {
  1515. this.map.removeLayer(item)
  1516. })
  1517. this.dkMarkerLayer = []
  1518. }
  1519. const bounds = L.latLngBounds()
  1520. this.xgdk.forEach((item, i) => {
  1521. if (item.center_wkt) {
  1522. var center = item.center_wkt
  1523. .substring(6, item.center_wkt.length - 1)
  1524. .replace(' ', ',')
  1525. var centerList = center.split(',')
  1526. var className = 'point-div-icon'
  1527. var myIcon = L.divIcon({
  1528. html: i > -1 ? '<div>' + (i + 1) + '<div>' : '<div><div>',
  1529. className: className,
  1530. //图标大小
  1531. iconSize: [32, 32]
  1532. })
  1533. var marker = L.marker([centerList[1], centerList[0]], {
  1534. icon: myIcon,
  1535. properties: { p: i }
  1536. }).addTo(this.map)
  1537. let that = this
  1538. marker.on('mouseover', function (e) {
  1539. that.hoverDkIndex = i
  1540. })
  1541. marker.on('mouseout', function (e) {
  1542. that.hoverDkIndex = -1
  1543. })
  1544. marker.on('click', function (e) {
  1545. that.showDetailModal(that.xgdk[i], i)
  1546. })
  1547. this.dkMarkerLayer.push(marker)
  1548. var pointLng = L.latLngBounds([[centerList[1], centerList[0]]])
  1549. bounds.extend(pointLng)
  1550. }
  1551. })
  1552. this.map.fitBounds(bounds)
  1553. },
  1554. //埋点
  1555. async burialPoint() {
  1556. let p = {
  1557. question: this.querQuestion,
  1558. answer: this.answer
  1559. }
  1560. landMethods.burialPoint(p).then((res) => {
  1561. if (res.code == 200) {
  1562. console.log('问答--burialPoint')
  1563. }
  1564. })
  1565. },
  1566. //ai大模型请求
  1567. send: _.debounce(async function () {
  1568. let that = this
  1569. this.showResult = false
  1570. //不显示查询时地图上的雷达扫描效果
  1571. this.radarShow = false
  1572. this.zhuiwen = false
  1573. if (this.eventSource) {
  1574. this.eventSource.close()
  1575. this.loading = false
  1576. this.eventSource = null
  1577. }
  1578. if (this.ctrlAbout) {
  1579. this.ctrlAbout.abort()
  1580. }
  1581. if (this.dkMarkerLayer) {
  1582. this.dkMarkerLayer.forEach((item) => {
  1583. this.map.removeLayer(item)
  1584. })
  1585. this.dkMarkerLayer = []
  1586. }
  1587. if (this.interval) {
  1588. clearInterval(this.interval)
  1589. }
  1590. this.activeIndex = 0
  1591. var question = this.wt.trim()
  1592. if (this.zwinputText != '') {
  1593. //追问的时候,暂时不用历史数据
  1594. // question = question + ",其中" + this.zwinputText.trim();
  1595. question = this.zwinputText.trim()
  1596. }
  1597. let mock = false
  1598. if (question === '帮我在萧山区推荐一宗31亩左右的工业用地') {
  1599. mock = true
  1600. }
  1601. this.interval = setInterval(
  1602. () => {
  1603. if (this.activeIndex < this.steps.length - 1) {
  1604. this.activeIndex = this.activeIndex + 1
  1605. }
  1606. },
  1607. mock ? 1000 : 5000
  1608. )
  1609. this.querQuestion = question
  1610. this.summary = ''
  1611. this.xgdk = []
  1612. this.activeIndex = 0
  1613. this.hintText = '思考中...'
  1614. this.messages.push({
  1615. id: uuid(),
  1616. content: question,
  1617. source: 'user',
  1618. timestamp: new Date().getTime()
  1619. })
  1620. //清空输入框文字
  1621. // this.inputText = "";
  1622. //发送请求
  1623. //建立SSE连接
  1624. this.loading = true
  1625. this.startTime = new Date().getTime()
  1626. if (mock) {
  1627. setTimeout(() => {
  1628. this.mockSend()
  1629. }, 3000)
  1630. return
  1631. }
  1632. this.checkInterval = setInterval(() => {
  1633. this.checkTimeOut()
  1634. }, this.gInterval)
  1635. // 建立连接
  1636. // let eventSource = new EventSource(
  1637. // `${window.ApplicationConfig.subscribeUrl}${this.inputText.trim()}`
  1638. // );
  1639. if (!this.ctrlAbout) {
  1640. this.ctrlAbout = new AbortController()
  1641. }
  1642. //todo
  1643. const signal = this.ctrlAbout.signal
  1644. await fetchEventSource(window.ApplicationConfig.subscribeUrl, {
  1645. method: 'POST',
  1646. openWhenHidden: true,
  1647. headers: {
  1648. 'Content-Type': 'application/json'
  1649. },
  1650. body: JSON.stringify({
  1651. data: question,
  1652. history: this.histories.toArray().flat() || []
  1653. }),
  1654. signal: signal,
  1655. async onmessage(msg) {
  1656. const { data } = msg
  1657. if (data) {
  1658. that.handleData({ data: data }, question)
  1659. }
  1660. },
  1661. onerror(err) {
  1662. console.log('请求报错--')
  1663. that.checkTimeOut()
  1664. }
  1665. }).catch((err) => {
  1666. console.log(err)
  1667. console.log('请求报错:' + err)
  1668. that.checkTimeOut()
  1669. })
  1670. }, 500),
  1671. mockSend() {
  1672. const length = this.mockData.summary.length
  1673. const lastRes = this.hzData[this.hzData.length - 1]
  1674. this.radarShow = false
  1675. this.loading = false
  1676. // 模拟流氏输出
  1677. let ch = 0
  1678. this.mockInterval = setInterval(() => {
  1679. if (ch <= length) {
  1680. ch = ch + Math.ceil(Math.random() * 10) + 2
  1681. if (ch > length) {
  1682. ch = length
  1683. }
  1684. lastRes.summary = this.mockData.summary.substring(0, ch)
  1685. this.$forceUpdate()
  1686. if (ch === length) {
  1687. this.showResult = true
  1688. clearInterval(this.mockInterval)
  1689. this.mockInterval = null
  1690. lastRes.loading = false
  1691. this.xgdk = this.mockData.dks
  1692. this.clearMark()
  1693. this.showXgdkCenterPoint()
  1694. // this.answer = e.data;
  1695. this.burialPoint()
  1696. }
  1697. }
  1698. }, 100)
  1699. },
  1700. handleData(e, question) {
  1701. let T = this
  1702. if (e.data != '[FINISH]' && e.data != '[DONE]') {
  1703. const responseData = JSON.parse(e.data)
  1704. const responses = responseData['agent_responses']
  1705. console.log('responses: ', responses)
  1706. const lastRes = responses[responses.length - 1]
  1707. var lastUpRes = null
  1708. responses.forEach((item, index) => {
  1709. if (
  1710. item.exec_res &&
  1711. typeof item.exec_res === 'string' &&
  1712. item.exec_res.indexOf('\n```json\n') > -1
  1713. ) {
  1714. lastUpRes = responses[index]
  1715. console.log('lastUpRes: ', lastUpRes)
  1716. }
  1717. })
  1718. const user_request = responseData.user_request
  1719. const conversationId = lastRes['agent_id']
  1720. let message = T.messages.find(({ id }) => id === conversationId)
  1721. const executed = lastRes['executed']
  1722. const agentName = lastRes['agent_name']
  1723. const agentNameCn = lastRes['agent_name_cn']
  1724. const execRes = lastRes['exec_res']
  1725. const lastChoice = lastRes.choices[lastRes.choices.length - 1]
  1726. const choiceId = lastChoice['choice_id']
  1727. let choiceMessage = T.messages.find(({ id }) => id === choiceId)
  1728. if (window.ApplicationConfig.aiAgent.indexOf(agentName) >= 0) {
  1729. if (message) {
  1730. if (lastChoice.role === 'assistant' && !lastChoice.history) {
  1731. }
  1732. if (
  1733. agentName != 'summary' &&
  1734. lastChoice.role === 'assistant' &&
  1735. !executed
  1736. ) {
  1737. T.loading = false
  1738. T.summary = lastChoice.content
  1739. T.hzData.forEach((item, index) => {
  1740. if (index == T.hzData.length - 1) {
  1741. T.hzData[index].summary = lastChoice.content
  1742. T.$forceUpdate()
  1743. }
  1744. })
  1745. }
  1746. if (agentName === 'summary' && executed && execRes) {
  1747. // T.summary = execRes;
  1748. T.showResult = true
  1749. T.radarShow = false
  1750. T.loading = false
  1751. if (lastUpRes) {
  1752. var exec_res = lastUpRes.exec_res
  1753. .replaceAll('\n```json\n', '')
  1754. .replaceAll('\n```\n', '')
  1755. exec_res = JSON.parse(exec_res)
  1756. var dk = exec_res
  1757. // dk.sort(function (a, b) {
  1758. // return b.comprehensive_score - a.comprehensive_score;
  1759. // });
  1760. console.log('dk: ', dk)
  1761. T.xgdk = dk
  1762. T.clearMark()
  1763. T.showXgdkCenterPoint()
  1764. T.answer = e.data
  1765. T.burialPoint()
  1766. } else {
  1767. T.xgdk = []
  1768. T.clearMark()
  1769. }
  1770. T.activeIndex = T.steps.length - 1
  1771. // T.hintText = "检索完成";
  1772. T.hzData.forEach((item, index) => {
  1773. if (index == T.hzData.length - 1) {
  1774. T.hzData[index].summary = execRes
  1775. T.hzData[index].loading = false
  1776. T.zwinputText = ''
  1777. }
  1778. })
  1779. clearInterval(T.checkInterval)
  1780. }
  1781. } else {
  1782. T.messages.push({
  1783. id: conversationId,
  1784. content: '',
  1785. source: 'ai',
  1786. loading: true,
  1787. timestamp: new Date().getTime()
  1788. })
  1789. }
  1790. }
  1791. } else {
  1792. if (e.data == '[FINISH]') {
  1793. console.log('SSE连接关闭')
  1794. T.count = 0
  1795. if (T.eventSource) {
  1796. T.eventSource.close()
  1797. }
  1798. if (T.interval) {
  1799. clearInterval(T.interval)
  1800. }
  1801. T.messages.forEach((item, index) => {
  1802. if (item.loading) {
  1803. T.messages.splice(index, 1)
  1804. }
  1805. })
  1806. T.loading = false
  1807. T.addHistory(question, T.messages[T.messages.length - 1].content)
  1808. }
  1809. }
  1810. },
  1811. /**
  1812. * 添加多轮对话效果
  1813. * @param question
  1814. * @param ans
  1815. */
  1816. addHistory(question, ans) {
  1817. this.histories.enqueue([
  1818. {
  1819. type: 1,
  1820. data: question
  1821. },
  1822. {
  1823. type: 2,
  1824. data: ans
  1825. }
  1826. ])
  1827. },
  1828. calcRadarScan() {
  1829. const { offsetHeight, offsetWidth } = document.body
  1830. let width = offsetWidth - 488
  1831. if (width > offsetHeight) {
  1832. width = offsetHeight
  1833. this.radarScanStyle = {
  1834. width: offsetHeight + 'px',
  1835. height: offsetHeight + 'px',
  1836. top: 0,
  1837. left: (offsetWidth - 488 - width) / 2 + 488 + 'px'
  1838. }
  1839. } else {
  1840. this.radarScanStyle = {
  1841. width: width + 'px',
  1842. height: width + 'px',
  1843. left: '488px',
  1844. top: (offsetHeight - width) / 2 + 'px'
  1845. }
  1846. }
  1847. }
  1848. }
  1849. }
  1850. </script>
  1851. <style lang="scss" scoped>
  1852. .ivu-spin-fix {
  1853. border-radius: 10px;
  1854. position: relative;
  1855. height: 200px;
  1856. }
  1857. .industria-land-detail {
  1858. width: 100%;
  1859. position: relative;
  1860. height: 100%;
  1861. .map-content {
  1862. position: absolute;
  1863. width: 100%;
  1864. top: 0px;
  1865. height: calc(100% - 0px);
  1866. .content {
  1867. width: 100%;
  1868. height: 100%;
  1869. position: relative;
  1870. .map {
  1871. width: 100%;
  1872. z-index: 10;
  1873. height: 100%;
  1874. .radar-scan-an {
  1875. position: absolute;
  1876. left: 488px;
  1877. z-index: 1001;
  1878. height: 904px;
  1879. width: 904px;
  1880. //top: 100px;
  1881. }
  1882. }
  1883. .right-tool {
  1884. display: flex;
  1885. position: absolute;
  1886. top: 20px;
  1887. right: 20px;
  1888. z-index: 21;
  1889. .layer-container {
  1890. .layer-panel {
  1891. height: 100%;
  1892. cursor: pointer;
  1893. width: 130px;
  1894. height: 38px;
  1895. background: #ffffff;
  1896. border-radius: 8px;
  1897. display: flex;
  1898. justify-content: center;
  1899. align-items: center;
  1900. .img {
  1901. width: 25px;
  1902. margin-right: 8px;
  1903. height: 25px;
  1904. }
  1905. span {
  1906. font-family: Alibaba PuHuiTi 2;
  1907. font-weight: normal;
  1908. font-size: 16px;
  1909. color: #333333;
  1910. }
  1911. .c {
  1912. color: #fff;
  1913. }
  1914. }
  1915. .checked {
  1916. background: #2879e7;
  1917. }
  1918. }
  1919. .c {
  1920. margin-right: 20px;
  1921. }
  1922. .layer-content-border {
  1923. position: absolute;
  1924. right: 135px;
  1925. top: 0px;
  1926. padding: 0px 10px;
  1927. overflow-y: auto;
  1928. z-index: 99;
  1929. .layer-content {
  1930. z-index: 99;
  1931. background: #ffffff;
  1932. border: 1px solid #e4e7ea;
  1933. border-radius: 8px;
  1934. padding: 10px 20px;
  1935. max-height: 755px;
  1936. box-shadow: 0px 6px 5px 0px rgba(194, 210, 237, 0.3);
  1937. cursor: pointer;
  1938. width: 250px;
  1939. border-radius: 5px;
  1940. z-index: 1;
  1941. .item {
  1942. width: 100%;
  1943. .name {
  1944. color: #333;
  1945. font-size: 18px;
  1946. font-weight: bold;
  1947. }
  1948. .checkbox {
  1949. // color:#6dcff6;
  1950. color: #333;
  1951. margin-left: 35px;
  1952. font-size: 16px;
  1953. cursor: pointer;
  1954. }
  1955. .ivu-checkbox-inner {
  1956. margin-right: 8px;
  1957. cursor: pointer;
  1958. background-color: transparent;
  1959. border: 1px solid #2879e7;
  1960. }
  1961. }
  1962. }
  1963. }
  1964. }
  1965. .legend-panel {
  1966. position: absolute;
  1967. right: 17px;
  1968. width: 168px;
  1969. // height: 360px;
  1970. background: #ffffff;
  1971. border-radius: 10px;
  1972. cursor: pointer;
  1973. padding: 0px 12px 14px 10px;
  1974. border-radius: 10px;
  1975. background: rgba(255, 255, 255, 1);
  1976. bottom: 21px;
  1977. z-index: 19;
  1978. .name-panel {
  1979. padding: 10px 0;
  1980. display: flex;
  1981. align-items: center;
  1982. justify-content: space-between;
  1983. //border-bottom: 1px solid #eceef1;
  1984. .name {
  1985. font-family: Microsoft YaHei;
  1986. font-weight: bold;
  1987. color: #000;
  1988. font-size: 16px;
  1989. }
  1990. .img {
  1991. width: 16px;
  1992. height: 16px;
  1993. }
  1994. }
  1995. .layer-legend {
  1996. width: 100%;
  1997. height: calc(100% - 62px);
  1998. .item {
  1999. list-style: none;
  2000. display: flex;
  2001. flex-direction: column;
  2002. align-items: center;
  2003. font-family: Microsoft YaHei;
  2004. font-weight: 400;
  2005. font-size: 14px;
  2006. color: #333333;
  2007. margin-bottom: 10px;
  2008. i {
  2009. display: inline-block;
  2010. border: 1px solid transparent;
  2011. width: 20px;
  2012. height: 16px;
  2013. margin-top: 2px;
  2014. border-radius: 2px;
  2015. margin-right: 8px;
  2016. }
  2017. .label {
  2018. width: 100%;
  2019. font-size: 14px;
  2020. font-family: Microsoft YaHei;
  2021. font-weight: 400;
  2022. color: #333333;
  2023. display: flex;
  2024. }
  2025. .c {
  2026. font-weight: bold;
  2027. flex-direction: column;
  2028. }
  2029. .zl {
  2030. display: flex;
  2031. flex-direction: row;
  2032. width: 100%;
  2033. margin-top: 10px;
  2034. }
  2035. }
  2036. .item:last-child {
  2037. margin-bottom: 0px;
  2038. }
  2039. }
  2040. }
  2041. .topdiv {
  2042. position: absolute;
  2043. top: 10px;
  2044. z-index: 100;
  2045. left: 13px;
  2046. width: 35%;
  2047. .m-textarea-panel {
  2048. width: 100%;
  2049. height: 150px;
  2050. background: #ffffff;
  2051. position: relative;
  2052. padding: 17px 0px 0px 19px;
  2053. box-shadow: 0px 8px 16px 1px rgba(0, 57, 124, 0.2);
  2054. border-radius: 16px 16px 16px 16px;
  2055. border: 1px solid #4E69FF;
  2056. textarea {
  2057. border: none;
  2058. resize: none;
  2059. width: calc(100% - 60px);
  2060. font-weight: normal;
  2061. font-size: 18px;
  2062. height: 100%;
  2063. &:focus-visible {
  2064. outline: none;
  2065. }
  2066. &::placeholder {
  2067. font-family: Microsoft YaHei;
  2068. font-weight: bold;
  2069. font-size: 18px;
  2070. color: #6A7177;
  2071. }
  2072. }
  2073. }
  2074. }
  2075. .left-panel {
  2076. width: 486px;
  2077. padding: 26px 29px 32px 31px;
  2078. z-index: 11;
  2079. height: 100%;
  2080. position: absolute;
  2081. left: 0;
  2082. top: 0;
  2083. // background: linear-gradient(-30deg, #d6e8fb, #ffffff);
  2084. background-color: #fff;
  2085. overflow-y: auto;
  2086. .logo {
  2087. font-family: REEJI-FlashSansN95;
  2088. font-weight: 900;
  2089. font-size: 28px;
  2090. color: #333333;
  2091. line-height: 36px;
  2092. margin-bottom: 31px;
  2093. height: 30px;
  2094. }
  2095. .desc {
  2096. font-family: Microsoft YaHei;
  2097. font-weight: 400;
  2098. font-size: 16px;
  2099. color: #333333;
  2100. }
  2101. .hint {
  2102. font-family: Microsoft YaHei;
  2103. font-weight: 400;
  2104. font-size: 16px;
  2105. color: #2879e7;
  2106. margin-bottom: 30px;
  2107. margin-top: 40px;
  2108. }
  2109. .hot-question-item {
  2110. display: flex;
  2111. margin-bottom: 20px;
  2112. img {
  2113. width: 32px;
  2114. height: 32px;
  2115. margin-right: 11px;
  2116. }
  2117. .right-nr {
  2118. width: calc(100% - 43px);
  2119. cursor: pointer;
  2120. padding: 17px 32px 16px 20px;
  2121. background: linear-gradient(90deg, #c7dcf8, #e8eafd);
  2122. border-radius: 10px;
  2123. font-family: PingFang SC;
  2124. font-weight: 500;
  2125. font-size: 14px;
  2126. color: #333333;
  2127. }
  2128. .right-nr:hover {
  2129. border: 1px solid #2879e7;
  2130. }
  2131. }
  2132. .diver44 {
  2133. height: 44px;
  2134. }
  2135. .m-textarea-panel {
  2136. width: 100%;
  2137. height: 105px;
  2138. background: #ffffff;
  2139. border-radius: 10px;
  2140. position: relative;
  2141. padding: 17px 0px 0px 19px;
  2142. textarea {
  2143. border: none;
  2144. resize: none;
  2145. width: calc(100% - 60px);
  2146. font-weight: normal;
  2147. font-size: 16px;
  2148. height: 100%;
  2149. &:focus-visible {
  2150. outline: none;
  2151. }
  2152. &::placeholder {
  2153. font-family: Microsoft YaHei;
  2154. font-weight: 400;
  2155. font-size: 14px;
  2156. color: #999999;
  2157. }
  2158. }
  2159. .btn {
  2160. width: 40px;
  2161. height: 40px;
  2162. position: absolute;
  2163. right: 17px;
  2164. cursor: pointer;
  2165. bottom: 14px;
  2166. display: flex;
  2167. align-items: center;
  2168. justify-content: center;
  2169. background: linear-gradient(90deg, #5c62ea, #517de2);
  2170. border-radius: 20px;
  2171. img {
  2172. width: 20px;
  2173. height: 20px;
  2174. }
  2175. }
  2176. }
  2177. .back-icon {
  2178. position: absolute;
  2179. top: 26px;
  2180. right: 2px;
  2181. width: 28px;
  2182. height: 28px;
  2183. background: url("~@/assets/image/back-icon.png") no-repeat center;
  2184. background-size: 100% 100%;
  2185. cursor: pointer;
  2186. }
  2187. .title {
  2188. // height: 59px;
  2189. font-family: REEJI-FlashSansN95;
  2190. font-weight: bold;
  2191. font-size: 20px;
  2192. color: #212121;
  2193. cursor: pointer;
  2194. line-height: 36px;
  2195. margin-bottom: 36px;
  2196. }
  2197. .jsz {
  2198. margin: 0 0px 17px 0px;
  2199. display: flex;
  2200. height: 32px;
  2201. align-items: center;
  2202. img {
  2203. width: 32px;
  2204. margin-right: 14px;
  2205. height: 32px;
  2206. }
  2207. font-family: Microsoft YaHei;
  2208. font-weight: bold;
  2209. font-size: 18px;
  2210. color: #2879e7;
  2211. }
  2212. .steps {
  2213. display: flex;
  2214. margin-bottom: 41px;
  2215. padding-left: 7px;
  2216. .item {
  2217. display: flex;
  2218. cursor: pointer;
  2219. .name-panel {
  2220. display: flex;
  2221. flex-direction: column;
  2222. .icon {
  2223. height: 36px;
  2224. width: 36px;
  2225. margin: 0px 12px;
  2226. margin-bottom: 12px;
  2227. }
  2228. .name {
  2229. width: 64px;
  2230. font-family: Microsoft YaHei;
  2231. font-weight: bold;
  2232. font-size: 16px;
  2233. color: #333333;
  2234. }
  2235. .c {
  2236. color: #666666;
  2237. }
  2238. }
  2239. .line {
  2240. width: 60px;
  2241. height: 2px;
  2242. margin-top: 17px;
  2243. background: #bbd4f0;
  2244. }
  2245. .checked {
  2246. background: #10d295;
  2247. }
  2248. }
  2249. }
  2250. .tab-panel {
  2251. padding-left: 3px;
  2252. display: flex;
  2253. .item {
  2254. display: flex;
  2255. margin-right: 48px;
  2256. cursor: pointer;
  2257. flex-direction: column;
  2258. .name {
  2259. width: 120px;
  2260. height: 20px;
  2261. font-family: Microsoft YaHei;
  2262. font-weight: 400;
  2263. font-size: 20px;
  2264. color: #465d7c;
  2265. line-height: 36px;
  2266. }
  2267. .selected {
  2268. font-weight: bold;
  2269. color: #333333;
  2270. }
  2271. .line {
  2272. margin-top: 20px;
  2273. width: 116px;
  2274. height: 6px;
  2275. background: url("~@/assets/image/cyyd/tab-select.png") no-repeat center;
  2276. background-size: 100% 100%;
  2277. }
  2278. }
  2279. }
  2280. .summary-content {
  2281. display: flex;
  2282. .summary-icon {
  2283. display: inline-block;
  2284. width: 32px;
  2285. height: 32px;
  2286. background: #FFFFFF;
  2287. border: 1px solid #D5E3FF;
  2288. border-radius: 50%;
  2289. margin-right: 5px;
  2290. flex-shrink: 0;
  2291. img {
  2292. width: 100%;
  2293. height: 100%;
  2294. }
  2295. }
  2296. }
  2297. .tab-content {
  2298. width: 100%;
  2299. height: calc(100% - 260px);
  2300. position: relative;
  2301. margin: 31px 0px 28px 5px;
  2302. font-family: Microsoft YaHei;
  2303. font-weight: 400;
  2304. line-height: 30px;
  2305. font-size: 16px;
  2306. color: #666666;
  2307. .spin {
  2308. margin: 31px 0px 28px 5px;
  2309. font-family: Microsoft YaHei;
  2310. font-weight: 400;
  2311. line-height: 30px;
  2312. height: 100px;
  2313. display: flex;
  2314. font-size: 16px;
  2315. justify-content: center;
  2316. align-items: center;
  2317. color: #666666;
  2318. }
  2319. .btns-panel {
  2320. display: flex;
  2321. justify-content: flex-end;
  2322. height: 28px;
  2323. align-items: center;
  2324. padding-left: 2px;
  2325. margin: 10px 0;
  2326. .left-btn {
  2327. display: flex;
  2328. height: 28px;
  2329. display: none;
  2330. align-items: center;
  2331. .icon {
  2332. width: 20px;
  2333. height: 20px;
  2334. }
  2335. .diver {
  2336. width: 11px;
  2337. height: 28px;
  2338. }
  2339. .alias {
  2340. font-family: Microsoft YaHei;
  2341. font-weight: 400;
  2342. font-size: 16px;
  2343. color: #465d7c;
  2344. margin-right: 32px;
  2345. }
  2346. }
  2347. .right-btn {
  2348. display: flex;
  2349. height: 28px;
  2350. align-items: center;
  2351. .zw {
  2352. width: 64px;
  2353. height: 28px;
  2354. cursor: pointer;
  2355. text-align: center;
  2356. line-height: 28px;
  2357. background: rgba(255, 255, 255, 0.5);
  2358. border-radius: 5px;
  2359. font-family: Microsoft YaHei;
  2360. font-weight: 400;
  2361. font-size: 16px;
  2362. margin-right: 7px;
  2363. color: #4e8de2;
  2364. }
  2365. .zw:hover {
  2366. border: 1px solid #4e8de2;
  2367. }
  2368. .checked {
  2369. border: 1px solid #4e8de2;
  2370. }
  2371. .feek {
  2372. width: 100px;
  2373. background: #be0d0a;
  2374. margin-right: 20px;
  2375. border: 1px solid #be0d0a;
  2376. color: white;
  2377. }
  2378. .feek:hover {
  2379. border: 1px solid #be0d0a;
  2380. }
  2381. .icon {
  2382. width: 20px;
  2383. height: 20px;
  2384. }
  2385. }
  2386. }
  2387. }
  2388. .textarea-panel {
  2389. margin: 28px 3px 0px 3px;
  2390. width: 424px;
  2391. height: 90px;
  2392. background: #ffffff;
  2393. position: absolute;
  2394. bottom: 26px;
  2395. padding: 18px 0px 0px 19px;
  2396. box-shadow: 0px 6px 12px 1px rgba(11, 53, 103, 0.08);
  2397. border-radius: 16px 16px 16px 16px;
  2398. border: 1px solid #E5E6EA;
  2399. textarea {
  2400. border: none;
  2401. resize: none;
  2402. width: calc(100% - 60px);
  2403. font-weight: normal;
  2404. font-size: 18px;
  2405. &:focus-visible {
  2406. outline: none;
  2407. }
  2408. &::placeholder {
  2409. font-family: Microsoft YaHei;
  2410. font-size: 20px;
  2411. color: #A7AEB4;
  2412. }
  2413. }
  2414. .btn {
  2415. width: 40px;
  2416. height: 40px;
  2417. position: absolute;
  2418. right: 17px;
  2419. cursor: pointer;
  2420. bottom: 14px;
  2421. display: flex;
  2422. align-items: center;
  2423. justify-content: center;
  2424. background: linear-gradient(124deg, #505DFF 0%, #418CFF 100%);
  2425. border-radius: 10px 10px 10px 10px;
  2426. img {
  2427. width: 20px;
  2428. height: 20px;
  2429. }
  2430. }
  2431. }
  2432. .xg-title {
  2433. height: 20px;
  2434. margin-top: 28px;
  2435. display: flex;
  2436. align-items: center;
  2437. margin-bottom: 22px;
  2438. img {
  2439. width: 20px;
  2440. margin-right: 11px;
  2441. height: 20px;
  2442. cursor: pointer;
  2443. }
  2444. .name {
  2445. font-family: Microsoft YaHei;
  2446. font-weight: bold;
  2447. font-size: 18px;
  2448. margin-right: 17px;
  2449. color: #333333;
  2450. }
  2451. }
  2452. .xg-des {
  2453. margin-bottom: 10px;
  2454. }
  2455. .table-panel {
  2456. padding-bottom: 20px;
  2457. .th {
  2458. height: 40px;
  2459. background: #ffffff;
  2460. border-radius: 10px;
  2461. margin-bottom: 10px;
  2462. display: flex;
  2463. .it {
  2464. flex: 1.2;
  2465. font-family: Microsoft YaHei;
  2466. font-weight: 400;
  2467. font-size: 14px;
  2468. cursor: pointer;
  2469. color: #465d7c;
  2470. padding: 0px 3px;
  2471. height: 40px;
  2472. text-align: center;
  2473. line-height: 40px;
  2474. }
  2475. .blue {
  2476. font-family: Microsoft YaHei;
  2477. font-weight: 400;
  2478. font-size: 14px;
  2479. color: #2879e7;
  2480. }
  2481. .xh {
  2482. flex: 0.8;
  2483. }
  2484. .text {
  2485. flex: 1.5;
  2486. }
  2487. }
  2488. .hintText {
  2489. margin-top: 18px;
  2490. }
  2491. .tr {
  2492. display: flex;
  2493. border-radius: 2px;
  2494. cursor: pointer;
  2495. padding: 21px 0px 19px 0px;
  2496. border-bottom: 1px solid rgba(255, 255, 255, 0.5);
  2497. align-items: center;
  2498. .it {
  2499. flex: 1.2;
  2500. text-align: center;
  2501. padding: 0px 3px;
  2502. font-family: Microsoft YaHei;
  2503. font-weight: 400;
  2504. font-size: 14px;
  2505. color: #465d7c;
  2506. display: flex;
  2507. justify-content: center;
  2508. align-items: center;
  2509. .info {
  2510. cursor: pointer;
  2511. display: flex;
  2512. justify-content: center;
  2513. // padding: 6px 0px;
  2514. width: 20px;
  2515. height: 20px;
  2516. font-family: Microsoft YaHei;
  2517. font-weight: 400;
  2518. font-size: 14px;
  2519. color: #2879e7;
  2520. }
  2521. }
  2522. .c:hover {
  2523. cursor: pointer;
  2524. color: #2879e7;
  2525. }
  2526. .xh {
  2527. flex: 0.8;
  2528. }
  2529. .text {
  2530. flex: 1.5;
  2531. }
  2532. }
  2533. .tr:hover {
  2534. background: white;
  2535. border-radius: 10px;
  2536. }
  2537. .checked {
  2538. background: white;
  2539. border-radius: 5px;
  2540. }
  2541. }
  2542. }
  2543. }
  2544. }
  2545. }
  2546. </style>
  2547. <style>
  2548. @import "~leaflet/dist/leaflet.css";
  2549. @import "~leaflet.markercluster/dist/MarkerCluster.css";
  2550. @import "~leaflet.markercluster/dist/MarkerCluster.Default.css";
  2551. .leaflet-control-attribution {
  2552. margin: 10px !important;
  2553. border-radius: 8px;
  2554. height: 30%;
  2555. padding: 5px;
  2556. }
  2557. </style>
  2558. <style lang="scss">
  2559. .info-modal {
  2560. .ivu-modal-content {
  2561. overflow: hidden;
  2562. width: 100%;
  2563. height: 200px;
  2564. .ivu-modal-close .ivu-icon-ios-close {
  2565. display: none;
  2566. }
  2567. .ivu-modal-header {
  2568. display: none;
  2569. }
  2570. .ivu-modal-body {
  2571. width: 100%;
  2572. height: 100%;
  2573. padding: 20px;
  2574. display: flex;
  2575. flex-direction: column;
  2576. .input {
  2577. width: 100%;
  2578. height: calc(100% - 40px);
  2579. border-color: transparent;
  2580. }
  2581. textarea {
  2582. width: 100%;
  2583. border: none;
  2584. resize: none;
  2585. font-weight: normal;
  2586. line-height: 26px;
  2587. height: 100%;
  2588. background: transparent;
  2589. font-size: 18px;
  2590. &:focus-visible {
  2591. outline: none;
  2592. }
  2593. &::placeholder {
  2594. font-family: Alibaba PuHuiTi 2;
  2595. font-weight: normal;
  2596. font-size: 18px;
  2597. color: #acb1c1;
  2598. }
  2599. }
  2600. .bottom {
  2601. height: 40px;
  2602. display: flex;
  2603. justify-content: space-between;
  2604. .name {
  2605. color: #666;
  2606. cursor: pointer;
  2607. font-size: 16px;
  2608. }
  2609. .send-btn {
  2610. cursor: pointer;
  2611. width: 110px;
  2612. position: absolute;
  2613. right: 33px;
  2614. bottom: 20px;
  2615. display: flex;
  2616. align-items: center;
  2617. justify-content: center;
  2618. height: 40px;
  2619. background: linear-gradient(90deg, #5c62ea, #517de2);
  2620. border-radius: 20px;
  2621. .icon {
  2622. width: 20px;
  2623. height: 20px;
  2624. margin-right: 6px;
  2625. }
  2626. font-family: Alibaba PuHuiTi 2;
  2627. font-weight: normal;
  2628. font-size: 16px;
  2629. color: #ffffff;
  2630. }
  2631. .send-btn:hover {
  2632. background: #5c62ea;
  2633. }
  2634. }
  2635. }
  2636. }
  2637. }
  2638. .dkitemchecked {
  2639. border: 1px solid #007bff;
  2640. }
  2641. .dkitem {
  2642. display: flex;
  2643. align-items: center;
  2644. margin-bottom: 20px;
  2645. padding: 10px;
  2646. background-color: #f8f9fd;
  2647. border-radius: 8px;
  2648. .number {
  2649. width: 30px;
  2650. height: 30px;
  2651. background-color: #007bff;
  2652. color: #fff;
  2653. display: flex;
  2654. justify-content: center;
  2655. align-items: center;
  2656. border-radius: 50%;
  2657. margin-right: 10px;
  2658. }
  2659. .content {
  2660. flex: 1;
  2661. }
  2662. .content h3 {
  2663. margin: 0;
  2664. font-size: 16px;
  2665. }
  2666. .content p {
  2667. margin: 5px 0 0;
  2668. font-size: 14px;
  2669. color: #666;
  2670. }
  2671. }
  2672. </style>
  2673. <style>
  2674. .point-div-icon {
  2675. /*width: 36px !important;
  2676. height: 52px !important; */
  2677. width: 36px !important;
  2678. height: 42px !important;
  2679. text-align: center !important;
  2680. font-size: 14px;
  2681. padding-top: 8px;
  2682. color: white;
  2683. font-weight: 400;
  2684. cursor: pointer;
  2685. background: url("~@/assets/image/staticImage/icon-red.png");
  2686. background-size: cover;
  2687. }
  2688. .point-div-icon:hover {
  2689. width: 36px !important;
  2690. height: 42px !important;
  2691. background: url("~@/assets/image/staticImage/icon-blue.png");
  2692. background-size: cover;
  2693. }
  2694. .highlight-div-icon {
  2695. width: 36px !important;
  2696. height: 42px !important;
  2697. text-align: center !important;
  2698. font-size: 14px;
  2699. padding-top: 8px;
  2700. color: white;
  2701. font-weight: 400;
  2702. cursor: pointer;
  2703. background: url("~@/assets/image/staticImage/icon-blue.png");
  2704. background-size: cover;
  2705. }
  2706. </style>