カテゴリー分類example
今回は、shape fileの属性値を使ってカテゴリー分類をしてfeatureを色分けするexampleを作成します。元になるprogramは、カテゴリー分類example [Chapter 6-1]のex06に付け加えていきます。
再度書いておきますが、MapWinGISのカテゴリー分類の方法は
-
ctNaturalBreaks
-
ctUniqueValues → [Chapter 6-1]
-
ctEqualIntervals
-
ctEqualCount
-
ctStandardDeviation
-
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
Categories set Form
Main Formから呼び出すCategories set Form designはこんな感じ、
使っているcontrol類は、
-
ListBox (選択したlayerのfield名)
-
ComboBox (分類方法、色指定方法)
-
NumiricUpDown (分割数)
-
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の大まかな流れは、
-
fieldIndexの取得
-
Categories.Generateでカテゴリー分類
-
数値カテゴリー分類は、ClassificationTypeで定義したものを使用
-
カテゴリー分割数は、numClassificationで定義したものを使用
-
-
Categories.ApplyExpressions()でカテゴリー生成
-
Categories.ApplyColorSchemeでcoloring設定
となります。
colorSchemeの設定については、Color Schemeを参照してください。
カテゴリー分類方法はCategories.Generateで行うので、sub UniqueValueCategoryと大して変わりませんよね。というか、ユニーク値では分割数を0にするですね。
カテゴリー分類を行う場合、必要な情報は、
-
どのfieldを使うか?
-
どの分割方法を使うか?
-
分割数は?
-
色指定方法は?
が必要になります。
これらをCategories Form上で作成すればOKですね。
上記の情報に見合ったcontrolを使います。
-
lsbFields → ListBox
-
cmbClassificationType → ComboBox
-
nudClassfication → NumericUpDown
-
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
カテゴリー分類の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は市町村人口と世帯数および人口密度を加えてものです。
神奈川県のサンプルshape file表示
カテゴリー分類buttonをクリックして、カテゴリー分類の設定formを表示させます。
カテゴリー分類設定画面
カテゴリー分類のcomboBoxから分類方法を決めます。
カテゴリー分類のcomboBoxから分類方法表示
色指定方法のcomboBoxから分類方法を決めます。
色指定方法のcomboBoxから分類方法表示
人口密度で10分割のカテゴリーに分類した結果です。
カテゴリー分類の表示例
カテゴリー分類の設定Formで削除button Clickでは、カテゴリーがresetされます。
いろいろな分類方法を試してみるのも良いですね。
今回のまとめ
だんだんとGISのソフトウェアっぽくなってきましたが、まだまだ、tutorialの1/3くらいと言うところでしょうか。
では、今回のまとめを
-
6種類のカテゴリー分類のcodeing実装を行いました。
-
別Formを作成して、カテゴリー分類を行いました。
vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex06のsource codeとshapefile dataを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
code
data
サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。
最後に、Layerを選択して次の操作を行うことを忘れないように。
Exercise
今回のProgramを少し発展させて以下の項目を付け加えてみてください。
-
カテゴリー設定のForm表示時に、defaultでは表示がresetされるますが、これをresetされずに現在表示している項目を表示するように変更してみる。
-
カテゴリー設定のFormを参考に、個別属性値を別Formで表示できるようにする。
-
カテゴリー設定のFormを参考に、featureの色分け指定も別Formで表示できるようにする。
-
polyLine、pointについてもカテゴリー分類してみる。
最近のコメント