MapScriptで描画してみる



マルチスレッド描画

上記のようなことして遊んでるくらいならあり合わせのもの使えって話とりあえず結果のみ。

MapServerのコンポーネントは、恐らく最もメジャーなオープン エンタプライズGISなので色々あって使いやすい。
描画自体はCairoかな?今もFireFoxはCairoか調べてないが昔はCairo
http://ja.wikipedia.org/wiki/Cairo

なんかesri側からもOpen側からもフルボッコにされそうな内容だが同一データで200~300msくらいか
マルチスレッド描画(実際は描画用配列がスレッド複線ってだけだが)が800ms程度なのでさすがの速さ。
まあ低レベルAPIは.NET向きではない、あくまで遊びか。

ちなみに描画範囲でクエリできなかったのでlayerObjとってDataに条件を足した。
何か範囲条件指定の.Mapを作らないと駄目?あまり深追いしてない。

描画できればいいし、Microsift Geometryは中からいじれりゃイイやと言うOpen好きなMicrosft信者におすすめ。
そんな人いなさそうだが。

個人的にはサーバとしてならGeoServerが良い。Java使いにおすすめ。
正直Windowsアプリ用でJavaはもっさい。Web / Android用かなと思うのでGeoServer使う機会があれば普通に使うことをおすすめする。

ライセンス規約にesri製品以外のGISコンポーネントと組み合わせ不可とかあったら使えないかな・・・。
仮にあったとしてどこからが描画じゃなくてGISなのかという話を考えると規定可能か良く分からないが。

とりあえずはPNGの作り方程度のコードを以下に置いとく
byte配列にできればどうとでもなるはず
(範囲はExtentが持ってるので描画範囲は変更可能、下記方法でクエリが連動しなかったので適当にした。)

ここからx64かx86か選んでダウンロードする
http://vbkto.dyndns.org/sdk/

今回は以下をダウンロードしておいた。
release-1600-x64-gdal-1-10-mapserver-6-2
http://vbkto.dyndns.org/sdk/PackageList.aspx?file=release-1600-x64-gdal-mapserver.zip
compiled binaries in a single .zip package

bin下のDLL全て – 本体
bin\gdal-dataのファイル全て – 投影に必要な定義
bin\ms\csharpのDLL二つ (mapscript.dll / mapscript_csharp.dll) – マップスクリプト
bin\ms\plugins\mssql2008のDLLひとつ(msplugin_mssql2008.dll) – SQL Server参照に必要
のDLLや定義ファイルをbin/Debug等アプリケーションディレクトリに出力されるように設定する。
mapscript_csharp.dlについては参照かけて中のクラスを使う
(OSGeo.MapServer名前空間)

以下のようなANSIテキストの.MAPファイルを用意する

MAP
EXTENT 13684920 2758979 17141743 5709526
UNITS DD
INTERLACE ON
SIZE 600 300
IMAGECOLOR 0 0 0
SHAPEPATH "data"

WEB
IMAGEPATH "C:\tmp\world" #myworld.mapの場所
END

LAYER
NAME "JPN"
STATUS ON
TYPE POLYGON
 CONNECTIONTYPE OGR
 CONNECTION "MSSQL:server=ましんめい;uid=ゆーざ;pwd=ぱすわーど;database=でーたべーすめい;trusted_connection=yes;tables=gis.JPN71WEB(shape)"
 PROCESSING 'CLOSE_CONNECTION=DEFER'
 DATA "SELECT shape from gis.JPN71WEB"
CLASS
COLOR 181 230 29
OUTLINECOLOR 10 10 10
END
END

END

すると以下のようなコードで画像出力できる。
もちろんmapファイル自体でShapefileやPostGIS/オプションでFGDB等も描画可能


using System.Drawing;

using OSGeo.MapServer;
using System.IO;

namespace MapScripts
{
  class Program
  {
    static void Main(string[] args)
    {
      byte[] bytes = null;
      using (mapObj map = new mapObj(@"C:\tmp\world\JPN.map"))
      {
        map.width = 800;
        map.height = 600;
        map.transparent = 1;

        using (imageObj img = map.draw())
        {
          bytes = img.getBytes();
        }//end img

      }//end map

      using (MemoryStream memSt = new MemoryStream(bytes))
      using (Bitmap bmp =(Bitmap) Bitmap.FromStream(memSt))
      {
        bmp.Save(@"C:\tmp\world\SQL.png", System.Drawing.Imaging.ImageFormat.Png);
      }

    }//end method
  }//end class
}//end namespace
カテゴリー: 開発, 設計 タグ: パーマリンク