ホーム » tarumi の投稿 (ページ 24)

作者アーカイブ: tarumi

OPenLayersでVectorのPointにアイコン設定

OpenLayersにはMarkerがあり、ポイントをアイコンで表示する時に非常に便利に使える。
同様にVectorにもPointがあり、これにもアイコンが設定できそう。

とりあえずリンク

http://gis.stackexchange.com/questions/33141/change-icon-of-single-vector-feature-in-layer

http://www.codechewing.com/library/add-external-graphic-icon-to-geometry-point-openlayers/

http://www.codechewing.com/demo/add-icon-to-geometry-point-openlayers/

OpenLayers タイルサーバー

以下もとりあえず、リンク

http://www.finds.jp/docs/tms/index.html.ja

OpenLayersのクラスター表示

以下はリンク集、今後まとめる

http://openlayers.org/dev/examples/strategy-cluster-threshold.html
http://openflights.org/blog/2009/10/21/customized-openlayers-cluster-strategies/
http://openlayers.org/dev/examples/strategy-cluster-extended.html
http://openlayers.org/dev/examples/strategy-cluster.html
http://stackoverflow.com/questions/6641919/openlayers-nice-marker-clustering
http://openlayers.org/dev/examples/strategy-cluster.html

OpenLayersの地図ドラッグでスクロールしすぎ!

OpenLayersの地図をdrug panすると、暫くスクロールが続いて予想以上はなれた位置まで飛んでしまう。
これを防ぐ方法はいかのようにenableKineticを無効にする
map_canvas = new OpenLayers.Map(id_map, { controls: [] });
map_canvas.addControl(new OpenLayers.Control.Navigation(dragPanOptions: {enableKinetic: false}}));

※上記の記述ではNavigation以外の全てのコントロールが無効になるため必用なコントロールを適時追加

map_canvas = new OpenLayers.Map(id_map, { controls: [] });
map_canvas.addControl(new OpenLayers.Control.Navigation({mouseWheelOptions: {interval: 1000},dragPanOptions: {enableKinetic: false}}));
//map_canvas.addControl(new OpenLayers.Control.DradPan({interval: 0}));
map_canvas.addControl(new OpenLayers.Control.PanZoomBar());
map_canvas.addControl(new OpenLayers.Control.KeyboardDefaults());

OpenLayersの円の半径

半径100mの円を表示

GoogleMap

var p = new google.maps.LatLng(y,x);
var options = {
	clickable: false,
	strokeColor: "#FF0000",
	strokeOpacity: 1.0,
	strokeWeight: 4,
	fillOpacity: 0.0,
	center: p,
	radius: Number(100)
 };
var circle = new google.maps.Circle(options);
circle.setMap(get_map());

google

OpenLayers(その1)

var style = { 
	strokeColor: '#FF0000', 
	strokeOpacity: 1.0,
	strokeWidth: 5,
	fillOpacity: 0
};

var lonlat =  layer_lonlat_to_map_lonlat(x, y);
var circle = OpenLayers.Geometry.Polygon.createRegularPolygon
(
	new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat),
	100,
	20,
	0
);
var feature= new OpenLayers.Feature.Vector(circle, null, style);
layer_vector.addFeatures(feature);

osm1

何か半径が違う!

OpenLayers(その2)

以下にしたがって各頂点の座標を求めてVectorとして表示

var apex = 40;
var latlon = new OpenLayers.LonLat(x, y);
var angle;
var new_lonlat;
var points = [];
for (var i = 0; i < apex+1; i++) {
	angle = (i * 360 / apex) + 0;
	new_lonlat = OpenLayers.Util.destinationVincenty(latlon, angle, radius);
	points.push([new_lonlat.lon, new_lonlat.lat]);
}

黒い円(ちょっと切れているが)

osm2
どうやら、こちらのほうがよい。
OpenLayers.Util.destinationVincentyは測地線からの距離と角度を指定して座標を求めるらしい。
今度、値を確認しよう

QGIS フィールド計算機で文字列結合

QGISでString型のフィールド同士を結合して別のフィールドを更新するにはフィールド計算機で
以下の計算を実行

例)「N03_003」と「N03_004」を結合して「NAME」を更新

スクリーンショット 2014-05-22 07.55.28

しかし「N03_003」、「N03_004」のいづれかの値がNULLの時は結合結果もNULLになってしまう

スクリーンショット 2014-05-22 08.26.09

「CASE WHEN 式 THEN 値1 ELSE 値2 END」を使用してNULLを空文字に変換して対応 

スクリーンショット 2014-05-22 08.34.25

EPPlus ExcelPackage を使用してグラフの載ったExcelのWorksheetをコピー

EPPlus ExcelPackage を使用してExcelのWorksheetを行うにはExcelWorksheetsの関数Copyを使用する

string dstName = “新しいシート”;
ExcelPackage ep = new ExcelPackage(new FileInfo(@”c:\public\template.xlsx”));
string srcName = ep.Workbook.Worksheets[1].Name;
ep.Workbook.Worksheets.Copy(srcName, dstName);

コピー対象のWorksheetにグラフがなければ上記の方法でコピー可能。
Worksheet上にグラフがあるとグラフ上のオブジェクトの参照先が

EPPlus ExcelPackage を使用してExcelのWorksheetを削除

シート名を指定して削除


ExcelPackage ep = new ExcelPackage(new FileInfo(@"c:\public\book1.xlsx"));
ExcelWorksheet ws = ep.Workbook.Worksheets[シート名];
ws.WorksheetXml.RemoveAll();
ep.Workbook.Worksheets.Delete(ws);
ep.SaveAs( new FileInfo (@"c:\public\book1.xlsx"));

シートポジション(※先頭が1)を指定して削除

ExcelPackage ep = new ExcelPackage(new FileInfo(@"c:\public\book1.xlsx"));
string name = ep.Workbook.Worksheets[シートポジション].Name;
ExcelWorksheet ws = ep.Workbook.Worksheets[name];
ws.WorksheetXml.RemoveAll();
ep.Workbook.Worksheets.Delete(ws);

gettextを使用してPHPを多国語対応(windows版)

gettextは様々な環境、言語に対応した多国語対応のライブラリ。
PHPも拡張機能として標準で提供されている。
※PHPのextディレクトリにあるphp_gettext.dllが実装
※php.iniのphp_gettext.dllのコメントを予め外して置く
※PHPファイルはUTF-8に設定

カタログファイルについて
gettextでは各言語ごとに辞書ファイル(gettextではカタログと呼ぶ)を用意する。
※拡張子はpo
カタログは全て共通のファイル名。(カタログのファイル名はドメインとして後ほど設定)
カタログファイルの作成方法は後述する。

カタログファイルのディレクトリ構成
実行環境(ここではWindowsサーバー、IISを想定)では各カタログのファイルを以下に従って配置する。
例)
c:¥temp¥locale¥言語¥LC_MESSAGES¥カタログファイル
※1.c:¥temp¥localeは任意のパスを設定可能。(ドメインのパスと呼ぶ)
※2.言語は言語コード_国コード。(日本はja_JP、英語は)

PHPでの実装
PHPでは以下を各PHPの最初に挿入する。


多国語対応の文字は以下のように埋め込む

カタログの作成
カタログはpoEditで作成する。
poEditをダウンロードサイトよりダウンロード
poEditはソースファイルを解析してカタログファイルを作成する

poEditを使用してカタログファイルを作成する際には実行環境とは別に以下のディレクトリ構成で作業することを前提に説明。
c:¥workにカタログファイルを保存
c:¥work¥root以下にソースファイル(*.php)を配置

poEditを起動
スクリーンショット 2014-04-18 05.25.19

メニューの新規作成を選択
言語にカタログ作成対象の言語を指定(最初は日本語)
poedit1

カタログの設定メニューで以下を設定
「プロジェクトの名前とバージョン」任意の名称
「文字符号化法」UTF-8
「ソースコードの文字符号化法」UTF-8
それ以外はデフォルト値
poedit2

ファイルを保存
一旦、ファイルを上述のC:¥workに保存。
ファイル名はdic.poとする。(既に述べた通り、ファイル名=ドメイン名)
poedit3

カタログの設定メニューで以下を設定
「ソースの検索パスーベースのパス」ピリオド(=C:¥work)を指定。
「ソースの検索パスーパス」各ソースのフォルダの絶対パス(=root)
「ソース中のキーワード」アンダーバーを指定
poedit3

poedit4

翻訳を入力
スクリーンショット 2014-04-18 07.10.19

カタログの更新を実行するとカタログファイル「dic.mo」に反映される。

カタログファイルを以下にコピー
c:¥temp¥locale¥jp_JA¥LC_MESSAGES¥dic.mo

以上

log4netを使用するとSystem.Security.SecurityExceptionが発生

log4netを使用した実行ファイルを管理者権限以外で実行すると以下のエラーが発生。

log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EventLogAppender] of type [log4net.Appender.EventLogA
ppender]. Reported error follows.
System.Security.SecurityException: ソースが見つかりませんでしたが、いくつかまたはすべてのログを検索できませんでした。ア
クセス不可能なログ: Security
場所 System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
場所 System.Diagnostics.EventLog.SourceExists(String source, String machineName)
場所 log4net.Appender.EventLogAppender.ActivateOptions()
場所 log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
失敗したアセンブリのゾーン:

調査するとイベントログにアクセスしようとして発生するらしい

確認するとconfigファイルにイベントログに関する記述が残っていた。これを削除して解決