From 0ddfab15b32dc054464d75c695999fa76c3b9b78 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期五, 03 一月 2025 17:33:50 +0800 Subject: [PATCH] 1. 卫星遥测数据的融合 --- src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt | 181 +++++++++++++++++++++++++++++++++++++------- 1 files changed, 150 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt index e18a148..0986058 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt @@ -3,20 +3,22 @@ import com.flightfeather.uav.common.GridLat import com.flightfeather.uav.common.GridLng import com.flightfeather.uav.common.utils.MapUtil -import com.flightfeather.uav.lightshare.bean.BaseResponse -import com.flightfeather.uav.lightshare.bean.GridVo +import com.flightfeather.uav.lightshare.bean.* import com.flightfeather.uav.lightshare.service.EPWModelService import com.flightfeather.uav.lightshare.service.RealTimeDataService import com.flightfeather.uav.model.epw.EPWGridModel -import com.flightfeather.uav.model.epw.EPWModel import com.flightfeather.uav.socket.eunm.UWDeviceType import org.springframework.stereotype.Service -import kotlin.math.PI +import kotlin.math.* @Service class EPWModelServiceImpl( private val realTimeDataService: RealTimeDataService, ) : EPWModelService { + + companion object { + private const val LEN = 3// 鏍规嵁椋庡悜缃戞牸鍚戝鎷撳睍鍦堟暟 + } val epwModel = EPWGridModel() @@ -34,6 +36,60 @@ if (gridType == 'f') return BaseResponse(false) val points = mutableListOf<GridVo>() + + // 鑾峰彇鍏ㄩ儴鏁版嵁璁$畻骞冲潎椋庡悜 + val dataList = mutableListOf<DataVo>() + var page = 1 + var totalPage = -1 + //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊� + var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰 + var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰 + var c = 0//椋庡悜鏁版嵁璁℃暟 + var windDirection = .0 // 骞冲潎椋庡悜瑙掑害 + while (totalPage == -1 || page <= totalPage) { + realTimeDataService.getSecondData(null, deviceCode, startTime, endTime, 0, page, 5000).apply { + if (totalPage == -1) { + totalPage = head?.totalPage ?: 0 + } + val list = data ?: emptyList() + + // FIXME: 2021/7/13 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙� + list.forEach { + if (it.lng == 0.0 && it.lat == 0.0) { + it.lng = GridLng + it.lat = GridLat + } + + val r = Math.toRadians(it.values?.get(16)?.factorData ?: .0) + u += sin(r) + v += cos(r) + c++ + } + + dataList.addAll(list) + page++ + } + } + + if (c != 0) { + val avgU = u / c + val avgV = v / c + var a = atan(avgU / avgV) + a = Math.toDegrees(a) + /** + * avgU>0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳 + * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳 + */ + a += if (avgV > 0) { + if (avgU > 0) 0 else 360 + } else { + 180 + } + windDirection = a + } + // 鏍规嵁涓嶅悓绫诲瀷锛岀‘瀹氫笉鍚岀殑缃戞牸鐢熸垚鏂瑰紡锛屽緱鍑虹綉鏍间腑蹇冪偣闆嗗悎(缃戞牸榛樿閲囩敤姝f柟褰�) // 璧拌埅鐩戞祴 if (gridType == '0') { @@ -42,26 +98,51 @@ // 瀹氱偣鐩戞祴 else if (gridType == '1') { // FIXME: 2021/12/6 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙� - val center = Pair(121.235813, 30.835898) + val center = Pair(GridLng, GridLat) // a.纭畾缃戞牸闀垮害瀵瑰簲鐨勫潗鏍囧樊鍊� + // FIXME: 2021/12/16 姝ゅ缃戞牸鍧愭爣鐨勮绠楁瘮杈冪畝鍗曪紝杩戜技灏嗗叾褰撲綔骞抽潰鍧愭爣鏉ュ仛锛屽悗缁彲鏀硅繘 val p1 = MapUtil.getPointByLen(center, len, PI / 2)//姝d笢鏂瑰悜锛�90掳锛夌殑鍧愭爣鐐� val p2 = MapUtil.getPointByLen(center, len, PI)//姝e崡鏂瑰悜锛�180掳锛夌殑鍧愭爣鐐� val dx = p1.first - center.first val dy = center.second - p2.second // b.纭畾鍗曡竟鏈夊灏戜釜缃戞牸(瑙勫畾鐩戞祴鐐瑰湪涓績缃戞牸鐨勪腑鐐逛笂锛屽洜姝ゅ崟杈圭綉鏍兼暟涓�瀹氫负濂囨暟) - val totalLen = 2000 // 缃戞牸鑼冨洿锛岃竟闀夸负20鍗冪背鐨勬鏂瑰舰 + val totalLen = 2000 // FIXME: 2021/12/16 缃戞牸鑼冨洿锛岃竟闀夸负20鍗冪背鐨勬鏂瑰舰 val gridNum = ((totalLen / 2 / len).toInt() - 1) * 2 + 1 // c.纭畾宸︿笂瑙掔綉鏍煎乏涓嬪拰鍙充笂鐨勪袱涓瑙掔偣鍧愭爣 + var len1 = gridNum//姘村钩鏂瑰悜缃戞牸鏁� + var width = gridNum//鍨傜洿鏂瑰悜缃戞牸鏁� //涓績鐐瑰潗鏍� - val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬 - val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞 + var g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬 + var g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞 + when (windDirection) { + in .0..90.0 -> { + g1CenterLat += LEN * dy + width += LEN + len1 += LEN + } + in 90.0..180.0 -> { + len1 += LEN + width += LEN + } + in 180.0..270.0 -> { + g1CenterLng -= LEN * dx + len1 += LEN + width += LEN + } + in 270.0..360.0 -> { + g1CenterLng -= LEN * dx + g1CenterLat += LEN * dy + len1 += LEN + width += LEN + } + } //宸︿笅鍧愭爣 val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2) //鍙充笂鍧愭爣 val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2) // d.寰楀嚭鎵�鏈夌綉鏍肩殑涓や釜瀵硅鐐瑰潗鏍� - for (x in 0 until gridNum) { - for (y in 0 until gridNum) { + for (x in 0 until len1) { + for (y in 0 until width) { points.add(GridVo("$x-$y").apply { this.lb = Pair(g1LB.first + dx * x, g1LB.second - dy * y) this.rt = Pair(g1RT.first + dx * x, g1RT.second - dy * y) @@ -72,27 +153,7 @@ } } // 璁$畻鍚勪腑蹇冪偣姹℃煋椋庨櫓鏉冮噸缁撴灉骞惰祴浜堝搴斿奖鍝嶇瓑绾� - var page = 1 - var totalPage = -1 - while (totalPage == -1 || page <= totalPage) { - realTimeDataService.getSecondData(deviceCode, startTime, endTime, 0, page, 5000).apply { - if (totalPage == -1) { - totalPage = head?.totalPage ?: 0 - } - val dataList = data ?: emptyList() - - // FIXME: 2021/7/13 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙� - dataList.forEach { - if (it.lng == 0.0 && it.lat == 0.0) { - it.lng = GridLng - it.lat = GridLat - } - } - - epwModel.execute(dataList, points, true) - page++ - } - } + epwModel.execute(dataList, points, true) val r = epwModel.outputResult() val max = mutableMapOf<String, Double>()//璁板綍姣忕鐩戞祴鍥犲瓙鐨勬渶澶у�� @@ -138,4 +199,62 @@ } return BaseResponse(true, data = points) } + + /** + * 浠ョ洃娴嬬偣涓虹綉鏍肩嚎涓婄殑涓績锛屽悜澶栨寜鐓ф鏂瑰舰杩涜鎵╂暎銆� + * 棣栧厛榛樿灞曠ず鐩戞祴鐐瑰懆鍥翠竴鍦�16涓綉鏍硷紝鐒跺悗鍐嶄互澶栧湀12涓綉鏍间负鍩虹鍚戝鎵╂暎锛屾瘡娆℃渶澶氭墿鏁d竴鍦堬紝鍒ゆ柇鏉冮噸缁撴灉锛屼繚鐣欐墍鏈夌殑楂橀闄╁拰涓闄╃綉鏍硷紝骞朵繚鐣欎袱鍦堜綆椋庨櫓缃戞牸 + * 鍏朵腑鐨勯珮銆佷腑銆佷綆椋庨櫓鍒ゆ柇渚濇嵁涓虹綉鏍兼潈閲嶅�煎搴斿綋鍓嶆渶澶у�肩殑姣斾緥锛堝垎鐣屼负66.66%鍜�33.33%锛� + */ + override fun getEpwModelResultDynamic(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> { +// if (deviceCode.length < 2) return BaseResponse(false, "璁惧缂栧彿鏍煎紡閿欒") +// // 纭畾鏁版嵁婧愮被鍨嬶紝鍖哄垎涓衡�樺畾鐐圭洃娴嬫暟鎹�欏拰鈥樼Щ鍔ㄧ洃娴嬫暟鎹袱绉嶁�� +// val gridType = when (deviceCode.substring(0, 2)) { +// UWDeviceType.UAV.value -> '0' +// UWDeviceType.VEHICLE.value -> '0' +// UWDeviceType.GRID.value -> '1' +// UWDeviceType.BOAT.value -> 'f' +// else -> 'f' +// } +// if (gridType == 'f' || gridType == '0') return BaseResponse(false, "璇ヨ澶囩被鍨嬩笉鏀寔鍔ㄦ�佺綉鏍奸闄╄绠楋紝鍙湁瀹氱偣缃戞牸鍖栬澶囧彲琛�") +// val points = mutableListOf<GridVo>() +// // FIXME: 2021/12/6 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙� +// val center = Pair(GridLng, GridLat) +// +// // a.纭畾缃戞牸闀垮害瀵瑰簲鐨勫潗鏍囧樊鍊� +// // FIXME: 2021/12/16 姝ゅ缃戞牸鍧愭爣鐨勮绠楁瘮杈冪畝鍗曪紝杩戜技灏嗗叾褰撲綔骞抽潰鍧愭爣鏉ュ仛锛屽悗缁彲鏀硅繘 +// val p1 = MapUtil.getPointByLen(center, len, PI / 2)//姝d笢鏂瑰悜锛�90掳锛夌殑鍧愭爣鐐� +// val p2 = MapUtil.getPointByLen(center, len, PI)//姝e崡鏂瑰悜锛�180掳锛夌殑鍧愭爣鐐� +// val dx = p1.first - center.first +// val dy = center.second - p2.second +// +// val grids = mutableListOf<QuadrantInfo>()// 鎵�鏈夌綉鏍� +// val outerMost = mutableMapOf<Quadrant, QuadrantInfo>()// 褰撳墠鏈�澶栧湀鐨勭綉鏍� +// // b.鍏堣绠楀唴閮ㄤ袱鍦堢殑缁撴灉 +// grids.addAll(listOf( +// // 绗竴鍦� +// QuadrantInfo(Quadrant.First, 0), +// QuadrantInfo(Quadrant.Second, 0), +// QuadrantInfo(Quadrant.Third, 0), +// QuadrantInfo(Quadrant.Fourth, 0), +// // 绗簩鍦� +// QuadrantInfo(Quadrant.First, 1), +// QuadrantInfo(Quadrant.Second, 1), +// QuadrantInfo(Quadrant.Third, 1), +// QuadrantInfo(Quadrant.Fourth, 1), +// )) +// //褰撳墠鏈�澶栧湀锛堢浜屽湀锛� +// outerMost[Quadrant.First] = grids[4] +// outerMost[Quadrant.Second] = grids[5] +// outerMost[Quadrant.Third] = grids[6] +// outerMost[Quadrant.Fourth] = grids[7] +// //涓績鐐瑰潗鏍� +// val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬 +// val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞 +// //宸︿笅鍧愭爣 +// val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2) +// //鍙充笂鍧愭爣 +// val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2) + + return BaseResponse(true) + } } \ No newline at end of file -- Gitblit v1.9.3