第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

SQL Server / C#如何找到與多邊形相交的線串的DateTime

SQL Server / C#如何找到與多邊形相交的線串的DateTime

C#
慕碼人8056858 2021-05-13 14:15:55
我正在建立一個(gè)跟蹤系統(tǒng),想找到某人何時(shí)進(jìn)入或離開某個(gè)區(qū)域(區(qū)域或?qū)樱?。我們?秒鐘的間隔收集GPS坐標(biāo),并且將它們存儲(chǔ)為經(jīng)/緯度,并與讀取日期時(shí)間一起存儲(chǔ)在“地理”列中。區(qū)域和層的地理圍欄以多邊形的形式存儲(chǔ)在“地理”列中。區(qū)域可以包含層,層可以包含子層。在圖中,T3是子層。如果有人在T3中,那么他們也在T2中。右側(cè)非常微弱的點(diǎn)集也是即將發(fā)生的情況的一個(gè)示例。人們將整天進(jìn)出區(qū)域和層級(jí)。最終結(jié)果是看到一個(gè)活動(dòng)列表上午6:00:00進(jìn)入1區(qū)在上午6:05:00進(jìn)入T2在上午7:13:12進(jìn)入T3上午7:49:32退出T3等等。有沒有辦法找到某人進(jìn)入/離開區(qū)域或?qū)拥狞c(diǎn)(圖像中的綠色圓圈),并從GPS點(diǎn)表中獲取讀取日期時(shí)間?我已經(jīng)使用STContains讓所有人都陷入了地理圍欄。我考慮過使用這種方法,通過讀取日期時(shí)間進(jìn)行排序,如果我找到一個(gè)0到1,則輸入它們,反之,則返回1到0,則它們退出。我認(rèn)為這是太多的循環(huán),希望有更好的方法。我也嘗試過STIntersection,但找不到將點(diǎn)與日期時(shí)間聯(lián)系起來的方法。如果有人靜止超過 5 秒,我將得到兩個(gè)相同的點(diǎn),并且坐標(biāo)匹配效果不佳??磥鞤BGeography C#類具有與SQL Server相同的功能??梢杂肅#代替SQL嗎?
查看完整描述

1 回答

?
白板的微信

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊

您在這里遇到了很多挑戰(zhàn),但我認(rèn)為它們都是可行的。


我認(rèn)為您已經(jīng)解決了第一個(gè)問題,即知道給定數(shù)據(jù)點(diǎn)位于哪些區(qū)域中。無論是STContains()或STIntersects()。


第二個(gè)是您實(shí)際上是在尋找基于時(shí)間的連續(xù)性集群。假設(shè)您具有可靠的數(shù)據(jù)收集,這也是可以解決的。一旦從上面獲得了一組(人,地區(qū),時(shí)間戳)元組,這就是一個(gè)空白和離島的問題。玩具解決方案如下:


IF OBJECT_ID('tempdb.dbo.#observations') IS NOT NULL

    DROP TABLE #observations;

IF OBJECT_ID('tempdb.dbo.#regions') IS NOT NULL

    DROP TABLE #regions;


CREATE TABLE #observations (

    ObservationID INT NOT NULL IDENTITY,

        CONSTRAINT PK_Observations PRIMARY KEY CLUSTERED (ObservationID),

    PersonID      INT NOT null,

    Point         GEOMETRY NOT null,

    TS            DATETIME2(0) NOT NULL CONSTRAINT DF_Observations_TS DEFAULT SYSUTCDATETIME()

);


CREATE TABLE #regions (

    RegionID INT NOT NULL IDENTITY,

        CONSTRAINT PK_Regions PRIMARY KEY CLUSTERED (RegionID),

    Area GEOMETRY NOT NULL

);


INSERT INTO #regions

(

    Area

)

VALUES

( geometry::STGeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))', 0) ),

( geometry::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 0) ),

( geometry::STGeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))', 0) );


INSERT INTO #observations

(

    PersonID ,

    Point ,

    TS

)

VALUES

(   1 ,

    geometry::Point(0.5, 0.5, 0) ,

    '2018-01-01 00:00:00'

),

(   1 ,

    geometry::Point(1.5, 1.5, 0) ,

    '2018-01-01 00:00:05'

),

(   1 ,

    geometry::Point(2.5, 2.5, 0) ,

    '2018-01-01 00:00:10'

),

(   1 ,

    geometry::Point(3.5, 3.5, 0) ,

    '2018-01-01 00:00:15'

),

(   1 ,

    geometry::Point(4.5, 4.5, 0) ,

    '2018-01-01 00:00:20'

),

(   1 ,

    geometry::Point(0.5, 0.5, 0) ,

    '2018-01-01 01:00:00'

),

(   1 ,

    geometry::Point(1.5, 1.5, 0) ,

    '2018-01-01 01:00:05'

),

(   1 ,

    geometry::Point(2.5, 2.5, 0) ,

    '2018-01-01 01:00:10'

),

(   1 ,

    geometry::Point(3.5, 3.5, 0) ,

    '2018-01-01 01:00:15'

),

(   1 ,

    geometry::Point(4.5, 4.5, 0) ,

    '2018-01-01 01:00:20'

),

(   2 ,

    geometry::Point(3.5, 3.5, 0) ,

    '2018-01-01 00:00:00'

),

(   2 ,

    geometry::Point(3.5, 3.5, 0) ,

    '2018-01-01 00:00:05'

),

(   2 ,

    geometry::Point(3.5, 3.5, 0) ,

    '2018-01-01 00:00:10'

),

(   2 ,

    geometry::Point(3.6, 3.6, 0) ,

    '2018-01-01 00:00:15'

),

(   2 ,

    geometry::Point(4.5, 4.5, 0) ,

    '2018-01-01 00:00:20'

);


WITH cte AS (

    SELECT o.ObservationID,

           o.PersonID ,

           o.TS ,

           r.RegionID,

           (DATEDIFF(SECOND, '2017-01-01', o.ts)/5) - ROW_NUMBER() OVER (PARTITION BY o.PersonID, r.RegionID ORDER BY o.ts) AS gid,

           DATEDIFF(SECOND, '2017-01-01', o.ts)/5 AS diff,

           ROW_NUMBER() OVER (PARTITION BY o.PersonID, r.RegionID ORDER BY o.ts) AS rn

    FROM #observations AS o

    JOIN #regions AS r

        ON o.Point.STIntersects(r.Area) = 1

    --JOIN #timestamps AS ts

    --    ON ts.TS = o.TS

)

SELECT cte.PersonID, cte.RegionID, MIN(ts), MAX(ts)

FROM cte

GROUP BY cte.PersonID ,

         cte.RegionID,

         cte.gid;

訣竅(如果有的話)是意識(shí)到row_number()島中每個(gè)成員的增量為1,并且對(duì)于相同的條件,(秒數(shù))/ 5也應(yīng)該增量為1。因此,對(duì)于在同一個(gè)島中具有同等資格的行,它們之間的差異應(yīng)該是恒定的。這給我們提供了方便的分組依據(jù)。


查看完整回答
反對(duì) 回復(fù) 2021-05-29
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)