Quantcast
Channel: 森林土木memo
Viewing all 96 articles
Browse latest View live

地図に円を描くソフトウエアを作成しました

$
0
0
地図を表示して、そこに任意の大きさの円を描画し、
その円をKMLとして保存するソフトウエアを作成しました。


Image 2014_10_04_013132.jpg

保存した円のKMLファイルをGoogleEarthなどで表示できます。

Image 2014_10_04_015053.jpg
(Googleの地図にはモザイクを掛けて自主規制www)

円の大きさ、色、透過率の設定も行うことができます。

動作させるには、Microsoft .net Framework 3.5以降が必要です。
なのでWindowsでしか動作しません。
(Framework3.5は、Windows7に標準搭載しています)
多分Windows8でも動くと思いますが、試していないのでわかりません。

なぜこんなソフトを作成したかというと、
再生骨材などを工事で使う場合、現場から40km圏内のプラントから
運んでこないといけないという決まりがあるためです。
(他の都府県では違うかもしれませんが)

設計を行うのに、全道の近隣プラントの有無を確認しなければならず、
紙ベースだとものすごい手間だからです。

GISでも同じことができますが、森林土木担当者はほとんどGISを使用していません。
この作業のためだけに、GISを説明するのは非常に大変で、
大変な労力がかかるため、簡単に使えるこのソフトウエアを作成しました。

GoogleEarthを使って、工場の位置を記録するのはだれでもできるので、
工場の位置データはみんなで作って、このソフトウエアを活用できれば
と思ったわけです。

ソフトウエアを作るにあたって、
いろいろなWebサイト、ブログなどを参考にさせていただき、
また、OsGeoのメーリングリストでも助けていただき、
3日ほどかかって作成することが出来ました。
助けていただいた方々には、非常に感謝しています。ありがとうございました。

OpenLayersについて、少し勉強になりました。

このソフトウエアは基本的に自由に使用して頂いて構いません。
ただし、このブログ以外のWebサイトへの転載はご遠慮ください。

不具合や要望、提案などありましたらメールまたはコメント欄に記載してください。
よろしくお願いします。



[vb.net]地図に円を描くソフトウエアのコード 【その1】

$
0
0
地図に円を描くソフトウエアを公開しましたが、
このソフトウエアは、Visual Studio Express 2013 の VB.netで作成しています。
 
OpenなGISのこと】というブログに、vb.netでOpenLayersを表示できる方法が記載されており、
「こんなことができるんだ」と思ったのがきっかけです。
先人の知恵には本当に感謝します。
 
で、わたしもコードが公開されていたことに大変助けられたので、
地図で円を描く(Map円Edit)」ソフトウエアのコードを書き残しておこうと思います。
まあ、自分用のメモでもあるのですが。
 
「Map円Edit」のメインフォームは以下のようになっています。
Image 2014_10_04_013132.jpg
 
上部に地図の切り替えを行うラジオボタン、地図の中心の緯度経度を表示するテキストボックがあります。
その下には、円を作成するときに設定するテキストボックスと、KMLを作成するためのボタンがあります。
 
そして、WebBrowserコントロールが真ん中にあり、
その下に、ステータスバーを配置して、ラベルでマウスのある緯度経度を表示しています。
画像では見えませんが、円を描画した時の座標を記録しておくリストボックを
非表示で配置してあります。
 
フォームの名称は「F_地図表示」、WebBrowserコントロールの名称は「Web_地図表示」です。
まずは、フォームを表示するときのコードです。フォームのShownイベントに記載します。
フォームを表示したら、Radio_地理院地図のクリックイベントを実行して、
地理院地図を表示します。
  
Private Sub F_地図表示_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        Try
      '地図の右クリックメニューを表示しない
            Me.Web_地図表示.IsWebBrowserContextMenuEnabled = False

            'はじめは地理院地図を表示する
            Radio_地理院地図.Checked = True
            Radio_地理院地図.PerformClick() 'Radio_地理院地図のクリックイベントを実行

        Catch ex As Exception
            '例外処理でメッセージを表示
            MessageBox.Show("エラー発生(F_地図表示_Shown)" & vbCr & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try End Sub
Radio_地理院地図ボタンのクリックイベントは以下のとおりです。
sub_Opnelayers表示」プロシージャを呼び出して、地図を表示します。
地図を表示する前に、WebBrowserコントロールのbjectForScriptingプロパティに
クラス(Cls_地図表示)のインスタンスを渡します。
これで、WebBrowserをクリックしたり、マウスを移動させた時のイベントをvb側に
渡すことができるようです。
Radio_OSMRadio_GoogleMapボタンのクリックイベントも
Radio_地理院地図と全く同じものを記載します。
 
    Private Sub Radio_地理院地図_Click(sender As Object, e As EventArgs) Handles Radio_地理院地図.Click
        Try
            If Radio_地理院地図.Checked Then
                sub_OpenLayers表示()
            End If
        Catch ex As Exception
            MessageBox.Show("エラー発生(Radio_地理院地図_Click)" & vbCr & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Sub sub_OpenLayers表示()
        'ObjectForScripting WebBrowser 
        'コントロールに表示されるWebページ内のスクリプトコードから
        'アクセスできるオブジェクトを取得または設定します。
        Web_地図表示.ObjectForScripting = New Cls_地図表示 'クラスのインスタンスを渡す

        '電子国土地図表示
        Dim lat As String = txt_緯度.Text
        Dim lng As String = txt_経度.Text

        Web_地図表示.DocumentText = sub_OpenLayers表示(Double.Parse(lat), Double.Parse(lng)) 'OpenLayersの表示
        '円をKMLファイルに保存するボタンを使用不可にしておく
        Butt_円のKML作成.Enabled = False

    End Sub
クラス(Cls_地図表示)の内容は以下のとおり
WebBrowserコントロールから呼び出したいイベントやメソッドを記載しておきます。
ここではCls_地図表示は、F_地図表示とは別のファイルに作成しています。
 
Imports System
Imports System.IO
Imports System.Text
Imports System.Web
Imports System.Xml
Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Cls_地図表示
    Public Sub MouseClick(ByVal lat As Double, ByVal lng As Double)
    'マウスクリックイベント
    'マーカーをマウスの位置に表示する(STla_緯度、Stla_経度は、ステータスバーに配置した緯度経度のラベルの名称)
        F_地図表示.Web_地図表示.Document.InvokeScript("moveToPoint", _
                             {CDbl(F_地図表示.STLa_緯度.Text), _
                              CDbl(F_地図表示.StLa_経度.Text), _
                              CStr("")})

    '円をマウスの位置に表示する
        F_地図表示.Web_地図表示.Document.InvokeScript("makeCircle", _
                 {CDbl(F_地図表示.STLa_緯度.Text), _
                  CDbl(F_地図表示.StLa_経度.Text), _
              CDbl(F_地図表示.txt_円の半径.Text * 1000)})
    End Sub

    Public Sub MouseMove(ByVal lat As Double, ByVal lng As Double, ByVal myzoom As Integer)
        'マウス移動時のイベント
    'ステータスバーの緯度(STLa_緯度)経度(StLa_経度)にマウスの位置の座標を入力
    'ズームレベルをステータスバーのラベル(Stla_ズーム)に入力(地図を切り替えた時に同じズームレベルで表示するため)
        F_地図表示.STLa_緯度.Text = Format(lat, "###.######").ToString
        F_地図表示.StLa_経度.Text = Format(lng, "###.######").ToString
        F_地図表示.Stla_ズーム.Text = Format(myzoom, "#").ToString

    End Sub

    Public Sub MapDrag(ByVal lat As Double, ByVal lng As Double)
    'マップドラッグ時のイベント
    '地図を切り替えた時に同じ位置を表示するために、地図の中心位置をテキストボックに記録
        F_地図表示.txt_緯度.Text = Format(lat, "###.######").ToString
        F_地図表示.txt_経度.Text = Format(lng, "###.######").ToString
    End Sub

    Public Sub sub_リストクリア()
        'List_円の座標は非表示で配置されている。
    'kmlファイル作成時に使う座標のリストを記録している
    '円を新たに作成するときに値をクリアにするためのメソッド
    F_地図表示.List_円の座標.Items.Clear()
    End Sub
    Public Sub sub_円の座標登録(ByVal lat As Double, ByVal lng As Double)
    'List_円の座標に円の外側の頂点座標を記録するメソッド
        F_地図表示.Butt_円のKML作成.Enabled = True
        F_地図表示.List_円の座標.Items.Add(Format(lng, "###.######").ToString & "," & Format(lat, "###.######").ToString)
    End Sub

End Class
以下は、WebBrowserコントロール(web_地図表示)にOpenLayersを表示して、
各地図を呼び出すプロシージャです。 HTMLを文字列にして記入していきます。
 
Private Function sub_OpenLayers表示(ByRef lat As Double, ByRef lng As Double) As String
        'テキストボックスのバックカラーをhtml16進数に変換。円の色を設定すための準備
        Dim htmlColor As String = String.Format("#{0:X2}{1:X2}{2:X2}", txt_円の色.BackColor.R, txt_円の色.BackColor.G, txt_円の色.BackColor.B)
        
    Dim txtHtml As String = ""
        txtHtml = txtHtml & "‹html›" & vbCrLf
        txtHtml = txtHtml & "‹head›" & vbCrLf

        'チェックで地図を切り替え。地図によって呼び出すスクリプトを変える。
        If Radio_地理院地図.Checked = True Then
            txtHtml = txtHtml & "‹script src=""http://portal.cyberjapan.jp/sys/OpenLayers-current/OpenLayers.js""›‹/script›" & vbCrLf
    
        ElseIf Radio_OSM.Checked = True Then
            txtHtml = txtHtml & "‹script type=""text/javascript"" src=""http://openlayers.org/api/OpenLayers.js""›‹/script›" & vbCrLf
        
    ElseIf Radio_GoogleMap.Checked = True Then
            txtHtml = txtHtml & "‹script src=""http://openlayers.org/api/OpenLayers.js""›‹/script›" & vbCrLf
            txtHtml = txtHtml & "‹script src=""http://maps.google.co.jp/maps/api/js?v=3.5&sensor=false&language=ja""›‹/script›" & vbCrLf
        End If
    '地図表示用のスクリプト
        txtHtml = txtHtml & "‹script type=""text/javascript""›" & vbCrLf
    '共通で使用する変数の宣言
        txtHtml = txtHtml & "var map = null;" & vbCrLf
        txtHtml = txtHtml & "var markers = null;" & vbCrLf
        txtHtml = txtHtml & "var marker;" & vbCrLf
        txtHtml = txtHtml & "var layer_style; //ベクタレイヤのスタイル" & vbCrLf
        txtHtml = txtHtml & "var vectorLayer; //円を描くベクタレイヤ" & vbCrLf
        txtHtml = txtHtml & "var circle; //円のポリゴン" & vbCrLf
        txtHtml = txtHtml & "var polygonFeature = new OpenLayers.Feature.Vector();  //円のフューチャー" & vbCrLf
    '地図の表示位置
        txtHtml = txtHtml & "var initCX = " & lng.ToString.Trim & ";    //初期の経度" & vbCrLf
        txtHtml = txtHtml & "var initCY = " & lat.ToString.Trim & ";    //初期の緯度" & vbCrLf
        txtHtml = txtHtml & "var initZoomLv = " & Stla_ズーム.Text & ";    //初期のズームレベル" & vbCrLf
    '地図画像の座標参照系を指定
        txtHtml = txtHtml & "var projection3857 = new OpenLayers.Projection(""EPSG:3857"");     //真球メルカトル投影(電子国土WebシステムVer.4もこれに準拠)を定義" & vbCrLf
    '表示する座標参照系を指定
        txtHtml = txtHtml & "var projection4326 = new OpenLayers.Projection(""EPSG:4326"");     //等経緯度投影を定義" & vbCrLf
    '地図のプロパティを設定
        txtHtml = txtHtml & "function init(){" & vbCrLf
        txtHtml = txtHtml & "   var maxExtent = new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508);    //真球メルカトル投影のときの最大範囲(単位はm)" & vbCrLf
        txtHtml = txtHtml & "   var restrictedExtent = maxExtent.clone();   //真球メルカトル投影のときの最大範囲に範囲を制限" & vbCrLf
        txtHtml = txtHtml & "   var maxResolution = 156543.0339;    //真球メルカトル投影のときの最大解像度" & vbCrLf

        txtHtml = txtHtml & "   //地図表示画面のオプション設定" & vbCrLf
        txtHtml = txtHtml & "   var options = {" & vbCrLf
        txtHtml = txtHtml & "   //「controls」を設定することで、デフォルトのコントロールを破棄してコントロールを再設定" & vbCrLf
        txtHtml = txtHtml & "       controls: [" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Control.Navigation({mouseWheelOptions: {interval: 100}}),    //地図マウスイベントのハンドル設定" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Control.PanZoomBar(),    //左上のパンズームバーを設定" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Control.KeyboardDefaults(),  //キーボードをデフォルトに設定" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Control.Attribution(),   //著作表示" & vbCrLf
        'txtHtml = txtHtml & "           new OpenLayers.Control.OverviewMap(), //縮小地図の表示" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Control.LayerSwitcher()      // ベースレイヤー切り替え" & vbCrLf
        txtHtml = txtHtml & "       ]," & vbCrLf
        txtHtml = txtHtml & "       projection: projection3857,   //背景地図の地理座標系" & vbCrLf
        txtHtml = txtHtml & "       displayProjection: projection4326,  //表示の地理座標系" & vbCrLf
        txtHtml = txtHtml & "       units: ""m"",   //背景地図の単位" & vbCrLf
        txtHtml = txtHtml & "       maxResolution: maxResolution,   //背景地図の最大解像度" & vbCrLf
        txtHtml = txtHtml & "       maxExtent: maxExtent,   //背景地図の最大範囲" & vbCrLf
        txtHtml = txtHtml & "       restrictedExtent: restrictedExtent  //背景地図の表示制限範囲" & vbCrLf
        txtHtml = txtHtml & "   };" & vbCrLf
        txtHtml = txtHtml & "   map = new OpenLayers.Map('map', options);   //OpenLayers APIのMapクラスからインスタンスを作成" & vbCrLf
        txtHtml = txtHtml & "   map.addControl(new OpenLayers.Control.ScaleLine({maxWidth:200,bottomOutUnits: """" , bottomInUnits: """" ,geodesic:true}));     //スケールバーコントロール表示(最大ピクセル150、下段単位無、EPSG:3857)" & vbCrLf
        'チェックで地図を切り替え
        If Radio_地理院地図.Checked = True Then
            '地理院地図の表示
      '参考URL 「地理院地図技術情報」http://portal.cyberjapan.jp/help/development/sample.html#sample-ol2131
            txtHtml = txtHtml & "   map.addLayer(new OpenLayers.Layer.XYZ(""標準地図""," & vbCrLf
            txtHtml = txtHtml & "   ""http://cyberjapandata.gsi.go.jp/xyz/std/${z}/${x}/${y}.png"", {" & vbCrLf
            txtHtml = txtHtml & "   attribution: ""‹a href='http://portal.cyberjapan.jp/help/termsofuse.html' target='_blank'›国土地理院‹/a›""," & vbCrLf
            txtHtml = txtHtml & "   maxZoomLevel: 17"
            txtHtml = txtHtml & "   }));"
            txtHtml = txtHtml & "   //初期の中心座標を指定(経緯度で入力して、内部的に真球メルカトル座標に変換して表示)" & vbCrLf
            txtHtml = txtHtml & "   map.setCenter(new OpenLayers.LonLat(initCX,initCY).transform(projection4326,projection3857), initZoomLv); //地図の座標変換" & vbCrLf
        ElseIf Radio_OSM.Checked = True Then
      'OpenStreetMapの表示
            txtHtml = txtHtml & "   var mapnik = new OpenLayers.Layer.OSM(); //OprnStreetMapを表示する場合" & vbCrLf
            txtHtml = txtHtml & "   map.addLayer(mapnik);" & vbCrLf
            txtHtml = txtHtml & "   //初期の中心座標を指定(経緯度で入力して、内部的に真球メルカトル座標に変換して表示)" & vbCrLf
            txtHtml = txtHtml & "   map.setCenter(new OpenLayers.LonLat(initCX,initCY).transform(projection4326,projection3857), initZoomLv);" & vbCrLf
        ElseIf Radio_GoogleMap.Checked = True Then
            'GoogleMapの表示
      txtHtml = txtHtml & "   var mapCenterLatLng = new OpenLayers.LonLat(initCX, initCY); " & vbCrLf
            txtHtml = txtHtml & "   var gmap_terrain = new OpenLayers.Layer.Google(" & vbCrLf
            txtHtml = txtHtml & "       ""Google TERRAIN""," & vbCrLf
            txtHtml = txtHtml & "       {type: google.maps.MapTypeId.TERRAIN}" & vbCrLf
            txtHtml = txtHtml & "   );" & vbCrLf
            txtHtml = txtHtml & "   var gmap = new OpenLayers.Layer.Google(" & vbCrLf
            txtHtml = txtHtml & "       ""Google ROADMAP"", // the default" & vbCrLf
            txtHtml = txtHtml & "       {numZoomLevels: 20}" & vbCrLf
            txtHtml = txtHtml & "   );" & vbCrLf
            txtHtml = txtHtml & "   var gmap_hybrid = new OpenLayers.Layer.Google(" & vbCrLf
            txtHtml = txtHtml & "       ""Google HYBRID""," & vbCrLf
            txtHtml = txtHtml & "       {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 20}" & vbCrLf
            txtHtml = txtHtml & "   );" & vbCrLf
            txtHtml = txtHtml & "   var gmap_satellite = new OpenLayers.Layer.Google(" & vbCrLf
            txtHtml = txtHtml & "       ""Google SATELLITE""," & vbCrLf
            txtHtml = txtHtml & "       {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}" & vbCrLf
            txtHtml = txtHtml & "   );" & vbCrLf
            txtHtml = txtHtml & "   map.addLayers( [ gmap, gmap_terrain, gmap_hybrid, gmap_satellite] );" & vbCrLf
            txtHtml = txtHtml & "   // Google.v3 uses EPSG:3857 as projection, so we have to" & vbCrLf
            txtHtml = txtHtml & "   // transform our coordinates" & vbCrLf
            txtHtml = txtHtml & "   var projection = new OpenLayers.Projection(""EPSG:4326"");" & vbCrLf
            txtHtml = txtHtml & "   var mapCenterGoogle =  mapCenterLatLng.transform( projection, map.getProjectionObject() );" & vbCrLf
            txtHtml = txtHtml & "   map.setCenter( mapCenterGoogle, initZoomLv );" & vbCrLf
        End If
        '円を格納するレイヤを作成
        txtHtml = txtHtml & "   //円レイヤを生成" & vbCrLf
        txtHtml = txtHtml & "   layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);" & vbCrLf
        txtHtml = txtHtml & "   vectorLayer = new OpenLayers.Layer.Vector(""円"", {style: layer_style});" & vbCrLf
        txtHtml = txtHtml & "   map.addLayer(vectorLayer);" & vbCrLf

        txtHtml = txtHtml & "   // Styleの設定" & vbCrLf
        txtHtml = txtHtml & "   var styleMap = new OpenLayers.StyleMap(OpenLayers.Util.applyDefaults(" & vbCrLf
        txtHtml = txtHtml & "       {fillColor: ""green"", fillOpacity: 1, strokeColor: ""black""}," & vbCrLf
        txtHtml = txtHtml & "       OpenLayers.Feature.Vector.style[""default""]" & vbCrLf
        txtHtml = txtHtml & "   ));" & vbCrLf
    
    'イベントの登録
        txtHtml = txtHtml & "   // Mapにクリックイベントを登録" & vbCrLf
        txtHtml = txtHtml & "   map.events.register('click', map, onMouseClick);" & vbCrLf
        txtHtml = txtHtml & "   map.events.register('mousemove', map, onMouseMove);" & vbCrLf
        txtHtml = txtHtml & "   markers = new OpenLayers.Layer.Markers( ""Markers"" );" & vbCrLf
        txtHtml = txtHtml & "   map.addLayer(markers);" & vbCrLf
        txtHtml = txtHtml & "}" & vbCrLf

        txtHtml = txtHtml & "// mouseclickイベント" & vbCrLf
        txtHtml = txtHtml & "function onMouseClick(evt) {" & vbCrLf
        txtHtml = txtHtml & "   // クリック地点の座標を取得" & vbCrLf
        txtHtml = txtHtml & "   var lonlat = map.getLonLatFromViewPortPx(evt.xy);" & vbCrLf
        txtHtml = txtHtml & "   // 地図座標に変換" & vbCrLf
        txtHtml = txtHtml & "   lonlat.transform(projection3857, projection4326);" & vbCrLf
        '.NETのSubroutineを呼び出す。
        txtHtml = txtHtml & "   window.external.MouseClick(lonlat.lat, lonlat.lon);" & vbCrLf
        txtHtml = txtHtml & "}" & vbCrLf

        txtHtml = txtHtml & "// mousemoveイベント" & vbCrLf
        txtHtml = txtHtml & "function onMouseMove(evt) {" & vbCrLf
        txtHtml = txtHtml & "   var lonlat = map.getLonLatFromViewPortPx(evt.xy);" & vbCrLf
        txtHtml = txtHtml & "   var zoom = map.getZoom();" & vbCrLf 'ズームレベルを取得
        txtHtml = txtHtml & "   // 地図座標に変換" & vbCrLf
        txtHtml = txtHtml & "   lonlat.transform(projection3857, projection4326);" & vbCrLf
        '.NETのSubroutineを呼び出す。
        txtHtml = txtHtml & "   window.external.MouseMove(lonlat.lat, lonlat.lon, zoom);" & vbCrLf
        '地図のセンターの座標を取得し、テキストボックスに入力する
        txtHtml = txtHtml & "   var slonlat = map.getCenter();" & vbCrLf
        txtHtml = txtHtml & "   slonlat.transform(projection3857, projection4326);" & vbCrLf
        txtHtml = txtHtml & "   window.external.MapDrag(slonlat.lat, slonlat.lon);" & vbCrLf

        txtHtml = txtHtml & "}" & vbCrLf

        'Markerの描画
        txtHtml = txtHtml & "// mousemoveイベント" & vbCrLf
        txtHtml = txtHtml & "function moveToPoint(Lat, Lng, strTitle) {" & vbCrLf
        txtHtml = txtHtml & "   var lonlat = new OpenLayers.LonLat(Lng,Lat).transform(projection4326,projection3857);" & vbCrLf
        txtHtml = txtHtml & "   map.setCenter(lonlat);" & vbCrLf
        txtHtml = txtHtml & "   // markerの描画" & vbCrLf
        txtHtml = txtHtml & "   markers.removeMarker(marker);" & vbCrLf '既にあるマーカーを削除
        txtHtml = txtHtml & "   marker = new OpenLayers.Marker(lonlat);" & vbCrLf
        txtHtml = txtHtml & "   markers.addMarker(marker);" & vbCrLf
        txtHtml = txtHtml & "}" & vbCrLf

        '円のポイントを計算して、ポリゴンで描画
        '参考にしたサイト 「KERNEL BLOG II」 http://mng.seedcollector.net/blog/?p=244
        '              「Debianでka-Mapのメモ」 http://nobmob.blogspot.jp/2009/03/openlayers-17a.html

        txtHtml = txtHtml & "   function makeCircle(Lat, Lng, radius){" & vbCrLf
        txtHtml = txtHtml & "       window.external.sub_リストクリア();   //フォームのリストクリア" & vbCrLf

        txtHtml = txtHtml & "       vectorLayer.removeFeatures(polygonFeature);" & vbCrLf
        txtHtml = txtHtml & "       //円のスタイル設定" & vbCrLf
        txtHtml = txtHtml & "       var style_circle = {" & vbCrLf
        txtHtml = txtHtml & "           strokeColor: """ & htmlColor & """," & vbCrLf
        txtHtml = txtHtml & "           fillColor: """ & htmlColor & """," & vbCrLf
        txtHtml = txtHtml & "           fillOpacity: " & txt_透明度.Text / 100 & ",    // 内側の透明度" & vbCrLf
        txtHtml = txtHtml & "           strokeWidth: 2 // 外周の太さ" & vbCrLf
        txtHtml = txtHtml & "       };" & vbCrLf
        txtHtml = txtHtml & "       var apex = 360;  //多角形の頂点の数" & vbCrLf
        txtHtml = txtHtml & "       var lonlat = new OpenLayers.LonLat(Lng,Lat);    //中心の座標(緯度経度)" & vbCrLf
        txtHtml = txtHtml & "       var angle;  //中心点から頂点への角度" & vbCrLf
        txtHtml = txtHtml & "       var new_lonlat; //頂点の座標(緯度経度)" & vbCrLf
        txtHtml = txtHtml & "       var pointList = []; //ポリゴン用のポイントのリスト" & vbCrLf
        txtHtml = txtHtml & "       for (var i = 0; i ‹ apex+1; i++) {  //頂点の数分繰り返す(最後ははじめの点に戻る)" & vbCrLf
        txtHtml = txtHtml & "           angle = (i * 360 / apex) + 0;   //角度の計算" & vbCrLf
        txtHtml = txtHtml & "           new_lonlat = OpenLayers.Util.destinationVincenty(lonlat, angle, radius);    //頂点の座標を計算(緯度経度)" & vbCrLf
        txtHtml = txtHtml & "           window.external.sub_円の座標登録(new_lonlat.lat, new_lonlat.lon); //フォームのListBoxに座標を登録" & vbCrLf

        txtHtml = txtHtml & "           var newPoint = new OpenLayers.Geometry.Point(new_lonlat.lon, new_lonlat.lat);   //頂点をポイントとして登録" & vbCrLf
        txtHtml = txtHtml & "           pointList.push(newPoint);   //ポイントリストにポイントを入れる" & vbCrLf
        txtHtml = txtHtml & "       };" & vbCrLf
        txtHtml = txtHtml & "       var linearRing = new OpenLayers.Geometry.LinearRing(pointList); //ポイントリストからポリゴンを作成" & vbCrLf
        txtHtml = txtHtml & "       linearRing.transform(projection4326, projection3857); //地図の座標系に変換" & vbCrLf
        txtHtml = txtHtml & "       polygonFeature = new OpenLayers.Feature.Vector(" & vbCrLf
        txtHtml = txtHtml & "           new OpenLayers.Geometry.Polygon([linearRing]), null, style_circle); //円のポリゴンを作成" & vbCrLf
        txtHtml = txtHtml & "       vectorLayer.addFeatures([polygonFeature]);  //レイヤに追加" & vbCrLf
        txtHtml = txtHtml & "   }" & vbCrLf

        txtHtml = txtHtml & "‹/script›" & vbCrLf
        txtHtml = txtHtml & "‹/head›" & vbCrLf

        txtHtml = txtHtml & "‹body onload=""init();""›" & vbCrLf
    
    '地図の表示範囲を設定
        txtHtml = txtHtml & "‹div id=""map"" name=""map"" style=""width:100%; height:98%;""›‹/div›" & vbCrLf
        txtHtml = txtHtml & "‹/body›" & vbCrLf
        txtHtml = txtHtml & "‹/html›" & vbCrLf

        sub_OpenLayers表示 = txtHtml

    End Function
イベント部分に記載していある「window.external」で、
WebBrowserコントロールの「.ObjectForScripting」プロパティに設定した
クラス(Cls_地図表示)内のイベントやメソッドを呼び出して実行することができます。
 
次回は、円をkmlファイルに保存する部分を書きたいと思います。
つづく→【その2】

[vb.net]地図に円を描くソフトウエアのコード 【その2】

$
0
0
【その1】はこちら  ソフトウエア「Map円Edit」はこちら
 
今回は、円の図形と中心のマーカーをkmlファイルに出力する方法の説明です。
kmlファイルは、xmlファイルの一種です。
vb.netでは、xmlファイルを簡単に作ることができます。
今回の方法は、xmlWriterを使って、1行づつ書き込んでいく方法です。 
 
vb.netでのxmlファイルの作成方法は、この記事が参考になると思います。
 
まずは、Kmlに変換するボタンのクリックイベントを説明します。
ボタンの名称は「Butt_円のKML作成」です。
保存するファイル名を指定するため、SaveFileDialogコントロールもフォームに配置しています。
SaveFileDialogコントロールの名称は「SaveFileDialog_KML」としています。
 
    Private Sub Butt_円のKML作成_Click(sender As Object, e As EventArgs) Handles Butt_円のKML作成.Click
        Try
            'ファイル保存ダイアログを開いて、保存するファイル名を指定します。
            SaveFileDialog_KML.Filter = "KMLファイル(*.KML)|*.kml|すべてのファイル(*.*)|*.*"
            SaveFileDialog_KML.FilterIndex = 1
            SaveFileDialog_KML.Title = "KMLファイルの保存先"

            If SaveFileDialog_KML.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
                'キャンセルボタンを押された時の処理
                MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Stop)
                Exit Sub
            End If
            
            'クラス「XML_Edit」の「sub_kml円作成」メソッドを呼び出します。
            '引数は、KMLファイルのフルパスを渡しています。
            XML_Edit.sub_kml円作成(SaveFileDialog_KML.FileName)

            'ファイルが作成されたら、メッセージを表示して、kmlファイルに関連付けられたソフトでファイルを開きます。
            MessageBox.Show("KMLが保存されました。", "KML保存完了", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(SaveFileDialog_KML.FileName)

        Catch ex As Exception
            '例外処理
            MessageBox.Show("エラー発生(Butt_円のKML作成_Click)" & vbCr & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub
次に上のプロシージャで呼び出しているクラス「XML_Edit」の内容です。
xmlの編集を行うために、「System.xml」をインポートしておきます。
 
Imports System.Xml

Public Class XML_Edit
    Public Shared Sub sub_kml円作成(D_Path As String)
        'D_Pathはフルパスを指定

        Dim writer As XmlWriter = Nothing     'xmlwriterクラス
        Dim settings As XmlWriterSettings = New XmlWriterSettings()

        'テキストボックスのバックカラーをhtml16進数に変換 KMLの場合、赤と青が逆なので注意
        Dim htmlColor As String = String.Format("{0:X2}{1:X2}{2:X2}", F_地図表示.txt_円の色.BackColor.B, F_地図表示.txt_円の色.BackColor.G, F_地図表示.txt_円の色.BackColor.R)
        '透過率をhtml16進数に変換
        Dim html透過 As String = CStr(Hex(F_地図表示.txt_透明度.Text * 2.55)) '100%が255になるので、2.55倍する

        'ファイル名から、KMLドキュメントの名前を設定
        Dim myName As String = System.IO.Path.GetFileNameWithoutExtension(D_Path)

        '文字コードを指定
        settings.Encoding = System.Text.Encoding.UTF8    'kmlはUTF-8で記述する
        'settings.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        'インデントを設定すると、改行されて出力される
        settings.Indent = True
        settings.IndentChars = vbTab

        '書き込み先のテキストファイル 

        writer = XmlWriter.Create(D_Path, settings)    'この時点で空のxmlファイルが作成される

        'XML作成開始
        writer.WriteStartDocument()

        'ルート要素<kml>の宣言
        writer.WriteStartElement("kml")
        'ここはエラーになるので記述しない。記述がなくてもGoogleEarthでは読み込める。
        'writer.WriteAttributeString("xmlns", "", "http://www.opengis.net/kml/2.2")
        'writer.WriteAttributeString("xmlns:gx", "", "http://www.google.com/kml/ext/2.2")
        'writer.WriteAttributeString("xmlns:kml", "", "http://www.opengis.net/kml/2.2")
        'writer.WriteAttributeString("xmlns:atom", "", "http://www.w3.org/2005/Atom")

        writer.WriteStartElement("Document")
        writer.WriteElementString("name", myName)

        'ポイントやポリゴンのスタイルの記述
        writer.WriteStartElement("Style")
        writer.WriteAttributeString("id", "", "PolyStyle")    'スタイルを使うときはidで呼び出す
        writer.WriteStartElement("IconStyle")
        writer.WriteElementString("scale", "1.0")    'アイコンの大きさ
        writer.WriteStartElement("Icon")
        writer.WriteElementString("href", "http://maps.google.com/mapfiles/kml/paddle/pink-circle.png")    'アイコンの画像
        writer.WriteEndElement() 'Iconタグ終わり
        writer.WriteStartElement("hotSpot")    'アイコンの位置などの設定
        writer.WriteAttributeString("x", "", "32")
        writer.WriteAttributeString("y", "", "1")
        writer.WriteAttributeString("xunits", "", "pixels")
        writer.WriteAttributeString("yunits", "", "pixels")
        writer.WriteEndElement() 'hotSpotタグ終わり
        writer.WriteEndElement() 'IconStyleタグ終わり
        writer.WriteStartElement("LineStyle")    '線のスタイル
        '色は透過率2桁(16進数)+色コード(BGRの16進数)
        writer.WriteElementString("color", "ff" & htmlColor) '透過100%
        writer.WriteElementString("width", "3") '線の太さ
        writer.WriteEndElement() 'LineStyleタグ終わり
        writer.WriteStartElement("PolyStyle")    '塗りつぶしのスタイル
        writer.WriteElementString("color", html透過 & htmlColor)    '塗りつぶしの色
        writer.WriteEndElement() 'PolyStyleタグ終わり
        writer.WriteEndElement() 'Styleタグ終わり

        'スタイルマップのタグの記述
        writer.WriteStartElement("StyleMap")
        writer.WriteAttributeString("id", "", "circleStyle")    '地物はこのidでスタイルを設定する
        writer.WriteStartElement("Pair")
        writer.WriteElementString("key", "normal")
        writer.WriteElementString("styleUrl", "#PolyStyle")    '上で記述したスタイルのタグを呼び出し
        writer.WriteEndElement() 'Pairタグ終わり
        writer.WriteStartElement("Pair")
        writer.WriteElementString("key", "highlight")
        writer.WriteElementString("styleUrl", "#PolyStyle")
        writer.WriteEndElement() 'Pairタグ終わり
        writer.WriteEndElement() 'StyleMapタグ終わり

        'フォルダの作成
        writer.WriteStartElement("Folder")
        writer.WriteElementString("name", myName)    'ファイル名をフォルダ名に使用
        '円のポリゴン
        writer.WriteStartElement("Placemark")
        writer.WriteElementString("name", F_地図表示.txt_円の半径.Text & "kmの円")
        writer.WriteElementString("styleUrl", "#circleStyle")    'スタイルを呼び出し
        writer.WriteStartElement("Polygon")
        writer.WriteElementString("tessellate", "3")
        writer.WriteStartElement("outerBoundaryIs")
        writer.WriteStartElement("LinearRing")

        Dim my座標 As String = ""
        'リストボックスから、座標のテキストを作成
        For i = 0 To F_地図表示.List_円の座標.Items.Count - 1
            my座標 = my座標 & F_地図表示.List_円の座標.Items(i) & ",0 "

        Next
        writer.WriteElementString("coordinates", my座標)    '円ポリゴンを作成

        writer.WriteEndElement() 'LinearRingタグ終わり
        writer.WriteEndElement() 'outerBoundaryIsタグ終わり
        writer.WriteEndElement() 'Polygonタグ終わり
        writer.WriteEndElement() 'Placemarkタグ終わり
        '中心点のアイコン
        writer.WriteStartElement("Placemark")
        writer.WriteElementString("name", "中心点")
        writer.WriteElementString("styleUrl", "#circleStyle")
        writer.WriteStartElement("Point")
        writer.WriteElementString("coordinates", F_地図表示.txt_マーカー経度.Text & "," & F_地図表示.txt_マーカー緯度.Text & ",0") '3つめの値は高さ

        writer.WriteEndElement() 'Pointタグ終わり
        writer.WriteEndElement() 'Placemarkタグ終わり
        writer.WriteEndElement() 'Folderタグ終わり

        writer.WriteEndElement() 'Documentタグ終わり
        writer.WriteEndElement() 'kmlタグ終わり

        'XMLドキュメントの終了
        writer.WriteEndDocument()    'xmlファイルの記述終了

        'Write the XML to file and close the writer.
        writer.Flush()    'xmlwriterの終了
        writer.Close()    'xmlwriterを閉じる→ファイルが作成される
    End Sub

End Class
上のコードはxmlを1行づつ作成していく方法です。
vb.netで使えるxmlwriterクラスを使用します。
WriteStartDocument」でxmlの記述を初めて、
WriteStartElement("****")」でタグを開始します。
「WriteEndElement()」でタグを閉じます。
1行でタグを記載する場合には、「WriteElementString("タグ名", "内容")」と記載します。
タグのはじめにidなどの要素を記述する場合には、
WriteAttributeString("要素名", "", "内容")」と記載しします。
WriteStartElement("****")」と「WriteEndElement()」の数が合わないと、
エラーになるので注意してください。
 
以上で、円のkmlファイルを作成することができます。
kmlのタグの意味などは、Webサイトに沢山情報がありますので、
そちらで確認して下さい。
コードに間違いや不具合があった場合には、コメント欄で教えていただければと思います。
なお、今回のコードのライセンスについては、「CC-BY」としますので、
自由に使用して頂いて構いません。
by.png

第54回治山研究発表会

$
0
0
平成26年10月8日に東京オリンピック記念センターで行われた
治山研究発表会に出場しました。

第4セクションの「治山施設の維持管理、普及部門」で発表を行い、
なんと
最優秀賞を頂きました。

協力していただいた職場の方々、ありがとうございました。

内容は、
タブレットコンピューターを利用した治山施設の把握手法の試行」です。

こちらのSlideShareにスライド資料をアップしていますので、参考としてください。

~追記~
Youtubeにもアップしました。






FOSS4G Tokyo 2014

$
0
0
11月1日から2日に行われる、FOSS4G Tokyoに参加します。
私は1日の最後の全体セッションにパネラーとして出ます。
テーマは「初心者にGISをどう広めるか」
うーん、難しいテーマです。

多分、すごく面白いので、お近くの方は是非お越しください。

Geopaparazzi4のSpatialiteの作り方

$
0
0
2014年11月1日から2日に開催されたFOSS4G 2014 Tokyoにおいて、
Geopaparazziの開発者であるAndrea氏と直接話をできる
機会を作っていただいた。

そこで、Geopaparazziがバージョン4にバージョンアップしたことによる
疑問点が幾つか解決したのでメモしておきます。
同じようにつまずいている方は参考にしてください。

疑問1 ノートなどのアイコンが表示されない
地図画面で右上の設定アイコンを長タップすると表示される。
(この問題は事前に説明を受けていました)

疑問2 バージョン3では表示されていたSpatialiteデータが表示されない
これは今回一番の問題点でしたが見事解決しました。
以下ShapeファイルからSpatialiteを作成する手順を説明します。
1.Spatialite_guiのVer1.7以上を準備する
 からダウンロードできます。

2.ShapeファイルからSpatialiteを作る場合には、
 Shapeファイルを保存しているフォルダ名、ファイル名に日本語を含まないようにする
 Spatialite_guiでは日本語を含むフォルダ名やファイル名は対応していません。
 QGISなどで、日本語を含まないフォルダ名とファイル名で保存しておきましょう。
Image 2014_11_02_235938.jpg Image 2014_11_03_000039.jpg


3.Spatialite_guiを起動して、ShapeファイルをSpatialiteのテーブルに変換する。
 Spatialite_guiを起動し、左から2番めのアイコン
 「Creating new(empty) SQLite DB」を選択します。
 ファイル名は日本語が含まれても構いません。
Image 2014_11_03_001947.jpg

Image 2014_11_03_002147.jpg

次に「Load Shapefile」アイコンをクリックして、
Shapeファイルを選択します。
Image 2014_11_03_002327.jpg

「Table name」にデータの名前を入力します。
ここも日本語が含まれても構いませんが、名前の先頭に数字は使わないでください。
例えば、「01_テストデータ」とかはダメです。
「SRID」には、ShapeFileのEPSGを入力します。
EPSGとは、座標参照系の番号です。
QGISなどで確認しておいてください。
「Charset Encoding」は、日本語のShift_jisの場合は、
「CP932」を選択してください。
最後に、「With Spatialite Index」にチェックを付けます。
「OK」ボタンをクリックすると、データがテーブルに表示されます。
Image 2014_11_03_002524.jpg
Image 2014_11_03_003341.jpg

必要なデータ分を繰り返します。
フィールド名が長かったり、カンマなどが含まれていると失敗するようです。
フィールドを結合している場合などは注意してください。

4.SpatialiteデータをAndroid端末の「maps」フォルダにコピーする。
 作成したSpatialiteデータをAndroid端末の「maps」フォルダにコピーします。

5.Geopaparazziで地図データの再読み込みをする。
 コピーしたデータは、Geopaparazzi起動時に読み込まれますが、
 新しいSpatialiteは、再読み込みが必要です。
 Geopaparazziを起動し、左上の設定ボタンをタップして、
 「設定」を選択します。
 「Spatialite Preferenes」を選択し、「Spatialite Recovery Mode」
 にチェックを付けます。
 メニュー画面に戻って、再度設定ボタンをタップし、「終了」を選択します。
 「すべてのセンサーを停止しました」の表示が消えたら、
 Geopaparazziを再起動します。

これで、Spatialiteデータが表示されるようになったはずです。

==========================
Geopaparazzi4から、ポリゴンの編集ができるようになっています。
画面下の鉛筆マークを長タップすると編集モードになります。

==========================
今回Andrea氏には、幾つか操作性の要望も伝えました。
前向きに考えてくれるということなので、
バージョンアップに期待したいと思います。





平成26年度北の国・森林づくり技術交流発表会

$
0
0
平成27年1月29日に札幌のかでる2.7で行われた「北の国・森林づくり技術交流発表会」に参加してきました。
私の発表は以下のビデオを御覧ください。
画質が悪くて見づらいですが、ご勘弁ください。


スライドの内容は「SlideShare」で確認できます。

審査もあったのですが、森林技術部門の奨励賞を頂きました。

質問を受けていた時に話していた、地図タイルをダウンロードするソフトウエアを作成しました。
今現在は試作段階です。
ソフトの使用は自由に行ってもらって構いませんが、
地理院地図を使用する場合には、利用規約に従って使用してください。
また、不具合やエラーが有った場合には、すみやかに連絡をいただければと思います。

発表の最後に話していたGeopaparazziの使い方の説明書は、
まだ作成途中です。
でき次第アップしますのでもうしばらくお待ちください。


Geopaparazziの使い方解説を作成しました

$
0
0
先日の発表会で、Android用地図アプリGeopaparazziの使い方を小冊子にして配布しましたが、
その時には作成が間に合わなく「未完成版」としての配布でした。

この度一部修正及び加筆して何とか説明書を完成しました。
完成した説明書は現在内容を精査中ですが、
それに先立ち、Webサイトでも「Geopaparazziの使い方解説」を作成しましたので公開します。


内容は、印刷版の説明書とほぼ同等ですが、
Web版はリンクが張ってったり、ファイルのダウンロードができたりするので
より便利に使うことができます。

サイドバーにもリンクを追加しておきます。


QGIS2.8の新機能

$
0
0
ひと月ぶりの更新ですね。

2015年3月にQGIS2.8がリリースされています。
スタンドアロン版は、3月5日現在、まだダウンロード出来ないようですが、
OSGeo4W版は、ダウンロードすることが出来ます。
3月8日現在、スタンドアロン版2.8.1がダウンロードできます。
ダウンロードサイトはこちら
OSGeo4W版のインストール方法は、こちらの記事に書いてありますので参考にしてください。

QGIS2.8wien(ウィーン)は、私にとって非常に魅力的な更新がいくつかありましたので、
紹介したいと思います。

英語ですが、http://changelog.linfiniti.com/qgis/version/2.8/ に更新内容が書いてあります。
このページを参考にしています。



■ データ結合した時に結合するデータの接続文字を自由に設定できる

これは非常に嬉しい機能アップです。
以前までは、レイヤのプロパティで属性データを「結合」した場合、
結合した側のレイヤ名がフィールド名にくっついてきました。

Image 2015_03_06_225642.jpg
赤枠の部分が結合したデータです。

このようにレイヤ名がフィールド名にくっつくので、名前をつけて保存して、
Shapeファイルに保存すると、半角10文字までの制限に引っかかり、
フィールド名が変更されてしまいました。

このフォールド名の頭につける文字を自由に指定できるようになりました。
もちろん空白も指定できます。
ただし、空白の場合は、同じフォールド名が無いことを確認して下さい。
同じ名前のフィールドは表示されません。

Image 2015_03_06_230212.jpg
赤い枠の部分に接続文字列を入力します。



■ 一時的なレイヤを簡単に作成できる

ベクタレイヤは、Shapeファイルなどをレイヤとして追加しないと、図形を書くことが出来ませんでいた。
しかし、QGIS2.8からは、一時的にメモリに記録するレイヤ(スクラッチレイヤというようです)を
作成できます。
以前もプラグインなどでスクラッチレイヤを作成することが出来ましたが、
ベクタレイヤの新規作成でスクラッチレイヤを作成することが出来ます。

Image 2015_03_06_232019.jpg
ベクタレイヤの追加に、「新しい一時スクラッチレイヤ」が追加されています。

これで、ちょっと図形を書きたいときなどに、いちいちShapeファイルを作らなくても、
ベクタレイヤを追加することが出来ます。

スクラッチレイヤは、一時的なレイヤなので、QGISを閉じると図形は消えてしまいます。
消したくない場合は、名前をつけて保存で、Shapeファイルなどに保存してください。



■ 属性データの更新に、選択したものだけを更新するボタンが追加された

属性データを更新する場合には、フィールド計算機を起動しなくても属性テーブルの上段で、
計算式を入力し、データの更新が行えますが、ここに、「選択の更新」ボタンが追加されました。
選択した行だけを更新できます。

Image 2015_03_06_232604.jpg



■ 地物の追加時に線の長さや、角度が指定できる

「先進的なデジタイズ」ツールバーに三角定規のようなアイコンが追加されていて、
地物の新規追加時に有効になります。
このアイコンを有効にすると、線の長さや角度を指定して図形を作図できます。
まるでCADのようです。

Image 2015_03_06_233054.jpg

定規のようなアイコンが追加されている。

以前はImproved Polygon CapturingプラグインやCADToolsプラグインで
行っていたのですが、それが標準で出来るようになりました。これは便利!

Image 2015_03_06_233442.jpg

100mの長さの25度の線を引いたところ
dに100と入力し、aに25と入力する

スナップを有効にすると、すでにある線から垂直や平行な線、
また、作図モードボタンを有効にすると、
任意の点からの距離なども指定できます。
(作図モードを使用する場合、任意の点をクリックしたら、作図モードをオフにする必要があります)



■ スナップの改良

作図時のスナップも改良されています。
(スナップは<設定>→<スナップオプション>)
「カレントレイヤ」と、「全てのレイヤ」が選択できるようになっています。
今までと同じ、レイヤを選択するモードもあります。

Image 2015_03_06_235554.jpg

選択できるようになっています。



■ 「ルールに基づいた」でスタイル設定した時のレイヤのツリー表示

レイヤのスタイル設定を「ルールに基づいた」にした場合で、
ルールにサブルールを作った場合、2.6までは、レイヤの表示がツーリー表示にならなくて
表示非表示の切り替えがしづらかったのが改良されています。

Image 2015_03_07_002600.jpg

ルールに基づいたで、「現在のルールを改良する」ボタンでサブルールを作る。


Image 2015_03_07_002325.jpg Image 2015_03_07_002351.jpg

左が2.6の場合、右が2.8の場合で、2.8はレイヤがツリー表示になっている



■ 一つのレイヤに複数のスタイルを設定できる

レイヤに複数のスタイルを設定し、簡単に切り替えることが出来ます。

Image 2015_03_07_003448.jpg
レイヤ右クリック→スタイルで切り替えられます。



■ キャンパスが回転できます

地図画面を回転することが出来ます。

Image 2015_03_07_003748.jpg

回転角度を指定でき ます

タイルマッププラグインなどはまだ対応していないようです。



以上、QGIS2.8の新機能の中から、私の気になったものを幾つかピックアップしてみました。
ほかにも、コンポーザーの関係や、ラスタレイヤのスタイルなど、
便利になった機能がありますので、ぜひ確かめてみてください。



<お知らせ>
林業専門誌「現代林業」2015年4月号に私のインタビュー記事が掲載されます。
また、5月号、6月号でQGISを森林GISとして使っていくためのノウハウを
記事として掲載していただく予定です。

林業関係の方、そうでない方も、ぜひお読みいただければと思います。

現代林業のページ




QGISのPhoto2Shapeプラグインのエラー対処法

$
0
0
2015年4月現在、QGISのPhoto2Shapeプラグインのバージョンは0.5なのですが、
標準の状態でQGISのプラグインインストーラーを使ってインストールすると、
「プラグインが壊れています」というエラーが発生します。

QGISプラグインの公式チケットにはエラーの対処法が書いてあったのですが、
イマイチ理解できませんでした。

OSGeoのメーリングリストで質問したところ解決しましたので、
メモしておきます。
(M島さんありがとうございました)

<対処方法>
  1. 次のページにアクセスして、「Downloads↓」ボタンをクリックします。
    https://pypi.python.org/pypi/ExifRead

  2. 「ExifRead-2.0.2.tar.gz(md5)」をダウンロードして、解凍します。

  3. 解凍されたフォルダの中の「exifread」フォルダをコピーします。

  4. スタンドアロン版のQGISの場合、インストールしたフォルダの、
    \apps\Python27\Lib\site-packages
    に貼り付けます。
    (標準であれば「D:\Program Files\QGIS Wien\apps\Python27\Lib\site-packages」)

  5. Photo2shapeプラグインをインストールします。

以上で使用することが出来るようになりました。

なお、Photo2Shapeプラグインの使い方などは、
こちらのサイトが詳しいので参考にしてください。


新しいバージョンでは、サブディレクトリの検索と、既存のファイルへの追加が
出来るようになったようです。

Image 2015_04_14_235008.jpg



FOSS4G Hokkaido 2015に参加してきました

地理院の地図コンテンツの利用規約がわかりづらい?

$
0
0
現在、国土地理院の地図は、地理院地図として地図タイルで利用できるようになっています。

この地理院地図の地図タイル画像(「地理院タイル」といいます)を利用するために、
利用規約があるのですが、イマイチわかりづらいということで、
わかりやすまとめてみようと思います。

ただし、国土地理院に確認した事項もありますが、私がWebサイトを読んで、
理解した項目もあるので、実際に利用するためには、国土地理院にお問い合せください。


地理院コンテンツとは?

 まず、利用規約を読んでわかりづらいのが、「地理院コンテンツ」という言葉です。
地理院コンテンツとは、国土地理院が提供するデータのことです。

地理院地図のタイル画像、空中写真、基盤地図情報のダウンロードデータなど、
国土地理院のホームページでダウンロード出来るデータが、すべて「地理院コンテンツ」です。

 利用規約は、すべての地理院コンテンツに共通する事項が記載されています。


出典明示だけで地図が使えるのか?

 一見、利用規約だけ見ると、出典明示だけで地図が自由に使えるような気がしますが、
実はほとんどの地図は自由には使えません。

 そこには、利用規約に書いてある
4) 個別法令による利用の制約があるコンテンツについて
が適用される地図があるためです。

 「個別法令」とは、おもに「測量法」です。
測量法の「29条(使用)」と「30条(複製)」に関する事項が適用され、申請が必要となります。

 基盤地図情報などは「基本測量成果」なので、当然測量法に基づく申請が必要になります。

 そして、地理院タイルも元は基盤地図情報を使っているものは、「基本測量成果」なので申請が必要です。


どの地図が基本測量成果なのか?

 では、地理院タイルのどの地図が「基本測量成果」を使用しているのでしょうか?
これは、地理院タイルの一覧で確認することが出来ます。

この一覧で、緑色になっていて、備考欄に
この地理院タイルは基本測量成果(名称:電子地形図(タイル))です。
と記載されている地図が、すべて基本測量成果です。

「標準地図」、「淡色地図」は、基本測量成果ですので、使用または複製の申請が必要です。



申請なしで利用できる範囲

 上記のような基本測量成果を利用した地図でも、使用方法によっては申請なしで利用できます。

<出典明示して利用できる(申請不要)>
   刊行物の場合、1ページに対する画像の大きさや、Webページに載せる画像の大きさで、
   申請が必要ななる場合がありますので注意が必要です。

<出典明示をしなくても利用できる(申請不要)>

 これらは、「承認申請Q&A」のページがわかりやすく書いてあるので、参照してください。


二次利用する場合には?

 すでに「使用」や「複製」された地理院地図を、二次利用する場合には、
元の地理院地図と同じ条件で、申請が必要かどうか決まります。

 つまり、「刊行物に少量の地図を挿入した地図画像」(申請なしで出典明示)したものを、
インターネットに載せる場合には、画像サイズによって複製の申請が必要になります。


Web地図で利用する場合は?

 OpenlayersやLeafletなどのWeb地図の背景に地理院地図を使う場合は、
地理院コンテンツの利用規約が適用され、出典明示で利用できるようです。(多分)

 これは、動的に地図を切り替えることが可能で、
ズームレベル、表示範囲も自由に変更できる状態であることが必要です。



以上、地理院地図の利用規約について、少しまとめてみました。
もしかしたら間違っているところもあるかもしれませんので、その際はコメントください。




QGISの解説本が最近多いよ

$
0
0
当ブログでもQGISの解説書を公開していますが、
「QGISマニュアル」はVer1.8対応なので少し古いです。
「QGISで森林GISマニュアル」は、Ver2対応ですが、現在(2015年9月)では、
QGISはVer2.10.1となっており、画面の表示や機能が追加されていたり、
少々こちらも古くなってきています。

以前までは発売しているQGISの解説本もVer1.x対応が多かったですが、
最近はVer2対応の解説本も増えてきました。

私の記録用としても、ここで一度まとめておこうと思います。


■[オープンデータ+QGIS]統計・防災・環境情報がひと目でわかる地図の作り方


bousaiGIS.jpg

行政機関などで公開されている「オープンデータ」を、QGISを使って視覚的にわかりやすく表現する方法を解説されています。
いくつかの章に分かれて様々なデータの扱い方が書かれていて、非常にわかりやすいです。
GISの基本や座標参照系などもわかりやすく解説されています。

ある程度QGISを使ったことのある人が、もう一歩地図表現を勉強するのにいい本です。



■QGIS入門 第2版


GISnyuumonn2.jpg

QGISを初めて使うかたに、まずQGISがどのようソフトなのかわかりやすく説明している解説本です。
第1版は日本で一番初めに発売されたQGISの入門書で、2015年9月にVer2に対応した第2版が発売されました。


■フリーソフトでここまでできる 実務に使う林業GIS


ringyouGIS.jpg

QGISを林業で使うために様々な技を紹介している本です。
GoogleEarthとの連携や、GPSの利用方法なども紹介しています。
林業に特化しているので、林業者にはわかりやすい本となっています。


■QGIS自習室(Kindle版)


GISjishuusitu.jpg


AmazonのKindleのみで発売している解説本です。
目的別に分けて発売されていて、一冊100~300円ほどです。
全部買っても1000円しません。


■使ってみよう!QGIS利用ガイド


QGISriyougaido.jpg

Amazonで発売されているQGIS解説本。
2015年9月から発売されていて、「01準備編」「02レイヤ操作編」「03レイヤスタイル編」の3冊が発売されています。
今後もシリーズが発売されるようです。
こちらも100~300円と安く発売されています。
また、こちらの本は、紙の本のように表示されるので、見やすいと思います。
それにしても「球児巣 史郎(QGIS知ろう?)」って。


2015年10月3日追記
■QGISの基本と防災活用


210745.jpg


北海道大学の橋本教授によるQGISの防災活用マニュアル。
QGISを利用した防災情報の分析方法などを詳しく説明しています。
特に津波浸水データを利用して様々な分析、ハザードマップの作成など
詳しく説明しています。
最新のQGIS2.10.1で説明しています。




紙でも発売されている書籍は基本的に高いですが、
Kindleで発売されている本は非常に安いですね。

もちろん、このブログのように無料で公開されているマニュアルもありますし、
Web検索で使い方を調べることもできます。

今後もたくさんのQGIS解説本が発売されて、
色々選べるようになればいいですね。


QGISで赤色立体地図っぽい地図を作る

$
0
0
赤色立体地図というのをご存知でしょうか?
千葉達朗さんという火山研究者の方が考えだした地図なのですが、
ものすごく立体的に見える赤い地図です。
赤色立体地図の調整方法は、アジア航測が特許を持っているとのことです。

赤色立体地図は、傾斜の急な部分を濃い赤にして、
標高の高いところ明るく、低いところを暗くするとできるとのことです。

なので、QGISでそれっぽいのを作ってみました。
本当のレンダリング方法ではないので、
アジア航測の作る地図のようにはっきりとした凹凸は
表現できていないかもしれませんが、
それっぽくはできています。

Image 2015_09_26_132304.jpg



1.標高DEMデータを準備する
  • 国土地理院の基盤地図情報から標高DEMデータを作成します。
    作成方法は、こちらに記載してあります。


2.標高DEMデータから傾斜区分図を作成する
  • 傾斜区分図の作成方法は、こちらに記載してあります。
  • 作成するときに「Zファクタ」「0.5」にしておくと、傾斜が強調されます。


3.傾斜区分図のレンダリング
  • 傾斜区分図を選択し、レイヤのプロパティを開きます。
  • 「スタイル」を選択し、レンダータイプを「単バンド疑似カラー」を選択します。
    バンドを「バンド1(Gray)」にします。
  • 色の補間を「線形」にします。
  • 「+」ボタンをクリックして「0」を追加します。ラベルも「0」を入力します。
  • 「0」の色をダブルクリックして、を選択します。
  • もう一度「+」ボタンをクリックし、値を「90」にします。ラベルも「90」と入力します。
  • 「90」の色をダブルクリックして、を選択します。
  • これで傾斜が90度に近くなるほど赤が濃くなるようにできます。

     Image 2015_09_26_125410.jpg



4.標高DEMのレンダリング
  • 標高DEMを選択し、レイヤのプロパティを開きます。
  • 「レンダータイプ」を「単バンド疑似カラー」を選択します。
  • 「最小値/最大値ロード」の「累積個数によるカット」にチェックを付けます。
  • 「精度」の「実際の値(低速)」にチェックを付けます。
  • [読み込み]ボタンをクリックします。
    すると、「新規カラーマップを作成」の「最小」と「最大」に標高DEMの最小値と最大値が入力されます。
    「累積個数によるカット」で値を取得すると、最大値をなんとなく調度良い値を取得してくれます。
     Image 2015_09_26_131742.jpg
  • 「モード」を「等間隔」にして、「分類数」を「3」にします。
  • 色は後で変えるので、カラーマップはなんでも構いません。
  • [分類]ボタンをクリックすると、色リストにデータが追加されます。
     Image 2015_09_26_131943.jpg
  • 色リストの「0」は海ですので水色にします。
  • 色リストの2番めの値とラベルを「1」にしての色をグレーにします。
    グレーは少し濃い目がいいと思います。
    RGBが120~130くらいでしょうか。
  • 色リストの3番めの最大値の色を白にします。
  • カラーレンダリングの「混合モード」を「乗算」にします。

     Image 2015_09_26_131509.jpg


5.レイヤの順番を入れ替え
  • レイヤの順番を、標高DEMを上に、傾斜区分図を下にします。
    標高DEMの「カラーレンダリング」「混合モード」を「乗算」にしているので、下のレイヤの色が上に出てきます。




以上で、赤色立体地図っぽい標高地図ができました。

Image 2015_09_26_132323.jpg
北海道羊蹄山の立体地図


標高DEMの色をいろいろ調整することで、更に見やすい地図ができるかもしれません。
いろいろ試してみてください。
そして良い設定がありましたら教えて下さい。





QGISの属性テーブルを編集しやすくしよう!

$
0
0
この記事は、「FOSS4G Advent Calender2015 二個目だよ」に登録した記事です。



■ QGISのレイヤのプロパティの「フィールド」

QGISを使っていると、属性データを編集するときが良くありますが、
決まった名称を入力したいとか、選択して入力したいとか思うことが多々あります。
とくに、GISやデータベースを使い慣れていない方々に、データ入力をお願いすると、
さまざまな独自の入力をしてくれるので、いざQGISで分類しようとしたら、
ものすごくたくさんの分類ができたりします。

自由な入力を制限して、決まった語句を入力したり、
画像のファイルのパスを入力したり、チェックを付けたり、
属性テーブルの入力支援を行えるようにするのが、
レイヤのプロパティの「フィールド」の「編集ウイジェット」です。

Image 2015_12_23_152655.png
図 レイヤのプロパティの「フィールド」


私も以前から「編集ウイジェット」の存在は知っていたのですが、
あまり説明しているテキストもWeb上にないものですか、
自分で分かる範囲で説明しようと思います。

編集ウイジェットで設定した項目は、属性テーブルで使えますが、
地物を新規に作成した時の属性データ入力フォームでも使用できます。


■ 通常は「テキスト編集」

通常のフィールドの編集ウイジェットは「テキスト編集」になっています。
これは、普通にテキストや数字を入力するものです。
また、「テキスト編集」では複数行のテキストを設定する事ができます。
「マルチライン」にチェックをすることで、複数行のテキストを入力することができます。
ラベルにも複数行のラベルを表示できます。

Image 2015_12_23_154142.png
図 マルチラインにチェックすると、複数行のテキストを入力できる




■ 「バリューマップ」で決まった語句を入力

「バリューマップ」を使うと、決まった語句をコンボボックスで表示して、
選択することができるようになります。

Image 2015_12_23_154618.png
図 編集ウイジェットで「マルチライン」を選択

Image 2015_12_23_154906.png
図 設定した項目が選択できる


実際に属性データに格納されるのは、「値」に設定したデータです。
「説明」は、選択するときに表示する項目を設定します。
「値」にコード番号、「説明」にわかり易い内容を設定することもできますし、
「値」と「説明」に同じ内容を設定することもできます。

バリューマップの項目は、既存のレイヤや、CSVからも読み込めます。

リストの順序は、説明の順序になり、ABC順、あいうえお順に並ぶようです。



■ スタイルで分類している項目を選べる「分類」

レイヤのスタイルで「分類された」を選択して、分類する項目を設定している場合、
その分類している項目をコンボボックスで選ぶことができます。

Image 2015_12_23_155835.png
図 スタイルで「分類された」を選択し、分類する項目を設定

Image 2015_12_23_155807.png
図 編集ウイジェットで「分類」を選択

Image 2015_12_23_155903.png
図 スタイルで分類している項目が選択できる


■ チェックのオンオフで入力する項目を設定できる「チェックボックス」

チェックボックのオンオフで、入力する項目を設定できます。
チェックした時としていない時の値を設定しておくと、チェックボックスのオンオフで、
決まったテキストや数字を入力することができます。

Image 2015_12_23_160741.png
図 編集ウイジェットで「チェックボックス」を選択

Image 2015_12_23_160809.png
図 属性テーブルでチェックをつけると

Image 2015_12_23_160839.png
図 チェックした時の値が入力される




■ カラーコードを入力できる「色」

属性データにカラーコードを入力できるのが編集ウイジェットの「色」です。
レイヤの編集モードでは、カラー選択ボックスが表示されて、色を選択できます。
フィールドタイプは、テキストで作成します。

※しかし、Ver2.12.1では、色の選択がうまく行きません。エラーかもしれませんので、
バージョンアップでの修復に期待しましょう。

Image 2015_12_23_161705.png
図 編集ウイジェットで「色」を選択

Image 2015_12_23_161948.png
図 属性テーブルで色選択ボックスが表示されます




■ カレンダーから日付を選択できる「日付/時刻」

日付を入力するときには、編集ウイジェットで「日付/時刻」を選択すると、
カレンダーから日付を入力できます。
カレンダーを使う場合には、「カレンダーポップアップ」にチェックを付けます。
カレンダーを使わない場合は、年、月、日を上下スピンボタンで増減させます。

フィールドタイプは「日付」か「テキスト」で作成します。

Image 2015_12_23_162459.png
図 編集ウイジェットで「日付/時刻」を選択


Image 2015_12_23_162537.png
図 属性テーブルでカレンダーで日付が選択できます




■ ファイルのフルパスを入力できる「ファイル」

ファイルへのリンクなどを作成するときに、ファイルのフルパスを属性データに入力することがあります。
編集ウイジェットで「ファイル」を選択すると、ファイル選択ダイアログを表示して、
ファイルのパスを入力することができます。

Image 2015_12_23_163305.png
図 編集ウイジェットで「ファイル」を選択

Image 2015_12_23_163409.png
図 属性テーブルでファイル選択ダイアログを表示させるボタンが表示されます

Image 2015_12_23_163840.png
図 ファイルのフルパスが入力できます




■ フィールドを非表示にする「非表示」

編集ウイジェットで「非表示」を選択すると、フィールドが表示されません。
表示することが不要なフィールドは「非表示」にしておくと、フィールドが見やすくなります。
ただし、編集時に、編集することもできなくなりますので注意してください。

Image 2015_12_23_164037.png
図 編集ウイジェットで「非表示」を選択




■ 画像ファイルのフルパスを入力する「写真」

属性データに画像ファイルのフルパスを入力すると、地図上に写真を表示したりすることができます。
編集ウイジェットで「写真」を選択すると、画像ファイルを簡単に指定することができます。
画像のプレビューも属性テーブルに表示されます。

Image 2015_12_23_164848.png
図 編集ウイジェットで「写真」を選択


画像サイズは任意に設定できますが、「0」にすると、その画像の最適サイズで表示されます。

Image 2015_12_23_165130.png
図 画像ファイルをファイル選択ダイアログで選択できます

Image 2015_12_23_165453.png
図 画像ファイルを選択すると、プレビューが表示されます

Image 2015_12_23_170057.png
図 属性データをフォーム表示するとプレビューが確認できます




■ 「ユニーク値」で一度入力された値を再入力

ほかのデータですでに使われている値をもう一度入力する場合には、
編集ウイジェットで「ユニーク値」を設定します。
「編集可能」にチェックを付けると、まだ入力されていない新たな値を入力することも可能です。

Image 2015_12_23_170744.png
図 編集ウイジェットで「ユニーク値」を選択

Image 2015_12_23_171302.png
図 「編集可能」にしない場合は、全ての値が表示されます

Image 2015_12_23_171340.png
図 「編集可能」にすると、入力した文字に該当する物が表示されます(オートコンプリート)



■ ほかのレイヤの値を利用「値リレーション」

別のレイヤの値を利用したい場合には、「値リレーション」を使います。
編集ウイジェットで「値リレーション」を指定し、参照したいレイヤを選択します。
「キーカラム」は、実際に属性データに格納される値、
「値カラム」は、選択するときに表示されるデータのカラムを選択します。

Image 2015_12_23_172027.png
図 編集ウイジェットで「値リレーション」を選択

Image 2015_12_23_172105.png
図 「値カラム」で設定した値がリストに表示されます

Image 2015_12_23_172433.png
図 実際に入力される値は「キーカラム」の値です



■ 「範囲」で入力する数値を限定

フィールドタイプが整数値や小数値である場合には、編集ウイジェットの「範囲」で、
入力する値を限定することができます。

数値の最小値と最大値を設定すると、数値を選択することができます。
数値の選択方法は、スピンボタン、スライダー、ダイアルを選択できます。


Image 2015_12_23_173426.png
図 フィールドタイプが数値の場合は「範囲」を選択できます

Image 2015_12_23_173459.png
図 スピンボタンで数値を選択します


Image 2015_12_23_173539.png
図 スライダーで数値を選択します

Image 2015_12_23_173642.png
図 ダイアルで数値を選択します



このほかにも、「列挙」「リレーションの参照」「Uuidジェネレーター」「Webビュー」などがありますが、
使い方がよくわからなかったので省略します。
わかる方がいらっしゃいましたら教えて下さい。




わたしは、職場でQGISを普及しようとしていますが、一番の問題はデータの更新です。
データ更新時にいかに共通するデータの入力を行ってもらうかが一番重要で、
施設の台帳などにGISを利用しようとした時に、データの入力方法がバラバラだったら、
一括での分析や検索を行うことができません。

誰が入力しても、ある程度共通のデータを入力できるようにできる「編集ウイジェット」は
使い方によっては非常に強力な機能です。

しかし、説明しているテキストが少ないため、すこしでも同じようなことで困っている方の
参考にされば幸いです。

このブログも更新頻度がものすごく少なくなってしまいましたが、申し訳ありません。
来年はもうすこし更新頻度を上げたいと思います。



わたしは、2015年の4月~9月まで、「現代林業」という林業専門誌でQGISの紹介記事を書いていました。
このたび、現代林業の方から、QGISの本を出さないかということで、現在執筆中です。

職場の許可はまだ正式におりていませんが、多分大丈夫だろうということで、
作業は進めているところです。

内容は林業にとどまらず、QGISの基本的機能や使い方を、逆引き形式で参照できる構成としています。
また、現代林業で紹介した機能の詳しい方法や、それ以外にも林業で使える方法を具体的に説明します。

今のところ3月に出版する計画ですが、もう少し送れるかもしれません。
お楽しみに。

それでは、2015年のいろいろお世話になりました。
2016年も良い年になりますように。
今後も「森林土木MEMO」を、よろしくお願いします。




静岡県の森林情報がオープンデータに!

$
0
0
静岡県がまたやってくれました!

静岡県では従来から「森林情報共有システム(http://fgis.pref.shizuoka.jp/)」で森林の林小班を公表してきていましたが、
今度はオープンデータとして森林計画図のシェープファイル、森林簿のCSVを2016年3月7日から公開されました。

静岡県「ふじのくにオープンデータカタログ(http://open-data.pref.shizuoka.jp/)」

オープンデータは、出典明示さえ行えば誰でも、いつでも自由に利用できるデータです。

森林計画図の林小班には、樹種や林齢などの情報が保存されています。
Image 2016_03_07_100528.jpg
図:樹種で分類した小班


Image 2016_03_07_101506.jpg
図:林齢で分類した小班

森林簿は、所有者名などの個人情報以外のデータを記録しています。
ここまで出すのは素晴らしいことです。

QGISなどのGISで利用でき、静岡県内の森林関係者、研究者には非常に有用なデータとなるでしょう。
誰でも森林計画や、分析なども行えるようになると思います。

ただし、森林簿はCSVのままだと非常に重く、私のパソコンのQGISではメモリエラーとなってしましました。

そこで、高速に処理できるSpatialiteに変換したデータを作りました。
ドロップボックスに置いてますので、QGISなどで森林簿を使う方は、ぜひダウンロードして下さい。

使い方は、QGISで「Spatialiteレイヤの追加」をクリックし、「新規」ボタンでSpatialiteファイルを指定します。
「接続」ボタンをクリックし、「ジオメトリを持たないテーブルもリストする」にチェックを付け、
「静岡県_森林簿20150331」を選択します。


じつは北海道でも、一般民有林、道有林の森林情報をオープンデータ化するために、事業を進めていました。
多分2016年春くらいには公開できるのではと思いますが、見事に静岡県に先を越されてしまいました。
「全国1番」はやはり違いますね。

北海道でも森林情報をオープンデータ化するにあたり、いろいろ議論はあったそうですが、
このように他県があっさり公開すると、「なんだ」と思ってしまいます。

とにかく、必要な情報を速やかに公開し、利用してもらうというのは非常に重要です。


<追記>
静岡県が公開している森林簿CSVには、計画図のシェープファイルと結合するためのKeyフィールドがありません。
そのため、Keyフィールドを追加したSpatialiteデータを追加しました。
上記の通常の森林簿と同じフォルダに保存しています。





FOSS4G Tokyo 2014

$
0
0
11月1日から2日に行われる、FOSS4G Tokyoに参加します。
私は1日の最後の全体セッションにパネラーとして出ます。
テーマは「初心者にGISをどう広めるか」
うーん、難しいテーマです。

多分、すごく面白いので、お近くの方は是非お越しください。

Geopaparazzi4のSpatialiteの作り方

$
0
0
2014年11月1日から2日に開催されたFOSS4G 2014 Tokyoにおいて、
Geopaparazziの開発者であるAndrea氏と直接話をできる
機会を作っていただいた。

そこで、Geopaparazziがバージョン4にバージョンアップしたことによる
疑問点が幾つか解決したのでメモしておきます。
同じようにつまずいている方は参考にしてください。

疑問1 ノートなどのアイコンが表示されない
地図画面で右上の設定アイコンを長タップすると表示される。
(この問題は事前に説明を受けていました)

疑問2 バージョン3では表示されていたSpatialiteデータが表示されない
これは今回一番の問題点でしたが見事解決しました。
以下ShapeファイルからSpatialiteを作成する手順を説明します。
1.Spatialite_guiのVer1.7以上を準備する
 からダウンロードできます。

2.ShapeファイルからSpatialiteを作る場合には、
 Shapeファイルを保存しているフォルダ名、ファイル名に日本語を含まないようにする
 Spatialite_guiでは日本語を含むフォルダ名やファイル名は対応していません。
 QGISなどで、日本語を含まないフォルダ名とファイル名で保存しておきましょう。
Image 2014_11_02_235938.jpg Image 2014_11_03_000039.jpg


3.Spatialite_guiを起動して、ShapeファイルをSpatialiteのテーブルに変換する。
 Spatialite_guiを起動し、左から2番めのアイコン
 「Creating new(empty) SQLite DB」を選択します。
 ファイル名は日本語が含まれても構いません。
Image 2014_11_03_001947.jpg

Image 2014_11_03_002147.jpg

次に「Load Shapefile」アイコンをクリックして、
Shapeファイルを選択します。
Image 2014_11_03_002327.jpg

「Table name」にデータの名前を入力します。
ここも日本語が含まれても構いませんが、名前の先頭に数字は使わないでください。
例えば、「01_テストデータ」とかはダメです。
「SRID」には、ShapeFileのEPSGを入力します。
EPSGとは、座標参照系の番号です。
QGISなどで確認しておいてください。
「Charset Encoding」は、日本語のShift_jisの場合は、
「CP932」を選択してください。
最後に、「With Spatialite Index」にチェックを付けます。
「OK」ボタンをクリックすると、データがテーブルに表示されます。
Image 2014_11_03_002524.jpg
Image 2014_11_03_003341.jpg

必要なデータ分を繰り返します。
フィールド名が長かったり、カンマなどが含まれていると失敗するようです。
フィールドを結合している場合などは注意してください。

4.SpatialiteデータをAndroid端末の「maps」フォルダにコピーする。
 作成したSpatialiteデータをAndroid端末の「maps」フォルダにコピーします。

5.Geopaparazziで地図データの再読み込みをする。
 コピーしたデータは、Geopaparazzi起動時に読み込まれますが、
 新しいSpatialiteは、再読み込みが必要です。
 Geopaparazziを起動し、左上の設定ボタンをタップして、
 「設定」を選択します。
 「Spatialite Preferenes」を選択し、「Spatialite Recovery Mode」
 にチェックを付けます。
 メニュー画面に戻って、再度設定ボタンをタップし、「終了」を選択します。
 「すべてのセンサーを停止しました」の表示が消えたら、
 Geopaparazziを再起動します。

これで、Spatialiteデータが表示されるようになったはずです。

==========================
Geopaparazzi4から、ポリゴンの編集ができるようになっています。
画面下の鉛筆マークを長タップすると編集モードになります。

==========================
今回Andrea氏には、幾つか操作性の要望も伝えました。
前向きに考えてくれるということなので、
バージョンアップに期待したいと思います。





平成26年度北の国・森林づくり技術交流発表会

$
0
0
平成27年1月29日に札幌のかでる2.7で行われた「北の国・森林づくり技術交流発表会」に参加してきました。
私の発表は以下のビデオを御覧ください。
画質が悪くて見づらいですが、ご勘弁ください。


スライドの内容は「SlideShare」で確認できます。

審査もあったのですが、森林技術部門の奨励賞を頂きました。

質問を受けていた時に話していた、地図タイルをダウンロードするソフトウエアを作成しました。
今現在は試作段階です。
ソフトの使用は自由に行ってもらって構いませんが、
地理院地図を使用する場合には、利用規約に従って使用してください。
また、不具合やエラーが有った場合には、すみやかに連絡をいただければと思います。

発表の最後に話していたGeopaparazziの使い方の説明書は、
まだ作成途中です。
でき次第アップしますのでもうしばらくお待ちください。


Geopaparazziの使い方解説を作成しました

$
0
0
先日の発表会で、Android用地図アプリGeopaparazziの使い方を小冊子にして配布しましたが、
その時には作成が間に合わなく「未完成版」としての配布でした。

この度一部修正及び加筆して何とか説明書を完成しました。
完成した説明書は現在内容を精査中ですが、
それに先立ち、Webサイトでも「Geopaparazziの使い方解説」を作成しましたので公開します。


内容は、印刷版の説明書とほぼ同等ですが、
Web版はリンクが張ってったり、ファイルのダウンロードができたりするので
より便利に使うことができます。

サイドバーにもリンクを追加しておきます。

Viewing all 96 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>