ホーム » GIS (ページ 2)

GIS」カテゴリーアーカイブ

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でも計測。

[code]
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);
[/code]

clip3

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

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

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

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

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

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

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

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

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

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を通す。
[code]
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;
}
}
[/code]
CP1252は文字コードなのでSHIFT JISならば[SHIFT_JIS]を設定
23032はEPSGなのでデータのEPSGを設定
VirtualShapeは以前はmod_spatialiteとは異なる拡張DLLだったが、今は同じようだ?

DMデータをShapeに変換

DM(数値地形図)データをArcGISで利用するにはArcToolBoxの変換ツールでジオデータベース等に変換して利用

clip_2

詳細はArcGISブログを参照

DM(数値地形図)データをShapeに変換するには国土地理院が提供している公共測量ビューア・コンバータを利用する。

公共測量ビューア・コンバータをダウンロードしたら解凍してPSEA.exeを起動しインポートメニューより対象データを指定

clip_4

座標系を指定してインポート

clip_7

インポート後エクスポートでShapeに変換

QGISのラベル

土地利用細分メッシュをQGISで表示し、各メッシュのラベルにメッシュ番号、土地利用種別、等を改行表示した時のラベルの設定の覚書

[code]
"メッシュ"
||
‘\n’
||
case
when "土地利用種" is ‘0100’ then ‘田’ || ‘\n’ || ‘0.068673’
when "土地利用種" is ‘0200’ then ‘その他農用地’ || ‘\n’ || ‘0.017543’
when "土地利用種" is ‘0500’ then ‘森林’ || ‘\n’ || ‘0’
when "土地利用種" is ‘0600’ then ‘荒地’ || ‘\n’ || ‘0’
when "土地利用種" is ‘0700’ then ‘建物用地’ || ‘\n’ || ‘1.0’
when "土地利用種" is ‘0901’ then ‘道路’ || ‘\n’ || ‘0.017343’
when "土地利用種" is ‘0902’ then ‘鉄道’ || ‘\n’ || ‘0.091575’
when "土地利用種" is ‘1000’ then ‘その他の用地’ || ‘\n’ || ‘0.454198’
when "土地利用種" is ‘1100’ then ‘河川および湖沼’ || ‘\n’ || ‘0’
when "土地利用種" is ‘1400’ then ‘海浜’ || ‘\n’ || ‘0’
when "土地利用種" is ‘1500’ then ‘海水域’ || ‘\n’ || ‘0’
when "土地利用種" is ‘1600’ then ‘ゴルフ場’ || ‘\n’ || ‘0.01762’
when "土地利用種" is ‘0000’ then ‘解析範囲外’ || ‘\n’ || ‘0’
end
[/code]

スクリーンショット 2015-05-01 11.19.35

Windows版QGISをビルド(カスタマイズ編)

前回Windows上でQGISをコンパイルした。
今回はQGISのカスタマイズを前提にコンパイル環境を変更する。

QGISのカスタマイズの王道

通常QGISをカスタマイズする場合はプラグインを作るのがよい。
もちろんqgis_code.dllをベースに外側をフルスクラッチで作成することも可能。

カスタマイズの方針

QGISの内部を知るためにqgis.exeを直接カスタマイズする。
そのためにはVS2010でQTデザイナも使いたい。

QTの環境構築
QTのサイトからインストーラをダウンロードしてセットアップ(QTのバージョンはOSGE4Wと同じ4.8.6とする)
http://download.qt.io/archive/qt/4.8/4.8.6/qt-opensource-windows-x86-vs2010-4.8.6.exe
http://download.qt.io/official_releases/qtcreator/3.3/3.3.2/qt-creator-opensource-windows-x86-3.3.2.exe
http://download.qt.io/official_releases/vsaddin/qt-vs-addin-1.1.11-opensource.exe

qgisプロジェクトの変更
qgis.vcxprojをエディタで編集

変更前
[code]
<PropertyGroup Label="Globals">
省略
<Keyword>Win32Proj</Keyword>
省略
</PropertyGroup>
[/code]
変更後
[code]
<PropertyGroup Label="Globals">
省略
<Keyword>Qt4VSv1.0</Keyword>
省略
</PropertyGroup>
[/code]

VS2010を起動してqgis.vcxprojを開く。
ソリューションエクスプローラでqgisプロジェクトを選択し、QTメニューの「Convert project to Qt Add-in prokect」を実行。

qgis.vcxprojを再度エディタで編集して「C:/OSGeo4W/include/qt4」を「C:/Qt/4.8.6/include」に変更。

同様にQT関連のライブラリ(lib)もOSGeo4W配下のファイルではなく、C:/Qt/4.8.6配下のそれを参照するように変更。

以上でqgis.exeの実装に「qt-vs-addin」の恩恵を受けることができる。

もちろんデバックはVS2010からqgis.exeにアタッチする形で行える。

注意点としては

Windows版QGISをビルド

Windows7(32bit)でQGIS(2.8.1)をコンパイル

コンパイラは「VisualStudio 2010」

参考にしたサイトは定番の以下のサイト

QGISをソースからコンパイルする方法(Windows8.1 32bit環境)

Building QGIS from source – step by step

こちらも参考にしました

package.cmd

CMAKEをセットアップ

CNAKE2.8のダウンロードサイトからcmake-2.8.6-win32-x86.zipをダウンロードしてC:\CMakeにインストール

Flex、Bisonをインストール

Cygwinをインストールして、Flex、Bisonのパッケージをインストール
Flexのバージョンは2.5.39
Bisonのバージョンは3.0.4
※Cygwinはダウンロードするサイトによってパッケージのバージョンが違うかも

Gitをインストール
Gitの1.9.2をダウンロードサイトからダウンロードしてC:\Gitにインストール

Subversionをインストール

Subversionの1.8.11をC:\Subversionにインストール
※使わないかも

OSGeo4Wをインストール

OSGeo4Wをインストールして以下のパッケージとQGISをインストール

※QGISをインストールするのはコンパイルエラーになったモジュールを補うため。(プラグインなどは必ずしも正しくコンパイルされるとは限らないので)

expat
fcgi
gdal
grass
gsl-devel
iconv
pyqt4
qt4-devel
qwt5-devel-qt4
sip
spatialite
libspatialindex-devel
python-qscintilla
qwtは念のためにqwt5だけではなくqwtもインストールする

インストールされたパッケージ


avce002.0.0-1
curl7.15.1-2
expat2.0.1-1
fcgi2.4.0-1
fftw3.2-1
freetype-mingw2.3.7-1
freexl1.0.0e-1
gdal1.11.2-1
gdal-python1.11.2-1
gdal110dll1.10.1-1
gdal15dll1.5.4-1
gdal18dll1.8.1-0
gdal19dll1.9.2-1
geos3.4.2-1
gpsbabel1.4.4-1
gpsbabelfe1.4.4-1
grass66.4.4-1
gs9.07-3
gsl-devel1.12-1
gsl-libs1.12-1
hdf44.2.0r3-4
hdf51.8.11-1
iconv1.9.1-1
laszip2.2.0-1
libcairo1.10.2-1
libgeotiff1.3.0-3
libintl0.14.4-2
libjpeg6b-5
libjpeg126b-3
libmysql5.0.18-1
libpng1.2.34-1
libpq8.3.10-3
libspatialindex1.7.0-1
libspatialindex-devel1.7.0-2
libtiff4.0.2-2
libxml22.9.1-1
msvcrt1.0.1-12
msys1.0.18-7
msys-grass1-5
netcdf3.6.1-1
ogdi3.2.0b1-4
openjpeg2.0.0-1
openssl1.0.1g-1
pdcurses3.3-1
proj4.8.0-0
proj-datumgrid1.5-1
proj-hpgn1.0-1
psycopg22.4-1
pygments1.4-3
pyopengl3.0.1-1
pyqt44.11.3-1
pyspatialite3.0.1-1
python2.7.4-2
python-core2.7.4-3
python-dateutil2.2-1
python-help2.7.4-1
python-jinja22-2.7.2-1
python-markupsafe0.23-1
python-numpy2.7-1.7.0-1
python-pilpil-1.1.7-1
python-qscintilla2.8.4-1
python-tcltk2.7.4-1
python-testsuite2.7.4-1
python-tools2.7.4-1
python-win322.16-1
pytz2014.2-1
qgis2.8.1-1
qgis-common2.8.1-1
qscintilla2.8.4-1
qt4-devel4.8.6-1
qt4-libs4.8.6-1
qwt-devel-qt46.0.2-1
qwt-libs-qt46.0.2-1
qwt5-devel-qt44-5.2.1-1
qwt5-libs-qt44-5.2.1-1
setup1.0.7-10
shell1.0.0-13
sip4.16.5-1
six1.6.1-1
spatialite4.1.1-1
spatialite3dll3.0.1-0
sqlite33.7.17-1
szip2.1-1
tcltk8.5.6-1
wxpython2.8.12.1-1
xerces-c2.7.0-1
xerces-c-vc93.1.1-2
zlib1.2.3-1

tat2tagのセットアップ

PhytonがインストールされているC:\OSGEO4W\binにパスを通す
txt2tags.pyをダウンロードしてC:\OSGEO4W\binにコピー
txt2tags-2.3.exeをダウンロードしてC:\txt2tagsにインストール

作業ディレクトリの用意

ディレクトリC:\qgis\2.8.1_01を作成。
ディレクトリC:\qgis\2.8.1_01\build-x86を作成。

C:\qgis\2.8.1_01をカレントにして以下のコマンドでQGISのソース等をダウンロード
※QGISのGITHUBのアドレスhttps://github.com/qgis/QGIS

[code]
git clone git://github.com/qgis/qgis.git
[/code]
C:\qgis\2.8.1_01\qgisにソースがダウンロードされる。
C:\qgis\2.8.1_01\qgisをカレントにして以下のコマンドでカレントのバージョンをリリースバージョんと同様の2.8.1に設定
現段階でのGISHUBのリポジトリの最新は2.8.2

[code]
git checkout ddccf8ee73eab92188a9055c472c58c86e3dc3b1
[/code]

C:\qgis\2.8.1_01\init.batを以下の内容で作成
[code]
set VERSION=2.8.1
set PACKAGE=qgis2.8.1
set PACKAGENAME=qgis2.8.1
set ARCH=x86
if "%VERSION%"=="" goto usage
if "%PACKAGE%"=="" goto usage
if "%PACKAGENAME%"=="" goto usage
if "%ARCH%"=="" goto usage

echo "set BUILDDIR"
pause

set BUILDDIR=C:\qgis\2.8.1_01\build-x86

echo "set OSGEO4W_ROOT"
pause

set OSGEO4W_ROOT=C:\OSGeo4W

echo "exec o4w_env.bat"
pause

call "C:\OSGeo4W\bin\o4w_env.bat"

echo "set O4W_ROOT"
pause

set O4W_ROOT=%OSGEO4W_ROOT:\=/%

echo "set LIB_DIR"
pause

set LIB_DIR=%O4W_ROOT%

echo "set PF86"
pause

set PF86=%PROGRAMFILES%

echo "set GRASS_VERSION"
pause

set GRASS_VERSION=6.4.4

echo "exec vcvarsall.bat"
pause

call "%PF86%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86

echo "exec SetEnv.Cmd"
pause

call "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /x86 /Release

color

@echo on

echo "set path"
pause

path %path%;%PF86%\Microsoft Visual Studio 10.0\VC\bin

echo "set CMAKE_OPT"
pause

set CMAKE_OPT=^
-G "Visual Studio 10" ^
-D SIP_BINARY_PATH=%O4W_ROOT%/bin/sip.exe ^
-D QWT_LIBRARY=%O4W_ROOT%/lib/qwt5.lib

echo %CMAKE_OPT%

echo "set PYTHONPATH"
pause

set PYTHONPATH=
path C:\CMake\bin;%PATH%;c:\cygwin\bin

REM PROMPT qgis%VERSION%$g

echo "set BUILDCONF"
pause

set BUILDCONF=RelWithDebInfo

echo "set SRCDIR"
pause

set SRCDIR=C:\qgis\2.8.1_01\qgis

echo %SRCDIR%

echo "cd BUILDDIR"
pause

if "%BUILDDIR:~1,1%"==":" %BUILDDIR:~0,2%
cd %BUILDDIR%

echo %BUILDDIR%

if errorlevel 1 goto error

echo %CD%

if errorlevel 1 goto error

echo "check log"
pause

if errorlevel 1 goto error

if not exist build.log goto build

echo "del build.tmp"
pause

REM
REM try renaming the logfile to see if it’s locked
REM

if exist build.tmp del build.tmp
if exist build.tmp (echo could not remove build.tmp & goto error)

echo "ren build.log"
pause

ren build.log build.tmp
if exist build.log goto locked
if not exist build.tmp goto locked

echo "ren build.tmp"
pause

ren build.tmp build.log
if exist build.tmp goto locked
if not exist build.log goto locked

goto build

:locked
echo Logfile locked
if exist build.tmp del build.tmp
goto error

:build
echo "build"
if errorlevel 1 goto error
echo BEGIN: %DATE% %TIME%
if errorlevel 1 goto error

set >buildenv.log

echo "check qgsversion.h"

if exist qgsversion.h del qgsversion.h
if errorlevel 1 goto error

echo "check CMakeCache.txt"

if exist CMakeCache.txt goto skipcmake
if errorlevel 1 goto error

echo CMAKE: %DATE% %TIME%
if errorlevel 1 goto error

echo "set LIB"
pause

set LIB=%LIB%;%OSGEO4W_ROOT%\lib

echo %LIB%

echo "set INCLUDE"
pause

set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include

echo %INCLUDE%

echo "set GRASS_PREFIX"
pause

set GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-%GRASS_VERSION%

echo %GRASS_PREFIX%

echo "cmake"
pause

cmake %CMAKE_OPT% ^
-D PEDANTIC=TRUE ^
-D WITH_QSPATIALITE=TRUE ^
-D WITH_SERVER=FALSE ^
-D SERVER_SKIP_ECW=TRUE ^
-D WITH_GLOBE=FALSE ^
-D WITH_TOUCH=FALSE ^
-D WITH_ORACLE=FALSE ^
-D WITH_GRASS=TRUE ^
-D WITH_CUSTOM_WIDGETS=TRUE ^
-D CMAKE_CXX_FLAGS_RELEASE="/MD /MP /O2 /Ob2 /D NDEBUG" ^
-D CMAKE_BUILD_TYPE=%BUILDCONF% ^
-D CMAKE_CONFIGURATION_TYPES=%BUILDCONF% ^
-D GEOS_LIBRARY=%O4W_ROOT%/lib/geos_c.lib ^
-D SQLITE3_LIBRARY=%O4W_ROOT%/lib/sqlite3_i.lib ^
-D SPATIALITE_LIBRARY=%O4W_ROOT%/lib/spatialite_i.lib ^
-D PYTHON_EXECUTABLE=%O4W_ROOT%/bin/python.exe ^
-D PYTHON_INCLUDE_PATH=%O4W_ROOT%/apps/Python27/include ^
-D PYTHON_LIBRARY=%O4W_ROOT%/apps/Python27/libs/python27.lib ^
-D QT_BINARY_DIR=%O4W_ROOT%/bin ^
-D QT_LIBRARY_DIR=%O4W_ROOT%/lib ^
-D QT_HEADERS_DIR=%O4W_ROOT%/include/qt4 ^
-D QWT_INCLUDE_DIR=%O4W_ROOT%/include/qwt ^
-D CMAKE_INSTALL_PREFIX=c:/qgis/%PACKAGENAME% ^
-D FCGI_INCLUDE_DIR=%O4W_ROOT%/include ^
-D FCGI_LIBRARY=%O4W_ROOT%/lib/libfcgi.lib ^
-D WITH_INTERNAL_JINJA2=FALSE ^
-D WITH_INTERNAL_MARKUPSAFE=FALSE ^
-D WITH_INTERNAL_PYGMENTS=FALSE ^
-D WITH_INTERNAL_DATEUTIL=FALSE ^
-D WITH_INTERNAL_PYTZ=FALSE ^
-D WITH_INTERNAL_SIX=FALSE ^
%SRCDIR%
if errorlevel 1 (echo cmake failed & goto error)

call "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"

:skipcmake
if exist noclean (echo skip clean & goto skipclean)
echo CLEAN: %DATE% %TIME%

:skipclean
echo ALL_BUILD: %DATE% %TIME%
goto end

:usage
echo usage: %0 version package packagename arch
echo sample: %0 2.0.1 3 qgis x86
exit

:error
echo BUILD ERROR %ERRORLEVEL%: %DATE% %TIME%
for %%i in ("" "-common" "-server" "-devel" "-grass-plugin" "-globe-plugin" "-oracle-provider") do (
if exist %ARCH%\release\qgis\%PACKAGENAME%%%i\%PACKAGENAME%%%i-%VERSION%-%PACKAGE%.tar.bz2 del %ARCH%\release\qgis\%PACKAGENAME%%%i\%PACKAGENAME%%%i-%VERSION%-%PACKAGE%.tar.bz2
)

:end
echo FINISHED: %DATE% %TIME%
[/code]

vc2010が起動したらqgis2.8.1.slnを開いてコンパイルする。

いくつかのプロジェクトはコンパイルエラーになった。

processing-59-stageinstallのように複数の*.uiが入っているプロジェクトは*.uiからui_*への変換でエラーになることがある。この場合はソリューションエクスプローラ上で*.uiを右クリックしてひとつひとつコンパイルした後に同プロジェクトをビルドすれば、ビルドが通る可能性がある。

いくつかのPython系のプラグイン関係のプロジェクトビルドを通らなかった。
pyplugin-installerプロジェクトで原因を調べてみると、同プロジェクトに設定されているカスタムビルドの以下のコマンドでエラーが発生していた。
[code]
C:\qgis\2.8.1.2\qgis\scripts\pyuic4-wrapper.bat C:/OSGeo4W/bin/pyuic4.bat C:/qgis/2.8.1.2/build-x86/output/bin/RelWithDebInfo C:/qgis/2.8.1.2/build-x86/output/python C:/qgis/2.8.1.2/qgis/python/pyplugin_installer/qgsplugininstallerfetchingbase.ui -o C:/qgis/2.8.1.2/build-x86/python/pyplugin_installer/ui_qgsplugininstallerfetchingbase.py
[/code]

pyuic4-wrapper.bat
[code]
set PYUIC4=%1
set PATH=%2;%PATH%
set PYTHONPATH=%3;%PYTHONPATH%
%PYUIC4% %4 %5 %6 %7 %8 %9
[/code]

pyuic4.bat
[code]
@"C:\OSGeo4W\bin\python.exe" "C:\OSGeo4W\apps\Python27\lib\site-packages\PyQt4\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9
[/code]

どうやらpython.exeでエラーが発生しているようなのpython.exeを単独で実行してみると「 ImportError: No module named site」が出力される。

よって以下の環境変数を設定ひて再度、実行すると
[code]
SET PYTHONHOME=C:\OSgeo4w\apps\Python27
[/code]

ビルドエラーとなるプロジェクトは以下の2つに減った。

synccrsdb
qgis_regression1141

インストール

インストール先のディテクトリ「C:\qgis\qgis2.8.1」を作成
※インストール先はCMAKEにパラメータ「CMAKE_INSTALL_PREFIX」で指定したディレクトリ

プロジェクト「INSTALL」を実行してインストール

clip_5

起動バッチの作成

OSGEO4WにあるQGIS起動バッチを参考に以下のバッチを作成して実行

[code]
@echo off
call C:\OSGeo4W\bin\o4w_env.bat
call C:\OSGeo4W\apps\grass\grass-6.4.4\etc\env.bat
@echo off
path C:\OSGeo4W\bin;C:\qgis\qgis2.8.1\bin;C:\OSGeo4W\apps\grass\grass-6.4.4\lib;%PATH%
set QGIS_PREFIX_PATH=C:\qgis\qgis2.8.1
set GDAL_FILENAME_IS_UTF8=YES
rem Set VSI cache to be used as buffer, see #6448
set VSI_CACHE=TRUE
set VSI_CACHE_SIZE=1000000
set QT_PLUGIN_PATH=C:\qgis\qgis2.8.1\qtplugins;C:\OSGeo4W\apps\qt4\plugins
start "QGIS" /B "C:\qgis\qgis2.8.1\bin\qgis.exe %*
[/code]

clip_6

以上

業務連絡
\\gyan2014\share\project\qgisに今回のリソースがあります。

OpenLayersに表示したGeoServerのPOINT(シンボル)のFeatureInfo(情報)をクリックして照会(WMSGetFeatureInfoです)

OpenLayersのWMSGetFeatureInfoを使用するとクリックした位置にある地物(Obejct)の情報を照会できる。

以下の画像は学校を旗(32×32のPNG画像)で表示。
clip_1

OpenLayers.Mapにコントロ-ル「WMSGetFeatureInfo」を追加してeventListenersのコールバック関数「getfeatureinfo」で
クリックした位置にある地物の情報を取得。
[code]
var selectControl = new OpenLayers.Control.WMSGetFeatureInfo({
url: "../geoserver/ワークスペース/wms",
title: "",
maxFeatures: 50,
queryVisible: true,
vendorParams: {
buffer: 100
},
infoFormat: "application/json",
eventListeners: {
getfeatureinfo: function(event){
var j = JSON.parse(event.text);
console.log(j, j.features, event);
}
}
});
map.addControl(selectControl);
selectControl.activate();
[/code]
シンボル、ポイントのように領域を持たない地物を選択する時は、vendorParamsのbufferまたはradiusでバッファ範囲を指定する。(単位はピクセル)
vendorParamsの詳細

上記の設定ではWMSGetFeatureInfoは表示されている全てのレイヤを照会の対象とする。

照会対象の項目はGeoServerで指定(以下はSQLViewで作成したLayersの時)
clip_3

注意点
GeoServerのLayersでGeometryのSRIDが正しく指定されていないとエラーになる

ドキュメント

GeoServerのスタイル(以上、以下)

[code]
<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
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">
<NamedLayer>
<Name>traffic12_5L</Name>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Name>0-999</Name>
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>0</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyIsLessThan>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>999</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:And>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#C0C0C0</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
<Rule>
<Name>1000-1999</Name>
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>1000</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyIsLessThan>
<ogc:PropertyName>trfvol</ogc:PropertyName>
<ogc:Literal>1999</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:And>
</ogc:Filter>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#C0C0C0</CssParameter>
<CssParameter name="stroke-width">2</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
[/code]

OpenLayersで著作権等を表示

OpenLayersでMapQuest-OSMタイルを無償で使用するためには著作権表示が必要。

改めてOpenLayersにおける著作権表示について調査。

コントロールを空でOpenLayers.Map作成すると

var map = new OpenLayers.Map('map', {controls:[]});

拡大縮小等のコントロールは何も表示されない。

clipc

OpenLayers.Control.Attributionコントロールを追加すると

map.addControl(new OpenLayers.Control.Attribution());

勝手に著作権情報が表示される

Googleの場合

clipg

OSMの場合

clipo

MapQuest-OSMの場合

clipo2

OSMの著作権だけ表示されてMapQuestが要求する著作権表示になっていない!

オプションで明示的に指定

var mapQuestOption = {
attribution:'Tiles Courtesy of MapQuest'
};
var layer_osm_mapquest = new OpenLayers.Layer.OSM("MapQuest-OSM", mapQuestArray,mapQuestOption);

期待した結果になった

clipo3

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は測地線からの距離と角度を指定して座標を求めるらしい。
今度、値を確認しよう