위치에 따라 테이블 조인<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕 모두
JMP가 위치에 따라 테이블을 조인 (업데이트) 할 수 있습니까?
나는 좌표가있는 점들과 다각형의 shapefile 데이터 세트를 가지고있다. 위치를 기준으로 shapefile의 정보로 도트 데이터 테이블을 업데이트하고 싶습니다. 따라서 점이 특정 다각형에 있으면 다각형의 속성으로 테이블을 업데이트합니다.
감사!
론
다시 : 위치에 따라 테이블을 조인스크립트의 속도를 더 높이려면 포인트가 "미국"사각형인지 먼저 확인할 수 있습니다. 이안의 대본에 덧붙여 라.
inAmericaRect =
함수 ({pMat, x, y}, {기본 로컬},
maxX = 최대 (pMat [0, 3]);
minX = 최소 (pMat [0, 3]);
maxY = 최대 (pMat [0, 4]);
최소 Y = 최소 (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를 사용하여 다른 국가에 대한 추가 필터링을 수행 할 수 있습니다. 또는 coastlineName.jmp 및 coastline-xy.jmp를 사용하여 처음에 육상에 있는지 확인할 수 있습니다. 그러나 그 시점에서 스크립트는 프로젝트 범위를 벗어날 것입니다.
다시 : 위치에 따라 테이블을 조인고맙습니다 이안 @ JMP ,
이것은 내 접근 방식보다 훨씬 빠릅니다.
필자의 스크립트에서 루프를 생성하는 동안 XY 테이블이 완벽하게 깨끗하지 못했고 이에 대한 접근 방법도 강력하다는 것을 알았습니다 (셰이프 ID 10은 파트 ID가 1,3,4,5입니다 - 건너 뛰기 2).
론
다시 : 위치에 따라 테이블을 조인8 시간 30 분 후 허리케인 파일 전체가 합쳐졌습니다. 대부분의 점들이 바다에 있기 때문에 스크립트는 각자가 52 개 주 (84 개의 다각형) 중 하나가 아닌지 확인하는 데 약간의 시간이 걸렸습니다.

다시 : 위치에 따라 테이블을 조인우연히도, 나는 방금 시간을 들여다 보았다. 효율성 향상에 대한 어떠한 주장도하지 않고 비교 목적으로 만 제공합니다. 나는 점검이나 테스트를하지 않았다. 사용중인 하위 집합의 경우 거의 즉시 실행됩니다. 노트 그만큼 OS / X 경로.
NamesDefaultToHere ( 1 ) ;
로그 지우기 () ;
// 도트 파일을 엽니 다. 여기에는 업데이트 할 관찰이 포함됩니다.
도트 = 열다 ( "$ SAMPLE_DATA / Hurricanes.jmp" ) ;
도트 << 행 삭제 ( 도트 << 행을 가져오다. ( : 이름 ( "이름 및 ID" ) ! = "NOTNAMED_675" ) ) ;
// 폴리곤 소스 열기
다각형 = 열다 ( "/ Library / Application Support / JMP / 12 / Maps / US-State-XY.jmp" ) ;
// 오픈 데이터 소스 - 업데이트 할 정보가 포함되어 있습니다.
이름 = 열다 ( "/ Library / Application Support / JMP / 12 / Maps / US-State-Name.jmp" ) ;
// 'polygon matrix'pMat와 그 내부에있는 shapeID와 PartID가 주어지면 점 (x, y)이이 모양과 파트로 정의 된 다각형에 있는지 결정합니다
inShapePart =
기능 ({ pMat , shapeID , partID , 엑스 , 와이 } , { 기본 로컬 } ,
아르 자형 = Loc ( pMat [ 0 , 1 ] == shapeID & pMat [ 0 , 2 ] == partID ) ;
인 폴리곤 ( 엑스 , 와이 , pMat [ 아르 자형 , 삼 ] , pMat [ 아르 자형 , 4 ]) ;
) ;
// 'polygon matrix'pMat와 shapeID 및 PartID가 주어지면 점 (x, y)이이 모양과 부분에 새겨 져있는 사각형에 있는지 결정합니다
inShapePartRect =
기능 ({ pMat , shapeID , partID , 엑스 , 와이 } , { 기본 로컬 } ,
아르 자형 = Loc ( pMat [ 0 , 1 ] == shapeID & pMat [ 0 , 2 ] == partID ) ;
maxX = 최고 ( pMat [ 아르 자형 , 삼 ]) ;
말괄량이 = 최저한의 ( pMat [ 아르 자형 , 삼 ]) ;
맥시 = 최고 ( pMat [ 아르 자형 , 4 ]) ;
최소 Y = 최저한의 ( pMat [ 아르 자형 , 4 ]) ;
만약 ( ( 엑스 <= maxX ) & ( 엑스 > = 말괄량이 ) & ( 와이 <= 맥시 ) & ( 와이 > = 최소 Y ) , 1 , 0 ) ;
) ;
pMat = 다각형 << getAsMatrix ; // '다각형 행렬'
엑스 = 기둥 ( 도트 , "경도" ) << getValues ; // x 값
와이 = 기둥 ( 도트 , "위도" ) << getValues ; // y 값
loopLimits = 다각형 << 개요 ( 그룹 ( : 모양 ID , : 부품 ID ) , 보이지 않는 ) ;
ns = 최고 ( 기둥 ( loopLimits , "도형 ID" ) << getValues ) ; // 도형의 수
np = 기둥 ( loopLimits , "부품 ID" ) << getValues ; // 각 도형의 파트 수
닫기 ( loopLimits , 아니오 ) ;
에 대한 ( 에스 = 1 , 에스 <= ns , 에스 ++, // 도형 위로 반복합니다.
에 대한 ( 피 = 1 , 피 <= np [ 에스 ] , 피 ++, // 부품 위로 반복합니다.
에 대한 ( 디 = NRow ( 엑스 ) , 디 > = 1 , 디 -, // 도트 위로 반복합니다.
// 다각형을 새겨 넣는 정사각형 안에 점이 있습니까? (비교적 싸다!)
만약 ( inShapePartRect ( pMat , 에스 , 피 , 엑스 [ 디 ] , 와이 [ 디 ]) ,
// 그렇다면 실제로 폴리곤에 있는지 확인하십시오 (상대적으로 비쌉니다!).
만약 ( inShapePart ( pMat , 에스 , 피 , 엑스 [ 디 ] , 와이 [ 디 ]) ,
shapeName = 기둥 ( 이름 , "이름" ) [ 에스 ] ;
인쇄 ( "포인트 (" || 숯 ( 엑스 [ 디 ]) || "," || 숯 ( 와이 [ 디 ]) || ") 모양에서 발견" || 숯 ( 에스 ) || ", 파트" || 숯 ( 피 ) || ", 이름과 함께" || shapeName || "." ) ;
// NB : 각 도트가 '찾음'이므로 'x'및 'y '의 해당 항목을 삭제하여 작업 속도를 높입니다.
엑스 [ 디 ] = [] ; 와이 [ 디 ] = []
) ;
) ;
) ;
) ;
) ;
닫기 ( 도트 , 아니오 ) ;
닫기 ( 다각형 , 아니오 ) ;
닫기 ( 이름 , 아니오 ) ;
다시 : 위치에 따라 테이블을 조인안녕 모두,
나는 스크립트가 작동하도록 관리했다. 각 점을 가져 와서 테이블을 결합하기 위해 둘러싸인 다각형과 일치시킵니다. 이 경우 각 점에 상태 이름이 추가됩니다.
스크립트는 작업을 수행하지만 가장 효율적인 방법은 아닙니다. 향상된 효율성을위한 아이디어는 환영합니다.
그것을 사용하게되면 경험을 공유하십시오.
전역 삭제 () ;
기본 이름은 여기에있다. ( 1 ) ;
// 도트 파일을 엽니 다. 여기에는 업데이트하려는 관측치가 포함됩니다.
도트 = 열다 ( "C : \ Program Files (x86) \ SAS \ JMPSW \ 11 \ Samples \ Data \ Hurricanes.jmp" ) ;
// 일러스트의 데이터 크기를 줄입니다.
도트 << 행 삭제 ( 도트 << 행을 가져오다. ( : 이름 ( "이름 및 ID" ) ! = "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 값
YMATRIX = 다각형 : 와이 << 행렬로 얻다. ; // 다각형의 y 값
스타트 = 틱 초 () ;
// 다각형을 가로 지르는 점들을 통과하여 일치하는 점을 확인합니다.
에 대한 ( 나는 = 1 , 나는 <= N 행 ( 도트 ) , 나는 ++, // 각 점에 대해
에 대한 ( ii = 1 , ii <= 콜 맥스 ( 다각형 : 모양 ID ) , ii ++, // 각 도형 ID에 대해
줄리 스티 = 다각형 << 행을 가져오다. ( 다각형 : 모양 ID == ii ) ; // 각 Shape ID에 대한 행을 가져옵니다.
에 대한 ( iii = 1 , iii <= 맥스 ( 다각형 : 부품 ID [ 줄리 스티 ] ) , iii ++, // 각 Shape ID의 Part ID 수에 따라 각 Part ID에 대해
// 각 다각형에 대한 행을 가져옵니다.
행 = 다각형 << 행을 가져오다. ( 과 ( 다각형 : 모양 ID == ii , 다각형 : 부품 ID == iii ) ) ;
// 각 다각형에 대한 X 값을 얻습니다.
XMATRIXROWSII = XMATRIX [ 행 ] ;
// 각 다각형에 대한 Y 값을 얻습니다.
YMATRIXROWSII = YMATRIX [ 행 ] ;
// 도트의 위치와 다각형을 비교한다.
결과 = 다각형 ( 도트 : 경도 [ 나는 ] , 도트 : 위도 [ 나는 ] , XMATRIXROWSII , YMATRIXROWSII ) ;
만약 ( 결과 == 1 , 보여 주다 ( 나는 , ii , 데이터 : 이름 [ ii ] ) ) ; // 일치하는 쌍의 목록을 로그에 보냅니다.
만약 ( 결과 == 1 ,
도트 : 상태 [ 나는 ] = 데이터 : 이름 [ ii ] ; // 다각형 정보 (데이터)에서 도트 (도트)로 속성을 업데이트합니다.
단절 () ; // 그러면 세 번째 루프 (iii)가 동일한 도형 ID의 더 많은 폴리곤을 검사하지 않게됩니다.
) ;
) ;
만약 ( 결과 == 1 , 단절 () ) ; // 이것은 두 번째 루프를 만들 것입니다. (ii) 동일한 도트에 대해 더 많은 도형 ID를 확인하고 다음 도트로 이동합니다. 목록에
)
) ;
종료 = 틱 초 () ;
실행 시간 = 종료 - 스타트 ;
보여 주다 ( 실행 시간 ) ;
// 대기 (1);
도트 << 이변 량 (
와이 ( : 위도 ) ,
엑스 ( : 경도 ) ,
SendToReport (
급파 ( {} , "1" , ScaleBox , { 규모 ( "측지학" ) , 민 ( - 94.0515072337543 ) , 맥스 ( - 60.9484927662457 ) , Inc ( 5 ) , 마이너 틱스 ( 1 }} ) ,
급파 ( {} , "2" , ScaleBox , { 규모 ( "측지학" ) , 민 ( 7.96034811422145 ) , 맥스 ( 49.6893151267156 ) , Inc ( 5 ) , 마이너 틱스 ( 1 }} ) ,
급파 (
{} ,
"Bivar Plot" ,
FrameBox ,
{ 프레임 크기 ( 449 , 566 ) , 배경지도 ( 경계 ( "미국 국가" ) ) , 눈금 선 순서 ( 삼 ) , 참조 행 순서 ( 4 ) ,
행 범례 (
상태 ,
색깔 ( 1 ) ,
색상 테마 ( "JMP 기본값" ) ,
채점자 ( 0 ) ,
마커 테마 ( "" ) ,
연속 눈금 ( 0 ) ,
역 스케일 ( 0 ) ,
제외 행 ( 0 )
}}
)
)
) ;
다시 : 위치에 따라 테이블을 조인필자가 작동하도록하면 샘플 코드를보고 싶습니다.
다시 : 위치에 따라 테이블을 조인감사 이안 @ JMP
이것은 유망 해 보입니다. 내가해야 할 일을 통해 가서 그것이 효과가 있는지 볼 것입니다.
론
다시 : 위치에 따라 테이블을 조인스크립트 작성이 필요하다고 생각합니다. 'InPolygon ()'JSL 함수가 유용합니다.