Daily Archives: 11/20/2012

カテゴリー分類example [Chapter 6-2]

カテゴリー分類example

今回は、shape fileの属性値を使ってカテゴリー分類をしてfeatureを色分けするexampleを作成します。元になるprogramは、カテゴリー分類example [Chapter 6-1]のex06に付け加えていきます。
再度書いておきますが、MapWinGISのカテゴリー分類の方法は

  1. ctNaturalBreaks 
  2. ctUniqueValues → [Chapter 6-1]
  3. ctEqualIntervals
  4. ctEqualCount
  5. ctStandardDeviation
  6. ctEqualSumOfValues

の6通りできます。
enum tkClassificationTypeを参照のこと。

今回の[Chapter 6-2]では、カテゴリー分類example [Chapter 6-1]でctUniqueValuesのユニーク値を使ったカテゴリー分類をやったので、数値カテゴリー分類をやってみます。

Program Coding

今回は、カテゴリー分類example [Chapter 6-1]に若干designに付け加えます。
併せてカテゴリー分類のsetting formを作成します。

Form design

Main Form

Main Form designはiconを使ってtoolbarにsettingします。
こんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image06.jpg
toolbar

カテゴリー分類のiconを追加します。

Categories set Form

Main Formから呼び出すCategories set Form designはこんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image09.jpg
Categories set form

使っているcontrol類は、

  1. ListBox (選択したlayerのfield名)
  2. ComboBox (分類方法、色指定方法)
  3. NumiricUpDown (分割数)
  4. Bottun (実行、キャンセル、削除)

です。

Coding

それでは、Categories set form(Form2)からcodingを始めていきます。

数値カテゴリー分類の作成

カテゴリー分類example [Chapter 6-1]ではctUniqueValues分類を作成しましたが、これは主に文字列(例えばユニークなコードなど)に使用します。
数値カテゴリー分類は、文字列以外に使用します。
参考にするcodeはこのsampleを使ってみます。

数値カテゴリー分類のsubroutineは、

    Private Sub NumValueCategory()
        Dim fieldIndex As Integer = t_sf.Table.FieldIndexByName(SelectField)
 
        If fieldIndex = -1 Then Exit Sub
 
        Dim lColor = Convert.ToUInt32(RGB(Convert.ToInt32(Color.LightPink.R),
                                          Convert.ToInt32(Color.LightPink.G),
                                          Convert.ToInt32(Color.LightPink.B)))
        Dim hColor = Convert.ToUInt32(RGB(Convert.ToInt32(Color.LightGreen.R),
                                          Convert.ToInt32(Color.LightGreen.G),
                                          Convert.ToInt32(Color.LightGreen.B)))
 
        'creating classification
        t_sf.Categories.Generate(fieldIndex, ClassificationType, numClassification)
        t_sf.Categories.ApplyExpressions()
 
        ' applying colors
        Dim scheme As New ColorScheme()
        scheme.SetColors(lColor, hColor)
        t_sf.Categories.ApplyColorScheme(SchemeType, scheme)
 
        ' apply expresions should be called exlicitly
        t_sf.Categories.Caption = SelectField.ToString
        t_sf.Categories.ApplyExpressions()
 
    End Sub

NumValueCategoryの大まかな流れは、

  1. fieldIndexの取得
  2. Categories.Generateでカテゴリー分類
    1. 数値カテゴリー分類は、ClassificationTypeで定義したものを使用
    2. カテゴリー分割数は、numClassificationで定義したものを使用
  3. Categories.ApplyExpressions()でカテゴリー生成
  4. Categories.ApplyColorSchemeでcoloring設定

となります。
colorSchemeの設定については、Color Schemeを参照してください。
カテゴリー分類方法はCategories.Generateで行うので、sub UniqueValueCategoryと大して変わりませんよね。というか、ユニーク値では分割数を0にするですね。

カテゴリー分類を行う場合、必要な情報は、

  1. どのfieldを使うか?
  2. どの分割方法を使うか?
  3. 分割数は?
  4. 色指定方法は?

が必要になります。

これらをCategories Form上で作成すればOKですね。
上記の情報に見合ったcontrolを使います。

  1. lsbFields → ListBox
  2. cmbClassificationType → ComboBox
  3. nudClassfication → NumericUpDown
  4. cmbSchemeType → ComboBox

として作成し、propertyにsetして、eventを実装します。

Form load時

まずは、Form load時の実装ですが、その前に、

Imports AxMapWinGIS
Imports MapWinGIS

を忘れずに。

変数とオブジェクトの定義も、

    Public t_map As New AxMapWinGIS.AxMap
    Public t_sf As New MapWinGIS.Shapefile()
    Public t_legend As New LegendControl.Legend
    Public t_LayerHandle As Integer
 
    Private SelectField As String           '選択したフィールド名
    Private numClassification As Integer    '分割数
    Private ClassificationType As Integer   '分類方法番号
    Private SchemeType As Integer           '色分け方法番号

publicの定義は、Main Formから呼び出す際に使用します。

Form load時のcodeは、

    Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
 
        Dim i As Integer
        Dim strFieldName As String = ""
        Dim myField As MapWinGIS.Field
 
        'フィールド名を書き出す
        lsbFields.Items.Clear()
        For i = 0 To t_sf.NumFields - 1
            myField = t_sf.Field(i)
            strFieldName = myField.Name
            lsbFields.Items.Add(strFieldName)
        Next i
 
        '色指定方法
        cmbSchemeType.Items.Clear()
        cmbSchemeType.Items.Add("SchemeRandom")                 '=0
        cmbSchemeType.Items.Add("SchemeGraduated")              '=1
        cmbSchemeType.SelectedIndex = 0
 
        '分類方法タイプ
        cmbClassificationType.Items.Clear()
        cmbClassificationType.Items.Add("NaturalBreaks")        '=0
        cmbClassificationType.Items.Add("UniqueValues")         '=1
        cmbClassificationType.Items.Add("EqualIntervals")       '=2
        cmbClassificationType.Items.Add("EqualCount")           '=3
        cmbClassificationType.Items.Add("StandardDeviation")    '=4
        cmbClassificationType.Items.Add("EqualSumOfValues")     '=5
        cmbClassificationType.SelectedIndex = 2
 
    End Sub

な感じで実装します。
簡単なので説明不要ですよね。

lsbFields_SelectedIndexChanged event時

field名をSelectFieldに入れます。

    Private Sub lsbFields_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lsbFields.SelectedIndexChanged
        SelectField = lsbFields.SelectedItem.ToString
    End Sub
cmbClassificationType_SelectedIndexChanged event時

ClassificationTypeにカテゴリー分類方法のindexを入れます。

    Private Sub cmbClassificationType_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbClassificationType.SelectedIndexChanged
        ClassificationType = cmbClassificationType.SelectedIndex
    End Sub
nudClassfication_ValueChanged event時

numClassificationに分割数を入れます。

    Private Sub nudClassfication_ValueChanged(sender As System.Object, e As System.EventArgs) Handles nudClassfication.ValueChanged
        numClassification = Integer.Parse((nudClassfication.Value))
    End Sub
cmbSchemeType_SelectedIndexChanged event時

SchemeType に色指定方法のindexを入れます。

    Private Sub cmbSchemeType_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSchemeType.SelectedIndexChanged
        SchemeType = cmbSchemeType.SelectedIndex
    End Sub
Main Formのcodeing

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image07.jpg
カテゴリー分類のbutton(一番右端のicon)

カテゴリー分類のbutton click event発生時のcodingは、

    Private Sub ToolStripButton3_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton3.Click
        'set categories
        If AxMap1.NumLayers > 0 Then
            Dim frmCategory As New Form2()
            frmCategory.Label5.Text = "選択Layer名: " & Legend1.Map.LayerName(layerHandle)
            frmCategory.t_map = AxMap1
            frmCategory.t_legend = Legend1
            frmCategory.t_sf = AxMap1.get_GetObject(layerHandle)
            frmCategory.t_LayerHandle = layerHandle
 
            frmCategory.ShowDialog(Me)
        End If
 
    End Sub

Form2をfrmCategoryとして作成して、Form2のpublic宣言してるobject変数に入れます。

Programの実行

では、ex06を保存して実行してみましょう。

今回は、神奈川県のサンプルc14_regionDD.shpを読み込んで表示させます。c14_regionDD.shpは市町村人口と世帯数および人口密度を加えてものです。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image13.jpg
神奈川県のサンプルshape file表示

カテゴリー分類buttonをクリックして、カテゴリー分類の設定formを表示させます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image08.jpg
カテゴリー分類設定画面

カテゴリー分類のcomboBoxから分類方法を決めます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image10.jpg
カテゴリー分類のcomboBoxから分類方法表示

色指定方法のcomboBoxから分類方法を決めます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image11.jpg
色指定方法のcomboBoxから分類方法表示

人口密度で10分割のカテゴリーに分類した結果です。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex06_image12.jpg
カテゴリー分類の表示例

カテゴリー分類の設定Formで削除button Clickでは、カテゴリーがresetされます。
いろいろな分類方法を試してみるのも良いですね。

今回のまとめ

だんだんとGISのソフトウェアっぽくなってきましたが、まだまだ、tutorialの1/3くらいと言うところでしょうか。
では、今回のまとめを

  1. 6種類のカテゴリー分類のcodeing実装を行いました。
  2. 別Formを作成して、カテゴリー分類を行いました。

vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex06のsource codeとshapefile dataを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
code

data

サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。

最後に、Layerを選択して次の操作を行うことを忘れないように。

Exercise

今回のProgramを少し発展させて以下の項目を付け加えてみてください。

  1. カテゴリー設定のForm表示時に、defaultでは表示がresetされるますが、これをresetされずに現在表示している項目を表示するように変更してみる。
  2. カテゴリー設定のFormを参考に、個別属性値を別Formで表示できるようにする。
  3. カテゴリー設定のFormを参考に、featureの色分け指定も別Formで表示できるようにする。
  4. polyLine、pointについてもカテゴリー分類してみる。

1 / 11

Social Widgets powered by AB-WebLog.com.