根据位置连接表<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函数应该很有用。