2017-06-12 18 views
2

MS SQLの地理タイプをwell-known textに変換してフロントエンドに送信するAPIがあります。フロントエンドはWKTをキャンバス(罫線、地域など)をレンダリングするOpenLayerマップに送信します。SQL Server GeographyをPNG形式に変換する

私はクライアントへのペイロードを減らし、ポリゴン、マルチポリゴン、マップをバックエンド側のpngに変換する方法を探しています。

私が試みたのは、canvasをbase64に変換してPNG形式で保存することでした。それはうまくいくが、完全なバックエンドソリューションが必要だ。

私はSharpMapで遊んだりしようとしましたが、それはかなり古く、依存関係の問題を引き起こしています。

テスト用のSHPファイルが見つかりました。テスト用のWindowsフォームでPictureBoxにレンダリングしようとしましたが、空白のボックスがありました。

SharpMap.Map myMap = new SharpMap.Map(new Size(600, 300)); 
myMap.BackColor = Color.White; 
var shapeFileProvider = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\test\Downloads\FRA_adm\FRA_adm1.shp", true); 

SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("World Countries"); 
myMap.Layers.Add(myLayer); 
myMap.ZoomToExtents(); 
myLayer.DataSource = shapeFileProvider; 
pictureBox1.Image = myMap.GetMap(); 

どのようにこの問題に取り組んでいますか?

EDIT: 私はgeoserverを試してみましたが、Spatial Geographyをサポートしていないようですが、ジオメトリだけをサポートしているようです。

私は、境界、地域、国をc#バックエンドでイメージに変換する方法を見つける必要があります。

編集2: 私は実際にテスト用にSHPファイルを使用していますが、実際にはSql Server Geographyタイプからレンダリングしています。

+0

@OndrejSvejdarライブラリ関連ではありません。たぶん、誰かが私のSharpMapコードが動作していない理由を知っているだろう – Robert

答えて

4

SharpMapはまだ維持されていますが、Nugetパッケージは維持されていません。また、パッケージ(2014年)は、現在のナゲットバージョンのすべての依存関係(GeoAPI、ProjNetなど)と互換性がありません。 私がお勧めすることは次のとおりです。

  1. (アセンブリのほとんどは、W/Oすべての問題、特にメイン1、SharpMapをコンパイル)githubから独自SharpMapアセンブリを構築し、SharpMap nugetを使用していない参照することをアセンブリ(およびその1つだけ)
  2. 最新のバージョンの依存関係アセンブリは、必要なときに手動で1つずつ参照してください。ここで

最新SharpMapに適応し、あなたのWinFormsコードは、GeoAPIProjNetです:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // just add a PictureBox on the Winform. 
     InitializeComponent(); 
     DrawMap(); 
    } 

    private void DrawMap() 
    { 
     Session.Instance.SetCoordinateSystemServices(
      new CoordinateSystemServices(
        new CoordinateSystemFactory(), 
        new CoordinateTransformationFactory(), 
        SpatialReference.GetAllReferenceSystems())); 

     var map = new Map(pictureBox1.Size); 
     map.BackColor = Color.White; 
     var file = new ShapeFile(@"D:\Downloads\FRA_adm\FRA_adm1.shp", true); 
     var layer = new VectorLayer("France", file); 
     map.Layers.Add(layer); 
     map.ZoomToExtents(); 
     pictureBox1.Image = map.GetMap(); 
    } 
} 

これは、この表示されます。

enter image description here

見ての通り、マップがおかしいの、もしあなたがフランスの輪郭を知っていれば:-)。

layer.CoordinateTransformation = Wgs84ToGoogle; 

... 

// Wgs84 to Google Mercator Coordinate Transformation 
// this code comes from SharpMap\Examples\WinFormSamples\LayerTools.cs 
private ICoordinateTransformation _wgs84ToGoogle; 
public ICoordinateTransformation Wgs84ToGoogle 
{ 
    get 
    { 
     if (_wgs84ToGoogle == null) 
     { 
      var csFac = new CoordinateSystemFactory(); 
      var ctFac = new CoordinateTransformationFactory(); 

      var wgs84 = csFac.CreateGeographicCoordinateSystem(
       "WGS 84", AngularUnit.Degrees, HorizontalDatum.WGS84, PrimeMeridian.Greenwich, 
       new AxisInfo("north", AxisOrientationEnum.North), new AxisInfo("east", AxisOrientationEnum.East)); 

      var parameters = new List<ProjectionParameter>(); 
      parameters.Add(new ProjectionParameter("semi_major", 6378137.0)); 
      parameters.Add(new ProjectionParameter("semi_minor", 6378137.0)); 
      parameters.Add(new ProjectionParameter("latitude_of_origin", 0.0)); 
      parameters.Add(new ProjectionParameter("central_meridian", 0.0)); 
      parameters.Add(new ProjectionParameter("scale_factor", 1.0)); 
      parameters.Add(new ProjectionParameter("false_easting", 0.0)); 
      parameters.Add(new ProjectionParameter("false_northing", 0.0)); 

      var projection = csFac.CreateProjection("Google Mercator", "mercator_1sp", parameters); 
      var epsg900913 = csFac.CreateProjectedCoordinateSystem(
       "Google Mercator", wgs84, projection, LinearUnit.Metre, new AxisInfo("East", AxisOrientationEnum.East), 
       new AxisInfo("North", AxisOrientationEnum.North)); 

      ((CoordinateSystem)epsg900913).DefaultEnvelope = new[] { -20037508.342789, -20037508.342789, 20037508.342789, 20037508.342789 }; 

      _wgs84ToGoogle = ctFac.CreateFromCoordinateSystems(wgs84, epsg900913); 
     } 
     return _wgs84ToGoogle; 
    } 
} 

そして、あなたが今、これを取得します:あなたが正しい投影したい場合は、レイヤーにこのコードを追加する必要が

enter image description here

SharpMapは少し肥大化したかもしれないが、まだそれ貴重なコードを提供し、サンプルが機能します。ドキュメントは見つけにくいので、使用するとソースを掘り下げる必要があります。

また、SharpMapが使用するGDI +は、サーバー側でMicrosoftによって正式にサポートされていないことを知りたいと思います。それがうまくいかないことを意味するわけではありません、自分で自分自身で試してみる必要があります。

+0

うわー、ありがとう!コードをテストしているうちに、エラーが見つかりました。 ProjNetパッケージを参照する必要があると指摘しましたが、私はProj.Netパッケージを使用してコンパイルする必要があります。 1つのドットは、私にかなりの頭痛を与えた:) マップはなぜ最初に行った "面白い"、そしてなぜ私はWgs84ToGoogleを追加しなければならなかったのか詳しく説明できますか?私はそれを追加するまでうまく動作します。それから私は赤い十字架の上にpictureboxを持っています – Robert

+0

私はProjNetだけを持っていません... ProjNet ...私のテストプロジェクトのメインファイルをここに入れました:https://gist.github.com/smourier/3d7739c0c719ee0c81fccbd2131fe62c面白いこと画像は明らかに歪んでいる。 –

+0

あなたのコードは正常に動作し、私の解決策の90%を見つけるのに役立ちました。あなたは私の座標を4326投影から3857経線に変換する方法を知っていますか? コードを提供しようとしましたが、CoordinateTransformationを使用しても機能しません。 – Robert

関連する問題