根據位置連接表<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />大家好
JMP可以根據位置加入(更新)表嗎?
我有一個帶坐標的點數據集和多邊形的shapefile。我想根據位置使用shapefile中的信息更新點數據表。因此,如果一個點在特定的多邊形中,它將使用多邊形的屬性更新表。
謝謝!
羅恩
Re:根據位置連接表為了進一步加快腳本速度,您可以先檢查點是否在“America”方塊中。 附加到Ian的腳本上
inAmericaRect =
功能({pMat,x,y},{默認本地},
maxX =最大值(pMat [0,3]);
minX =最小值(pMat [0,3]);
maxY =最大值(pMat [0,4]);
minY =最小值(pMat [0,4]);
if((x <= maxX)&(x> = minX)&(y <= maxY)&(y> = minY),1,0);
);
...
//美國廣場內的圓點嗎?
if(inAmericaRect(pMat,x,y)
當然,鑑於波多黎各,這可能會通過添加額外的if語句來減慢腳本速度。 我仍然認為外面有足夠的數據可以保證。 但要解決這個問題,您可以簡單地拆分波多黎各或其他島嶼,並添加一個額外的inPuertoRicoRect功能。 您可以使用world-name.jmp和world-xy.jmp對其他國家/地區進行其他過濾。 或者您可以使用coastline-Name.jmp和coastline-xy.jmp來首先確定它是否在陸地上。 但是,我確信在那時你的腳本將超出項目的範圍。
Re:根據位置連接表謝謝伊恩@ JMP ,
這比我的方法更好,速度更快。
在我的腳本中生成循環時,我注意到XY表並不是非常乾淨,並且您的方法也非常強大。(形狀ID 10的部件ID為1,3,4,5 - 跳過2)。
羅恩
Re:根據位置連接表8個半小時後,整個颶風檔案加入進來。由於大多數點都在海中,因此腳本需要一些時間來驗證它們中的每一個都不在52個狀態中的任何一個(84個多邊形)。

Re:根據位置連接表巧合的是,我只是抽出時間快速瀏覽一下。我沒有提出提高效率的要求,但僅提供用於比較目的。我沒有檢查或測試。對於您正在使用的子集,它幾乎立即運行。注意該 OS / X路徑。
NamesDefaultToHere ( 1 ) ;
清除日誌 () ;
//打開點文件 - 這包括我們想要更新的觀察
點 = 打開 ( “$ SAMPLE_DATA / Hurricanes.jmp” ) ;
點 << 刪除行 ( 點 << 得到行在哪裡 ( : 名稱 ( “姓名和身份證” ) != “NOTNAMED_675” ) ) ;
//打開多邊形源
多邊形 = 打開 ( “/ Library / Application Support / JMP / 12 / Maps / US-State-XY.jmp” ) ;
//打開數據源 - 這個包含要更新的信息
名 = 打開 ( “/ Library / Application Support / JMP / 12 / Maps / US-State-Name.jmp” ) ;
//給定一個'多邊形矩陣'pMat,以及其中的shapeID和PartID,確定點(x,y)是否位於由此形狀和部分定義的多邊形中
inShapePart =
功能 ({ PMAT , shapeID , PARTID , X , ÿ } , { 默認本地 } ,
[R = 祿 ( PMAT [ 0 , 1 ] == shapeID & PMAT [ 0 , 2 ] == PARTID ) ;
InPolygon ( X , ÿ , PMAT [ [R , 3 ] , PMAT [ [R , 4 ]) ;
) ;
//給定一個'多邊形矩陣'pMat,以及其中的shapeID和PartID,確定點(x,y)是否位於由此形狀和部分刻有的矩形中
inShapePartRect =
功能 ({ PMAT , shapeID , PARTID , X , ÿ } , { 默認本地 } ,
[R = 祿 ( PMAT [ 0 , 1 ] == shapeID & PMAT [ 0 , 2 ] == PARTID ) ;
maxX的 = 最大值 ( PMAT [ [R , 3 ]) ;
其minX = 最低限度 ( PMAT [ [R , 3 ]) ;
美星 = 最大值 ( PMAT [ [R , 4 ]) ;
MINY = 最低限度 ( PMAT [ [R , 4 ]) ;
如果 ( ( X <= maxX的 ) & ( X > = 其minX ) & ( ÿ <= 美星 ) & ( ÿ > = MINY ) , 1 , 0 ) ;
) ;
PMAT = 多邊形 << getAsMatrix ; //'多邊形矩陣'
X = 柱 ( 點 , “經度” ) << 的GetValues ; // x值
ÿ = 柱 ( 點 , “緯度” ) << 的GetValues ; // y值
loopLimits = 多邊形 << 摘要 ( 組 ( : 形狀ID , : 部件ID ) ,無形 ) ;
NS = 最大值 ( 柱 ( loopLimits , “形狀ID” ) << 的GetValues ) ; //形狀數量
NP = 柱 ( loopLimits , “部件ID” ) << 的GetValues ; //每個形狀中的零件數量
關 ( loopLimits , NoSave關 ) ;
對於 ( 小號 = 1 ,小號 <= NS ,小號 ++, //循環形狀
對於 ( p = 1 , p <= NP [ 小號 ] , p ++, //循環部分
對於 ( d = NRow ( X ) , d > = 1 , d - ,- //循環點
//正方形內的點是否包含多邊形?(比較便宜!)
如果 ( inShapePartRect ( PMAT ,小號 , p , X [ d ] , ÿ [ d ]) ,
//如果是的話,看看它是否實際上在多邊形中(相對昂貴!)
如果 ( inShapePart ( PMAT ,小號 , p , X [ d ] , ÿ [ d ]) ,
shapeName = 柱 ( 名 , “名稱” ) 小號 ] ;
打印 ( “點(” || 燒焦 ( X [ d ]) || “,” || 燒焦 ( ÿ [ d ]) || “)在Shape中找到” || 燒焦 ( 小號 ) || “,部分” || 燒焦 ( p ) || “,姓名” || shapeName || “。” ) ;
//注意:當每個點都“找到”時,刪除“x”和“y”中的相應條目以嘗試加快速度
X [ d ] = [] ; ÿ [ d ] = []
) ;
) ;
) ;
) ;
) ;
關 ( 點 , NoSave關 ) ;
關 ( 多邊形 , NoSave關 ) ;
關 ( 名 , NoSave關 ) ;
Re:根據位置連接表大家好,
我已設法讓腳本正常工作。它接受每個點並將其與包圍的多邊形匹配以連接表。在這種情況下,它會將狀態名稱添加到每個點。
該腳本可以完成其工作,但可能不是最有效的方式。歡迎提出提高效率的想法。
如果您使用它,請分享您的經驗。
清除全球 () ;
名稱默認為此處 ( 1 ) ;
//打開點文件 - 這包括我們想要更新的觀察
點 = 打開 ( “C:\ Program Files(x86)\ SAS \ JMPSW \ 11 \ Samples \ Data \ Hurricanes.jmp” ) ;
//減少插圖數據的大小
點 << 刪除行 ( 點 << 得到行在哪裡 ( : 名稱 ( “姓名和身份證” ) != “NOTNAMED_675” ) ) ;
//打開多邊形源
多邊形 = 打開 ( “C:\ Program Files(x86)\ SAS \ JMPSW \ 11 \ Maps \ US-State-XY.jmp” ,私人的 ) ;
//打開數據源 - 這個包含要更新的信息
數據 = 打開 ( “C:\ Program Files(x86)\ SAS \ JMPSW \ 11 \ Maps \ US-State-Name.jmp” ,私人的 ) ;
//在點表中引入包含要更新的屬性的列
點 << 新欄目 ( “州” ,字符 ,公稱 ) ;
點 << 設置標籤列 ( : 州 ) ;
等待 ( 1 ) ;
//將多邊形提取到矩陣中以提高效率
xMatrix版權 = 多邊形 : X << 得到矩陣 ; // x多邊形的值
YMATRIX = 多邊形 : ÿ << 得到矩陣 ; // y多邊形的值
開始 = 刻度秒 () ;
//穿過多邊形的點並檢查匹配。
對於 ( 一世 = 1 ,一世 <= N行 ( 點 ) ,一世 ++, //為每個點
對於 ( 二 = 1 ,二 <= Col Max ( 多邊形 : 形狀ID ) ,二 ++, //為每個形狀ID
ROWLISTII = 多邊形 << 得到行在哪裡 ( 多邊形 : 形狀ID == 二 ) ; //獲取每個Shape ID的行
對於 ( 三 = 1 ,三 <= 馬克斯 ( 多邊形 : 部件ID [ ROWLISTII ] ) ,三 ++, //根據每個Shape ID的部件ID數量,為每個部件ID
//獲取每個多邊形的行
rowsii = 多邊形 << 得到行在哪裡 ( 和 ( 多邊形 : 形狀ID == 二 ,多邊形 : 部件ID == 三 ) ) ;
//獲取每個多邊形的X值
XMATRIXROWSII = xMatrix版權 [ rowsii ] ;
//獲取每個多邊形的Y值
YMATRIXROWSII = YMATRIX [ rowsii ] ;
//比較點的位置和多邊形
結果 = 在多邊形 ( 點 : 經度 [ 一世 ] ,點 : 緯度 [ 一世 ] , XMATRIXROWSII , YMATRIXROWSII ) ;
如果 ( 結果 == 1 ,節目 ( 一世 ,二 ,數據 : 名稱 [ 二 ] ) ) ; //這會將匹配對的列表發送到日誌
如果 ( 結果 == 1 ,
點 : 州 [ 一世 ] = 數據 : 名稱 [ 二 ] ; //這將使屬性從多邊形信息(數據)更新為點(點)
打破 () ; //這將使第三個循環(iii)停止檢查具有相同形狀ID的更多多邊形。
) ;
) ;
如果 ( 結果 == 1 ,打破 () ) ; //這將使第二個循環(ii)停止檢查相同點的更多Shape ID並移動到下一個點在列表中。
)
) ;
結束 = 刻度秒 () ;
運行 = 結束 - 開始 ;
節目 ( 運行 ) ;
//等(1);
點 << 二元 (
ÿ ( : 緯度 ) ,
X ( : 經度 ) ,
SendToReport (
調度 ( {} , “1” , ScaleBox , { 規模 ( “短程” ) ,敏 ( - 94.0515072337543 ) ,馬克斯 ( - 60.9484927662457 ) ,公司 ( 五 ) ,小蜱蟲 ( 1 )} ) ,
調度 ( {} , “2” , ScaleBox , { 規模 ( “短程” ) ,敏 ( 7.96034811422145 ) ,馬克斯 ( 49.6893151267156 ) ,公司 ( 五 ) ,小蜱蟲 ( 1 )} ) ,
調度 (
{} ,
“Bivar Plot” ,
FrameBox ,
{ 幀大小 ( 449 , 566 ) ,背景地圖 ( 邊界 ( “美國” ) ) ,網格線順序 ( 3 ) ,參考線訂單 ( 4 ) ,
行傳奇 (
州 ,
顏色 ( 1 ) ,
色彩主題 ( “JMP默認” ) ,
標記 ( 0 ) ,
標記主題 ( “” ) ,
連續規模 ( 0 ) ,
反向比例 ( 0 ) ,
排除的行 ( 0 )
)}
)
)
) ;
Re:根據位置連接表如果你讓它工作,我很樂意看到一個示例代碼。
Re:根據位置連接表謝謝伊恩@ JMP
這很有希望。將通過我需要它做的事情,看看它是否有效。
羅恩
Re:根據位置連接表我想你需要編寫腳本。'InPolygon()'JSL函數應該很有用。