サポート > PC-MAPPING ヒント集 > スクリプト > スクリプトによる構造化ポリゴンを構成するベクターからデータベース作成
スクリプトによる構造化ポリゴンを構成するベクターからデータベース作成
ポリゴンはノードとアークから構成されています。スクリプトを使用して、構造化ポリゴンを構成するノードやアークを取得するメソッドをご紹介します。
ここでは、ポリゴンの内部属性フィールドと、そのポリゴンを構成するベクターの内部属性フィールドから、データベースを作成します。
なお、ポリゴンを構成するノード上にポイントがあれば、そのポイント内部属性フィールドからも、データベースを作成します。
例えば、構造化ポリゴンとそのポリゴンを構成するノードからデータベースを作成する場合、「画地」レイヤーにポリゴン内部属性「画地番号」「地番」「画地種別」フィールド、そのポリゴン構成するノード内部属性「点番号」「点名称」フィールドがあれば、「画地-ポリゴン×ノード」Dbを作成し、「画地」レイヤーポリゴン内部属性「画地番号」「地番」「画地種別」フィールドの値を「画地-ポリゴン×ノード」Db「画地番号」「地番」「画地種別」フィールドへ入力、「画地」レイヤーノード内部属性「点番号」「点名称」フィールドの値を「画地-ポリゴン×ノード」Db「点番号」「点名称」フィールドへ入力します。
■ サンプル
サンプル[script52.zip(約36KB)]をダウンロードする
CreatePolConfDb.js:サンプルJScript
sample.pcm:サンプルプロジェクト

■ 準備
  1. ダウンロードしたファイルを解凍します。

  2. ここでは、「C:\sample\script52」とします。

  3. PC-MAPPINGを起動します。

  4. 「C:\sample\script52\sample.pcm」を開きます。

  5. 「C:\sample\script52\CreatePolConfDb.js」を開きます。

■ 解説
要点1
for(var i = 1; i <= lyr.GetNumofPol(true); i++){
if(lyr.IsValidItem(3, i) && lyr.PolygonIsDisable(i) == false){

pcmAutoPcmLayerClass:GetNumofPol()メソッドを使用して、レイヤーから取得したポリゴン数分、処理を行っています。
このとき、pcmAutoPcmLayerClass:IsValidItem()メソッドで無効ポリゴン、pcmAutoPcmLayerClass:PolygonIsDisable()メソッドでディスエーブルポリゴンは処理しないようにしています。

要点2
for(var ii = 0; ii < lyr.PolygonGetNumOfArc(i); ii++){

}

ポリゴンを構成するアークであれば、pcmAutoPcmLayerClass:PolygonGetNumOfArc()メソッドを使用して、ポリゴンを構成するアーク数を取得し、pcmAutoPcmLayerClass:PolygonGetArcID()メソッドで該当するアークの内部IDを取得します。
注意点として、PolygonGetArcID()メソッドは、ポリゴンを構成するアークを右回りに取得し、アーク方向も右周りであれば正(+)、アーク方向が左回りであれば負(−)のアーク内部IDを返します。
ここでは、Math.abs()メソッドを使用して、正は正、負は正に変換した値(絶対値)を取得しています。
なお、Math.abs()メソッドは、PC-Mappingではなく、JScriptのメソッドです。
このようにポリゴンの内部IDとそのポリゴンを構成するアークの内部IDが取得できれば、pcmAutoPcmDbClass:GetCell()メソッドでポリゴンやアーク内部属性フィールドの値を取得し、pcmAutoPcmDbClass:SetCell()メソッドでデータベースのフィールドへ入力できます。
ここでは、pcmSetCell()関数内で処理を行っています。

要点3
for(var ii = 0; ii < lyr.PolygonGetNumOfChild(i); ii++){

}

ポリゴンに包含されている子ポリゴンがディスエーブルポリゴンであれば、子ポリゴンを構成するアークも要点2と同じ処理を行い、ポリゴンやアーク内部属性フィールドの値を取得し、データベースのフィールドへ入力します。
これ以降にあります、ポリゴンを構成するノードであれば要点4、ポイントであれば要点5でも同じ処理を行っています。

要点4
for(var ii = 0; ii < lyr.PolygonGetNumOfArc(i); ii++){

}

ポリゴンを構成するノードであれば、pcmAutoPcmLayerClass:PolygonGetNumOfArc()メソッドを使用して、ポリゴンを構成するアーク数を取得し、pcmAutoPcmLayerClass:PolygonGetArcID()メソッドで該当するアークの内部IDを取得します。
PolygonGetArcID()メソッドは、ポリゴンを構成するアークを右回りに取得し、アーク方向も右周りであれば正(+)、アーク方向が左回りであれば負(−)のアーク内部IDを返します。
よって、アーク内部IDが正(+)であれば始点ノード内部ID、アーク内部IDが負(−)であれば終点ノード内部IDを取得します。
このようにポリゴンの内部IDとそのポリゴンを構成するノードの内部IDが取得できれば、pcmAutoPcmDbClass:GetCell()メソッドでポリゴンやアーク内部属性フィールドの値を取得し、pcmAutoPcmDbClass:SetCell()メソッドでデータベースのフィールドへ入力できます。
ここでは、pcmSetCell()関数内で処理を行っています。

要点5
var temp = lyr.PolygonGetPos3(i, ap, false, false);
for(var ii = 0; ii < ap.GetNum()-1; ii++){

}

ポリゴンを構成するノード上にあるポイントであれば、pcmAutoPcmLayerClass:PolygonGetPos3()メソッドを使用して、ポリゴンを構成する座標列を取得し、pcmAutoPcmLayerClass:FindByPos()メソッドでこの座標列と一致するポイントを検索、ポイント内部IDを取得します。
このようにポリゴンの内部IDとそのポリゴンを構成する座標列と一致するポイントの内部IDが取得できれば、pcmAutoPcmDbClass:GetCell()メソッドでポリゴンやアーク内部属性フィールドの値を取得し、pcmAutoPcmDbClass:SetCell()メソッドでデータベースのフィールドへ入力できます。
ここでは、pcmSetCell()関数内で処理を行っています。

■ 実行
  1. ベクターウィンドウをアクティブにします。

  2. コマンドラインバーが表示されていることを確認します。

  3. 表示されていなければ、[ワークスペース]-[コマンドバー]-[コマンドラインバー]を実行します。

  4. コマンド「CreatePolConfDb.js△2」と記述し、実行します(アルファベットは半角小文字、△は半角スペース、数字は半角)。

    パラメーター「2」は、ポリゴンの内部属性フィールドと、そのポリゴンを構成するノードの内部属性フィールドから、データベースを作成します。

  5. すると、「画地-ポリゴン×ノード」Dbが作成され、処理を終了します。
    例えば、「画地」レイヤーポリゴン内部属性「画地番号」フィールドが"3"のポリゴンは、ノード内部属性「点番号」フィールドが"19"・"20"・"32"・"33"の4つのノードから構成されています。
    これらから「画地-ポリゴン×ノード」Dbには、4レコードが入力されます。
    ▼「画地」レイヤーの該当ポリゴン(ピンク色)

    ▼該当ポリゴンの内部属性(水色)

    ▼該当ポリゴンを構成するノードの内部属性(水色)

    ▼「画地-ポリゴン×ノード」Dbに入力されるレコード(水色)