Example #1
0
        //! 上报新的ARPA目标数据

        /*!
         *      \param		dwArpaID:ARPA目标ID
         *      \return		ARPA数据是否进入统计列表
         *      \remark     上报新的ARPA目标数据
         */
        bool ReportSensorArpa(long dwArpaID)
        {
            bool      bResult     = false;
            target    radarTarget = null;
            AISTarget aisTarget   = null;

            m_np.m_dicTargetCollection.TryGetValue(dwArpaID, out radarTarget);

            if (radarTarget == null)
            {
                return(false);
            }
            int nIndex = -1;

            nIndex = FindUnionAisTarget(dwArpaID, UNION_STATE_SENSOR, UNION_ASSCI | UNION_DISASSCI);
            if (nIndex != -1)
            {
                m_np.m_AISCollection.TryGetValue((int)dwArpaID, out aisTarget);
                if (aisTarget != null)
                {
                    bResult = TryUnionTarget(aisTarget, radarTarget, UNION_STATE_SENSOR, nIndex);
                }
            }
            else
            {
                float fMinRng    = 926 * 1.0f;
                long  dwMinRngID = -1;

                foreach (var item in m_np.m_AISCollection)
                {
                    if (FindUnionArpaTarget(item.Value.MMSI, UNION_STATE_SENSOR, UNION_ASSCI | UNION_DISASSCI) != -1)
                    {
                        continue;
                    }
                    tagTARGET_DIFF stTargetDiff = new tagTARGET_DIFF();
                    if (RetCurState(aisTarget, radarTarget, stTargetDiff) == UNION_ASSCI)
                    {
                        if (stTargetDiff.fRngDiff < fMinRng)
                        {
                            fMinRng    = stTargetDiff.fRngDiff;
                            dwMinRngID = item.Value.MMSI;
                        }
                    }
                    if (dwMinRngID != -1)
                    {
                        m_np.m_AISCollection.TryGetValue((int)dwMinRngID, out aisTarget);
                        bResult = TryUnionTarget(aisTarget, radarTarget, UNION_STATE_SENSOR, nIndex);
                    }
                }
            }
            return(true);
        }
Example #2
0
        //! 计算AIS和ARPA数据,返回瞬时状态

        /*!
         *      \param		lpAisTarget:AIS目标指针
         *      \param		lpArpaTarget:Arpa目标指针
         *      \return		瞬时状态
         *      \remark     计算AIS和ARPA数据,返回瞬时状态
         */
        int RetCurState(AISTarget lpAisTarget, target lpArpaTarget, tagTARGET_DIFF lpTargetDiff)
        {
            int   nCurState   = UNION_DISASSCI;
            float fRangeDist  = 0.0f;
            float fBearDiff   = 0.0f;
            float fCourseDist = 0.0f;
            float fSpeedDist  = 0.0f;

            double dAisLat = 0.0, dAisLon = 0.0, dArpaLat = 0.0, dArpaLon = 0.0;
            float  fAisSpd = 0.0f, fAisCrs = 0.0f, fArpaSpd = 0.0f, fArpaCrs = 0.0f;


            // 比较ais与arpa目标的距离、速度的偏差
            double dDistance = 0;

            dDistance = CommonFunctions.GetDistance(lpAisTarget.Latitude, lpAisTarget.Longitude, lpArpaTarget.Latitude, lpArpaTarget.Longitude);

            dDistance *= NM;
            fRangeDist = (float)dDistance;

            fSpeedDist = (float)Math.Abs((lpAisTarget.Speed - lpArpaTarget.Speed));

            //if (fAisSpd < NM && fArpaSpd < NM)
            //{
            //    fCourseDist = 0.0f;
            //}

            //if (fCourseDist > 180)
            //{
            //    fCourseDist = 360 - fCourseDist;
            //}

            if (lpTargetDiff != null)
            {
                lpTargetDiff.fRngDiff = fRangeDist;
                lpTargetDiff.fSpdDiff = fSpeedDist;
            }
            if (fRangeDist < NM && fSpeedDist < 1000)
            {
                // 瞬时状态为强联合
                nCurState = UNION_ASSCI;
            }
            else
            {
                // 瞬时状态为分离
                nCurState = UNION_DISASSCI;
            }
            return(nCurState);
        }