backLineAnalysisinfo.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. <template>
  2. <div
  3. class="ZTGlobal"
  4. style="width: 100%; padding: 1rem 1rem 0rem 1rem; color: white"
  5. >
  6. <el-row :gutter="10">
  7. <el-col :span="24">
  8. <div class="titleHeader">
  9. <span>超建筑退线面积:{{ cczmj }}平方米。</span>
  10. <br />
  11. <span v-if="TableData.length > 0">结论:超出建筑退线范围。</span>
  12. <span v-else>结论:未超出建筑退线范围。</span>
  13. </div>
  14. </el-col>
  15. </el-row>
  16. <el-row :gutter="10">
  17. <el-col :span="24">
  18. <el-table
  19. ref="table"
  20. :data="TableData"
  21. :highlight-current-row="true"
  22. @current-change="handleCurrentChange"
  23. style="width: 100%"
  24. >
  25. <el-table-column label="楼号" align="center">
  26. <template #default="{ row }">
  27. {{ row.data.find((c) => c.label == "BUILDNO").value }}
  28. </template>
  29. </el-table-column>
  30. <el-table-column label="层数" align="center">
  31. <template #default="{ row }">
  32. {{
  33. row.data.find((c) => c.label == "FLOOR")
  34. ? row.data.find((c) => c.label == "FLOOR").value
  35. : 1
  36. }}
  37. </template>
  38. </el-table-column>
  39. <el-table-column label="超出面积(㎡)" align="center">
  40. <template #default="{ row }">
  41. {{ row.ccmj }}
  42. </template>
  43. </el-table-column>
  44. </el-table>
  45. </el-col>
  46. </el-row>
  47. <el-row :gutter="10">
  48. <el-col :span="24">
  49. <el-descriptions border size="mini" :column="2">
  50. <el-descriptions-item label="用地红线">
  51. <div
  52. style="
  53. width: 4.5rem;
  54. height: 1rem;
  55. overflow: hidden;
  56. position: relative;
  57. "
  58. >
  59. <div
  60. style="
  61. position: absolute;
  62. top: 50%;
  63. left: 0;
  64. right: 0;
  65. height: 1rem; /* 实际上这里的高度被border替代了,所以可以设置为0 */
  66. transform: translateY(-50%);
  67. margin: 0; /* 去除可能的默认margin */
  68. padding: 0; /* 去除可能的默认padding */
  69. "
  70. :style="{ borderTop: '0.3rem solid #ff0000' }"
  71. ></div>
  72. </div>
  73. </el-descriptions-item>
  74. <el-descriptions-item label="建筑退线面"
  75. ><div
  76. style="width: 4.5rem; height: 100%"
  77. :style="{ 'background-color': '#7FFF009C' }"
  78. >
  79. &nbsp;
  80. </div>
  81. </el-descriptions-item>
  82. <el-descriptions-item label="道路红线">
  83. <div
  84. style="
  85. width: 4.5rem;
  86. height: 1rem;
  87. overflow: hidden;
  88. position: relative;
  89. "
  90. >
  91. <div
  92. style="
  93. position: absolute;
  94. top: 50%;
  95. left: 0;
  96. right: 0;
  97. height: 1rem; /* 实际上这里的高度被border替代了,所以可以设置为0 */
  98. transform: translateY(-50%);
  99. margin: 0; /* 去除可能的默认margin */
  100. padding: 0; /* 去除可能的默认padding */
  101. "
  102. :style="{ borderTop: '0.3rem solid #ADFF2F' }"
  103. ></div>
  104. </div>
  105. </el-descriptions-item>
  106. <el-descriptions-item label="禁止开口线">
  107. <div
  108. style="
  109. width: 4.5rem;
  110. height: 1rem;
  111. overflow: hidden;
  112. position: relative;
  113. "
  114. >
  115. <div
  116. style="
  117. position: absolute;
  118. top: 50%;
  119. left: 0;
  120. right: 0;
  121. height: 1rem; /* 实际上这里的高度被border替代了,所以可以设置为0 */
  122. transform: translateY(-50%);
  123. margin: 0; /* 去除可能的默认margin */
  124. padding: 0; /* 去除可能的默认padding */
  125. "
  126. :style="{ borderTop: '0.3rem solid #FF0000' }"
  127. ></div>
  128. </div>
  129. </el-descriptions-item>
  130. <el-descriptions-item label="道路中线(现有)">
  131. <div
  132. style="
  133. width: 4.5rem;
  134. height: 1rem;
  135. overflow: hidden;
  136. position: relative;
  137. "
  138. >
  139. <div
  140. style="
  141. position: absolute;
  142. top: 50%;
  143. left: 0;
  144. right: 0;
  145. height: 1rem; /* 实际上这里的高度被border替代了,所以可以设置为0 */
  146. transform: translateY(-50%);
  147. margin: 0; /* 去除可能的默认margin */
  148. padding: 0; /* 去除可能的默认padding */
  149. "
  150. :style="{ borderTop: '0.3rem solid #00FFFF' }"
  151. ></div>
  152. </div>
  153. </el-descriptions-item>
  154. <el-descriptions-item label="道路中线(规划)">
  155. <div
  156. style="
  157. width: 4.5rem;
  158. height: 1rem;
  159. overflow: hidden;
  160. position: relative;
  161. "
  162. >
  163. <div
  164. style="
  165. position: absolute;
  166. top: 50%;
  167. left: 0;
  168. right: 0;
  169. height: 1rem; /* 实际上这里的高度被border替代了,所以可以设置为0 */
  170. transform: translateY(-50%);
  171. margin: 0; /* 去除可能的默认margin */
  172. padding: 0; /* 去除可能的默认padding */
  173. "
  174. :style="{ borderTop: '0.3rem dashed #00FFFF' }"
  175. ></div>
  176. </div>
  177. </el-descriptions-item>
  178. </el-descriptions>
  179. </el-col>
  180. </el-row>
  181. </div>
  182. </template>
  183. <script>
  184. import {
  185. cartesian3ToWGS84,
  186. mapQuery,
  187. flatten,
  188. mercator2lonLat,
  189. undergroundMode,
  190. } from "@/utils/MapHelper/MapHelper.js";
  191. import {
  192. area,
  193. intersect,
  194. polygon,
  195. point,
  196. midpoint,
  197. difference,
  198. } from "@turf/turf";
  199. export default {
  200. data() {
  201. return {
  202. cczmj: 0,
  203. TableData: [],
  204. };
  205. },
  206. props: {
  207. info: {
  208. type: Object,
  209. default: () => {
  210. return {};
  211. },
  212. },
  213. layerid: {
  214. type: String,
  215. default: "",
  216. },
  217. lydata: {
  218. type: Object,
  219. default: () => {
  220. return {};
  221. },
  222. },
  223. lyoption: {
  224. type: Object,
  225. default: () => {
  226. return {};
  227. },
  228. },
  229. },
  230. computed: {},
  231. mounted() {
  232. debugger;
  233. this.init();
  234. },
  235. methods: {
  236. async init() {
  237. //查询当前项目建筑轮廓范围
  238. this.cczmj = 0;
  239. let jzlkList = [];
  240. if (this.info.Minfo.dataurl && this.info.Minfo.datasourcename) {
  241. if (this.info.DKBM.length > 0) {
  242. debugger;
  243. let queryByGeometryParameters = {
  244. getFeatureMode: "SQL",
  245. datasetNames: [this.info.Minfo.datasourcename + ":" + "建筑轮廓"],
  246. queryParameter: {
  247. attributeFilter:
  248. "LANDNO in ('" + this.info.DKBM.join("','") + "')",
  249. },
  250. hasGeometry: "true",
  251. };
  252. let e = await mapQuery(
  253. this.info.Minfo.dataurl + "/featureResults.json?returnContent=true",
  254. queryByGeometryParameters
  255. );
  256. if (e && e.totalCount > 0) {
  257. e.features.forEach((feature) => {
  258. let jzlk = { data: [], geometry: feature.geometry };
  259. feature.fieldNames.forEach((fieldName, i) => {
  260. debugger;
  261. let Field = e.datasetInfos
  262. ? e.datasetInfos[0].fieldInfos.find(
  263. (c) =>
  264. c.name &&
  265. c.name.toUpperCase() == fieldName.toUpperCase() &&
  266. c.name.toUpperCase().indexOf("SM") == -1
  267. )
  268. : null;
  269. if (Field) {
  270. jzlk.data.push({
  271. label: fieldName,
  272. labelCN: Field ? Field.caption : fieldName,
  273. value: feature.fieldValues[i],
  274. });
  275. }
  276. });
  277. jzlkList.push(jzlk);
  278. });
  279. } else {
  280. console.log("wushuju");
  281. }
  282. }
  283. //退线区域
  284. this.info.JZTXlayerDataList.forEach((JZTXlayerData) => {
  285. //楼体信息
  286. jzlkList.forEach((jzlkData) => {
  287. let Area = this.calculateDisjointArea(
  288. jzlkData.geometry,
  289. JZTXlayerData.geometry
  290. );
  291. let FLOOR = jzlkData.data.find((c) => c.label == "FLOOR");
  292. if (FLOOR) FLOOR = Number(FLOOR.value);
  293. else {
  294. FLOOR = 1;
  295. }
  296. debugger;
  297. jzlkData.ccmj = Area * FLOOR;
  298. if (jzlkData.ccmj > 0) {
  299. this.cczmj += jzlkData.ccmj;
  300. this.TableData.push(jzlkData);
  301. }
  302. });
  303. });
  304. } else {
  305. console.log("wushuju");
  306. }
  307. },
  308. /**
  309. * // 计算不相交面积
  310. * @param jzlkDataGeometry 建筑轮廓范围
  311. * @param JZTXlayerDataGeometry 建筑退线范围
  312. */
  313. calculateDisjointArea(jzlkDataGeometry, JZTXlayerDataGeometry) {
  314. let jzlkDataPs = [];
  315. let JZTXlayerDataPs = [];
  316. jzlkDataGeometry.points.forEach((point) => {
  317. jzlkDataPs.push([point.x, point.y]);
  318. });
  319. if (jzlkDataPs.length > 0) {
  320. jzlkDataPs.push(jzlkDataPs[0]);
  321. }
  322. JZTXlayerDataGeometry.points.forEach((point) => {
  323. JZTXlayerDataPs.push([point.x, point.y]);
  324. });
  325. var polygon1 = polygon([jzlkDataPs]);
  326. var polygon2 = polygon([JZTXlayerDataPs]);
  327. //差集
  328. let differenceion = difference(polygon1, polygon2);
  329. if (differenceion) {
  330. const areadifference = area(differenceion) * window.earthRadius;
  331. return areadifference.toFixed(2);
  332. } else {
  333. return 0;
  334. }
  335. },
  336. //选中
  337. handleCurrentChange(row) {
  338. var center = Cesium.Cartesian3.fromDegrees(
  339. row.geometry.position.x,
  340. row.geometry.position.y
  341. ); //camera视野中心点坐标
  342. var heading = Cesium.Math.toRadians(0.0);
  343. var pitch = Cesium.Math.toRadians(-55.0);
  344. var range = row.geometry.boundingBox.upper.z + 300;
  345. viewer.camera.lookAt(
  346. center,
  347. new Cesium.HeadingPitchRange(heading, pitch, range)
  348. );
  349. viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
  350. },
  351. },
  352. beforeDestroy() {},
  353. };
  354. </script>
  355. <style lang="scss">
  356. @import "@/../../zt.scss";
  357. </style>
  358. <style lang="scss" scoped>
  359. .el-card {
  360. border: 0px solid #02a7f0;
  361. }
  362. .el-form-item {
  363. margin-bottom: 0;
  364. }
  365. </style>