GeoServerのスタイルにイメージを設定

久しぶりにGeoServerのスタイル設定をしたら忘れていたことがあったのでメモ。
ポイントのスタイルにイメージを設定する時は以下の書式でSLDを記述。

<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd">
<NamedLayer>
<Name>blue shop icon</Name>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xlink:type="simple" xlink:href="blue_shop.png"/>
<Format>image/png</Format>
</ExternalGraphic>
<Size>32</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

イメージファイルはGeoServerのData directory\ワークスペース\stylesディレクトリ直下に置く

clip_2

clip_6

google map の距離計測機能についての再考

以前、googlemapとopenlayersの距離計測について投稿。

googlemap APIもV3になり距離計算のAPIも変更されたようなので弊社の距離計算ツールとgooglemapの距離計算機能の差についてあらためて再考。

西武池袋線の清瀬駅とひばりが丘駅の距離をベースに調査。

清瀬駅の座標
139.51989499999999111、35.77196299999999951

ひばりが丘駅の座標
139.54577000000000453、35.75142900000000168

※座標は国土数値情報より入手

googlemapの距離測定機能で測ると3.26kmと表示される。

clip_2

※googlemapの地図はAPIを介して表示しないと著作権的に問題があるのでぼやかして表示

地図上のポイントをクリックして距離計測を行なうので誤差の発生を考慮して、google map apiでも計測。

var from = new google.maps.LatLng( 35.77196299999999951,139.51989499999999111);
var to = new google.maps.LatLng( 35.75142900000000168,139.54577000000000453);
var distance = google.maps.geometry.spherical.computeDistanceBetween(from, to);

clip3

やはりこちらも3269mと表示される。

弊社のの距離計測TOOLで計算すると3265mになる。

スクリーンショット 2016-08-10 11.36.09

コード,緯度,経度,名称,名称,コード,緯度,経度,名称,名称,距離,円半径
1,35.77196299999999951,139.51989499999999111,清瀬駅,清瀬駅,2,35.75142900000000168,139.54577000000000453,ひばりが丘,ひばりが丘,3265,10000
2,35.75142900000000168,139.54577000000000453,ひばりが丘,ひばりが丘,1,35.77196299999999951,139.51989499999999111,清瀬駅,清瀬駅,3265,10000

その差は4m、約0.1%の差が発生する。

国土地理院の距離と方位角の計算でもやはり3269mとなる。

スクリーンショット 2016-08-10 12.30.05

google.maps.geometry.spherical.computeDistanceBetweenは3番目の引数に半径を渡すことができる。
つまり地球を楕円体ではなく球体として計算をしていることが分かる。
※デファルトでは半径を6378137mとしているようだ。

その為、誤差が発生している。

ArcObjectsのシンボルにイメージを使用

using ESRI.ArcGIS;
using ESRI.ArcGIS.Carto;

IWorkspaceFactory featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(@"C:\work\mypoint.shp"), 0);
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(@"mypoint"));
IFeatureLayer featureLayer = new ESRI.ArcGIS.Carto.FeatureLayerClass();
featureLayer.FeatureClass = featureClass;
featureLayer.Name = "ポイント";
featureLayer.Visible = true;

IRgbColor mskrgb = new RgbColorClass();
mskrgb.Red = 255;
mskrgb.Green = 255;
mskrgb.Blue = 255;

IPictureMarkerSymbol bitmapPictureMarkerSymbolCls = new PictureMarkerSymbolClass();
bitmapPictureMarkerSymbolCls.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap, "c:\\work\\flag.bmp");
bitmapPictureMarkerSymbolCls.Angle = 0;
bitmapPictureMarkerSymbolCls.BitmapTransparencyColor = mskrgb;
bitmapPictureMarkerSymbolCls.Size = 32;
bitmapPictureMarkerSymbolCls.XOffset = 0;
bitmapPictureMarkerSymbolCls.YOffset = 0;

IGeoFeatureLayer pGeoFeatureLayer = (IGeoFeatureLayer)featureLayer;
IFeatureRenderer pSimpleRenderer = new SimpleRenderer();
pSimpleRenderer.Symbol = (ISymbol)bitmapPictureMarkerSymbolCls;
pGeoFeatureLayer.Renderer = (IFeatureRenderer)pSimpleRenderer;

axMapControl1.AddLayer(featureLayer);

ArcObjectsでOpenFeatureClassを行うとエラー0x80040351

以下を実行するとOpenFeatureClassでエラーが発生

Geodatabase.IWorkspaceFactory workspaceFactory = 
    new DataSourcesFile.ShapefileWorkspaceFactoryClass();
Geodatabase.IFeatureWorkspace featureWorkspace =                  (Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(@"C:\work"), 0);
Geodatabase.IFeatureClass featureClass = featureWorkspace1.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(@"mypoint"));

以下を実行すると正しく動作する。違いはディレクトリの階層だけ。

Geodatabase.IWorkspaceFactory workspaceFactory = 
new DataSourcesFile.ShapefileWorkspaceFactoryClass();
Geodatabase.IFeatureWorkspace featureWorkspace = (Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(@"C:\work\test"), 0);
Geodatabase.IFeatureClass featureClass = featureWorkspace1.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(@"mypoint"));

問題は明らかにSystem.IO.Path.GetDirectoryNameなのでSystem.IO.Path.GetDirectoryNameにはShapeファイルのフルパスを渡す

Geodatabase.IWorkspaceFactory workspaceFactory = 
new DataSourcesFile.ShapefileWorkspaceFactoryClass();
Geodatabase.IFeatureWorkspace featureWorkspace = (Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(@"C:\work\mypoint.shp"), 0);
Geodatabase.IFeatureClass featureClass = featureWorkspace1.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(@"mypoint"));

C#でSpatialiteにShapeをインポート

SpatialiteはSQLiteに空間データを扱う機能を拡張したデータベース。
C#からSpatialiteにアクセスするにはSQLiteの.Net ProviderとSpatialiteの拡張機能のmod_spatialite.dllを使用する。

(1)SQLiteの.net providerのダウンロード
今回は.NET Framework4.0で使用するため、以下のサイトより
https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Precompiled Binaries for 32-bit Windows (.NET Framework 4.0)である
sqlite-netFx40-binary-Win32-2010-1.0.99.0.zip
または
sqlite-netFx40-binary-bundle-Win32-2010-1.0.99.0.zip
をダウンロードし、
System.Data.SQLite.dll、
SQLite.Interop.dll
を使用

(2)mod_spatialite.dllのダウンロード
Spatialiteより
32bitならば
http://www.gaia-gis.it/gaia-sins/windows-bin-x86/mod_spatialite-4.3.0a-win-x86.7z
64bitならば
http://www.gaia-gis.it/gaia-sins/windows-bin-amd64/mod_spatialite-4.3.0a-win-amd64.7z
をダウンロード

以下のファイルが入っている(32bitの場合)
libfreexl-1.dll
libgcc_s_dw2-1.dll
libgeos-3-5-0.dll
libgeos_c-1.dll
libiconv-2.dll
liblzma-5.dll
libproj-9.dll
libsqlite3-0.dll
libstdc++-6.dll
libxml2-2.dll
mod_spatialite.dll
sqlite3.exe
zlib1.dll

(3)検証プログラムの作成

C:\temp\svg\T02.shp

を仮想テーブル「T02」に読み込む

SQLiteの.net providerを参照設定しmod_spatialite.dllと関連ファイルにPATHを通す。

using System.Data.SQLite;

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        string filename = @"c:\temp\db.sqlite";
        SQLiteConnection con = new SQLiteConnection();
        con.ConnectionString = string.Format("Data Source={0}", filename);
        con.Open();
        // 拡張DLLのロード
        using (SQLiteCommand cmd = new SQLiteCommand("SELECT load_extension(\"mod_spatialite\")", con))
        {
            cmd.ExecuteNonQuery();
            SQLiteCommand cmd2 = new SQLiteCommand("CREATE VIRTUAL TABLE T02 USING VirtualShape(\"C:\\temp\\svg\\T02\", \"CP1252\", 23032)", con);
            md2.ExecuteNonQuery();
        }
        con.Close();
        con = null;
    }
}

CP1252は文字コードなのでSHIFT JISならば[SHIFT_JIS]を設定
23032はEPSGなのでデータのEPSGを設定
VirtualShapeは以前はmod_spatialiteとは異なる拡張DLLだったが、今は同じようだ?

Networkに負荷をかけよう

ネットワークに負荷をかけて検証を行うには「Wlinee」が簡単便利。
windowsPCを使って負荷の検証ができる。
詳細は以下
http://d.hatena.ne.jp/eco31/20101118/1290074053
https://www.internetconference.org/ic2008/PDF/demo/hata-hiroaki.pdf
http://www.silvertwilight.gr.jp/weblog/archives/2008/11/wlinee.html

久しぶりのCentOSとMySQL

久しぶりにCentOSにMySQLをインストール
CentOSのバージョンはCentOS7.2 1511
※1511とは201511版らしい
もちろん64bit
MySQLのバージョンは5.7.13-1

CentOSのインストール

インストーラーも大きくかわり何気無く最小構成でインストールしたらXがインストールされなかったので、改めてX Window Gnoneを選択してインストールする。

インストール直後はなぜか日本語入力が使えなかったので、アプリケーション→システムツール→設定→地域と言語に日本語(かな漢字)を追加
※なぜか、日本語入力のON/OFFはWindowsキー+スペーらしい

MYSQLのサイトより以下のファイルをダウンロード
mysql-5.7.13-1.el7.x86_64.rpm-bundle.tar
tarコマンドで解凍

tar xvf mysql-5.7.13-1.el7.x86_64.rpm-bundle.tar

tarボールに含まれるファイル

mysql-community-client-5.7.13-1.el7.x86_64.rpm
mysql-community-common-5.7.13-1.el7.x86_64.rpm
mysql-community-devel-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.13-1.el7.x86_64.rpm
mysql-community-libs-5.7.13-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.13-1.el7.x86_64.rpm
mysql-community-server-5.7.13-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.13-1.el7.x86_64.rpm
mysql-community-test-5.7.13-1.el7.x86_64.rpm

mysql-community-embedded*は組込用なのでインストールはしない。
mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpmは過去バージョンとの互換性を提供するライブラリなので要インストール。

インストール前にMiraiDB関連のパッケージがインストールされていたら削除。

# yum list installed | grep maria
mariadb-libs.x86_64    1:5.5.47-1.el7_2    @updates 
# yum remove mariadb-libs

以下の順番でインストール

rpm -ivh mysql-community-common-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-minimal-debuginfo-5.7.13-1.el7.x86_64.rpm

C# Chartコントロール

C# Chartコントロールについてわかりきったことや忘れやすいことのまとめ

Chart.Seriesはグラフ(データ)のコレクション
Chart.ChartAreasはXY軸や目盛りのコレクション

1つの棒グラフを表示

chart1.Series.Clear();
//グラフ1
Series series = new Series();
series.Color = Color.Red;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 5);
series.Points.AddXY(2, 2);
series.Points.AddXY(3, 8);
chart1.Series.Add(series);

棒グラフ1

複数のグラフを重ねて表示するときはChart.Seriesに追加

2種類の棒グラフを重ねて表示

chart1.Series.Clear();
//グラフ1
Series series = new Series();
series.Color = Color.Red;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 5);
series.Points.AddXY(2, 2);
series.Points.AddXY(3, 8);
chart1.Series.Add(series);
//グラフ2
series = new Series();
series.Color = Color.Blue;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 3);
series.Points.AddXY(2, 1);
series.Points.AddXY(3, 5);
chart1.Series.Add(series);

棒グラフ

複数の棒グラフを表示すると重ならないように表示される。
重ねたいときはグラフ2をSeriesChartType.RangeColumnにしてグラフ幅を設定

            chart1.Series.Clear();
            //グラフ1
            Series series = new Series();
            series.Color = Color.Red;
            series.ChartType = SeriesChartType.Column;
            series.Points.AddXY(1, 5);
            series.Points.AddXY(2, 2);
            series.Points.AddXY(3, 8);
            series["PointWidth"] = "0.8";
            chart1.Series.Add(series);
            //グラフ2
            series = new Series();
            series.Color = Color.Blue;
            series.ChartType = SeriesChartType.RangeColumn;
            series.Points.AddXY(1, 3);
            series.Points.AddXY(2, 1);
            series.Points.AddXY(3, 5);
            series["PointWidth"] = "0.2";
            chart1.Series.Add(series);

棒グラフ3

グラフの説明(凡例)のテキストと表示、非表示は以下で設定

series.LegendText = "グラフ1";
series.IsVisibleInLegend = true;
カテゴリー: C#

App.configに独自セクションを追加してHashTableで読み込む

stackoverflowさん、そのままです
app.configのconfigSectionsセクションに追加セクション(MajorCommands)を記載

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MajorCommands" type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
省略・・・
  </appSettings>
  <MajorCommands>
    <add key="Standby" value="STBY"/>
    <add key="Operate" value="OPER"/>
    <add key="Remote" value="REMOTE"/>
    <add key="Local" value="LOCAL"/>
    <add key="Reset" value="*RST" />
  </MajorCommands>
</configuration>

C#ではConfigurationManagerのGetSectionでセクション以下をハッシュに読み込み

System.Collections.Hashtable nb = System.Configuration.ConfigurationManager.GetSection("MajorCommands") as System.Collections.Hashtable;
カテゴリー: C#