場所に基づいてテーブルを結合する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、みんな
JMPは場所に基づいてテーブルを結合(更新)できますか?
座標を持つ点とポリゴンのシェープファイルのデータセットがあります。位置に基づいてシェイプファイルからの情報でドットデータテーブルを更新したいと思います。そのため、ポイントが特定のポリゴン内にある場合は、そのポリゴンの属性を使用してテーブルを更新します。
ありがとうございます。
ロン
場所に基づいてテーブルを結合するスクリプトをさらにスピードアップするには、まずポイントが "America"の四角にあるかどうかを確認します。 イアンの台本に追加する
inAmericaRect =
関数({pMat、x、y}、{デフォルトローカル}、
maxX =最大値(pMat [0、3]);
minX =最小(pMat [0、3]);
maxY =最大値(pMat [0、4]);
minY =最小(pMat [0、4]);
((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を使用して、それが陸上かどうかを最初に判断することもできます。 しかし、その時点であなたのスクリプトはプロジェクトの範囲外になるでしょう。
場所に基づいてテーブルを結合するありがとうございましたイアン@ JMP 、
これは私のやり方よりずっと良くて速いです。
私のスクリプトでループを作成している間、私はXYテーブルが完全にきれいではないことに気付きました、そしてあなたのアプローチはそれに対してロバストでもあります。
ロン
場所に基づいてテーブルを結合する8時間半後、ハリケーンのファイル全体が結合されました。ほとんどのドットは海中にあるので、スクリプトはそれぞれが52の州(84の多角形)のどれにも含まれていないことを確認するのに時間がかかりました。

場所に基づいてテーブルを結合する偶然にも、ちょっと見てみる時間がありました。私は効率を改善するために主張をしませんが、比較目的のためにそれを提供するだけです。私はチェックもテストもしませんでした。使用しているサブセットについては、ほとんど瞬時に実行されます。注意の OS / Xのパス
NamesDefaultToHere ( 1 ) ;
ClearLog () ;
//ドットファイルを開く - これは更新したい観測値を含みます
点 = 開いた ( "$ SAMPLE_DATA / Hurricanes.jmp" ) ;
点 << 行を削除する ( 点 << 行を取得する ( : 名 ( 「名前とID」 ) != "NOTNAMED_675" ) ) ;
//ポリゴンソースを開く
ポリゴン = 開いた ( "/ライブラリ/アプリケーションサポート/ JMP / 12 / Maps / US-State-XY.jmp" ) ;
//オープンデータソース - これには更新する情報が含まれています
名前 = 開いた ( "/ライブラリ/アプリケーションサポート/ JMP / 12 / Maps / US-State-Name.jmp" ) ;
// 'ポリゴンマトリックス' pMat、およびその中のshapeIDとPartIDを指定して、ポイント(x、y)がこのシェイプとパートで定義されたポリゴン内にあるかどうかを判断します
inShapePart =
関数 ({ pMat 、 shapeID 、 partID 、バツ 、よ } 、 { デフォルトのローカル } 、
r = Loc ( pMat [ 0 、 1 ] == shapeID & pMat [ 0 、 2 ] == partID ) ;
インポリゴン ( バツ 、よ 、 pMat [ r 、 3 ] 、 pMat [ r 、 4 ]) ;
) ;
// 'ポリゴンマトリックス' pMatと、その中のshapeIDおよびPartIDを指定して、点(x、y)がこの形状と部分に内接する長方形内にあるかどうかを判断する
inShapePartRect =
関数 ({ pMat 、 shapeID 、 partID 、バツ 、よ } 、 { デフォルトのローカル } 、
r = Loc ( pMat [ 0 、 1 ] == shapeID & pMat [ 0 、 2 ] == partID ) ;
maxX = 最大 ( pMat [ r 、 3 ]) ;
minX = 最小 ( pMat [ r 、 3 ]) ;
最高 = 最大 ( pMat [ r 、 4 ]) ;
分 = 最小 ( pMat [ r 、 4 ]) ;
もし ( ( バツ <= maxX ) & ( バツ > = minX ) & ( よ <= 最高 ) & ( よ > = 分 ) 、 1 、 0 ) ;
) ;
pMat = ポリゴン << getAsMatrix ; // 'ポリゴンマトリックス'
バツ = カラム ( 点 、 "経度" ) << getValues ; // x値
よ = カラム ( 点 、 "緯度" ) << getValues ; // y値
loopLimits = ポリゴン << 概要 ( グループ ( : 形状ID 、 : 部品ID ) 、見えない ) ;
ns = 最大 ( カラム ( loopLimits 、 「形状ID」 ) << getValues ) ; //形状の数
np = カラム ( loopLimits 、 「部品ID」 ) << getValues ; //各形状の部品数
閉じる ( loopLimits 、 NoSave ) ;
にとって ( の = 1 、の <= ns 、の ++、 //図形をループする
にとって ( p = 1 、 p <= np [ の ] 、 p ++、 //パーツをループする
にとって ( 日 = 今 ( バツ ) 、日 > = 1 、日 - 、 //ドットをループする
//多角形を内接する四角形の内側に点はありますか?(比較的安い!)
もし ( inShapePartRect ( pMat 、の 、 p 、バツ [ 日 ] 、よ [ 日 ]) 、
//もしそうなら、それが実際に多角形の中にあるかどうかを見てください(比較的高価です!)
もし ( inShapePart ( pMat 、の 、 p 、バツ [ 日 ] 、よ [ 日 ]) 、
shapeName = カラム ( 名前 、 "名" )[ の ] ;
印刷する ( "ポイント(" || チャー ( バツ [ 日 ]) || 「」 || チャー ( よ [ 日 ]) || ")形状に見つかりません" || チャー ( の ) || 「、パート」 || チャー ( p ) || 「名前付き」 || shapeName || "" ) ;
//注意:各ドットは '見つかった'ので、処理速度を上げるために 'x'と 'y'の対応するエントリを削除
バツ [ 日 ] = [] ; よ [ 日 ] = []
) ;
) ;
) ;
) ;
) ;
閉じる ( 点 、 NoSave ) ;
閉じる ( ポリゴン 、 NoSave ) ;
閉じる ( 名前 、 NoSave ) ;
場所に基づいてテーブルを結合するこんにちは、みんな、
スクリプトを機能させることができました。それは各点を取り、それを周囲の多角形と照合してテーブルを結合します。この場合、各ドットに州の名前が追加されます。
スクリプトは機能しますが、おそらく最も効率的な方法ではありません。効率を改善するための匿名のアイデアは大歓迎です。
あなたがそれを使うようになるならば、あなたの経験を共有してください。
クリアグローバル () ;
ここにデフォルトの名前 ( 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 << 行列として取得 ; //ポリゴンのy値
開始 = チック秒 () ;
//多角形上の点を通過して一致を確認します。
にとって ( 私 = 1 、私 <= N行 ( 点 ) 、私 ++、 //各ドットに対して
にとって ( 二 = 1 、二 <= コルマックス ( ポリゴン : 形状ID ) 、二 ++、 //形状IDごとに
ロウリストイ = ポリゴン << 行を取得する ( ポリゴン : 形状ID == 二 ) ; //各Shape IDの行を取得します
にとって ( 三 = 1 、三 <= マックス ( 多角形 : 部品ID [ ロウリストイ ] ) 、三 ++、 //各シェイプIDの部品IDの数に従って、各部品IDの
//各ポリゴンの行を取得します
rowsii = ポリゴン << 行を取得する ( そして ( ポリゴン : 形状ID == 二 、ポリゴン : 部品ID == 三 ) ) ;
//各ポリゴンのX値を取得します
XMATRIXROWSII = XMATRIX [ rowsii ] ;
//各ポリゴンのY値を取得します
YMATRIXROWSII = YMATRIX [ rowsii ] ;
//ドットの位置をポリゴンと比較します
結果 = 多角形で ( 点 : 経度 [ 私 ] 、点 : 緯度 [ 私 ] 、 XMATRIXROWSII 、 YMATRIXROWSII ) ;
もし ( 結果 == 1 、見せる ( 私 、二 、データ : 名 [ 二 ] ) ) ; //これは一致するペアのリストをログに送ります
もし ( 結果 == 1 、
点 : 状態 [ 私 ] = データ : 名 [ 二 ] ; //これにより、属性がポリゴン情報(データ)からドット(ドット)に更新されます。
ブレーク () ; //これにより、3番目のループ(iii)が同じShape IDの他のポリゴンのチェックを停止します。
) ;
) ;
もし ( 結果 == 1 、ブレーク () ) ; //これにより、2番目のループ(ii)が同じドットに対するさらに多くのShape IDのチェックを停止し、次のドットに移動します。リストにあります。
)
) ;
終わり = チック秒 () ;
ランタイム = 終わり - 開始 ;
見せる ( ランタイム ) ;
//待機(1);
点 << 二変量 (
Y ( : 緯度 ) 、
バツ ( : 経度 ) 、
SendToReport (
ディスパッチ ( {} 、 「1」 、 ScaleBox 、 { 規模 ( 「測地線」 ) 、分 ( - 94.0515072337543 ) 、マックス ( - 60.9484927662457 ) 、株式会社 ( 5 ) 、マイナーティック ( 1 )} ) 、
ディスパッチ ( {} 、 「2」 、 ScaleBox 、 { 規模 ( 「測地線」 ) 、分 ( 7.96034811422145 ) 、マックス ( 49.6893151267156 ) 、株式会社 ( 5 ) 、マイナーティック ( 1 )} ) 、
ディスパッチ (
{} 、
"バイバープロット" 、
FrameBox 、
{ フレームサイズ ( 449 、 566 ) 、背景マップ ( 境界 ( 「アメリカの国」 ) ) 、グリッド線の順序 ( 3 ) 、参照行の順序 ( 4 ) 、
行の凡例 (
状態 、
色 ( 1 ) 、
カラーテーマ ( 「JMPデフォルト」 ) 、
マーカー ( 0 ) 、
マーカーテーマ ( 「」 ) 、
連続スケール ( 0 ) 、
逆スケール ( 0 ) 、
除外された行 ( 0 )
)}
)
)
) ;
場所に基づいてテーブルを結合するそれがうまくいったら、私はサンプルコードを見たいのですが。
場所に基づいてテーブルを結合するありがとうイアン@ JMP
これは有望に見えます。私がそれをする必要があることを通り抜けて、それがうまくいくかどうか確かめます。
ロン
場所に基づいてテーブルを結合するスクリプトが必要になると思います。'InPolygon()' JSL関数が役立つはずです。