2012-04-03 2 views
14

私は、さまざまなオーストラリア地域の形状を格納している地理タイプの列を持つSQL Server 2008データベースを持っています。 Google Mapsでこれらの図形を描きたいと思っています。Googleマップ上のポリゴンをSQL Server地理データ型から表示する

これはASP.NET C#Webサイト用です。

私はこれを行う方法のサンプルを検索しましたが、何も見つかりませんでしたか?

SQL Serverの地理データを使用して、これを行う方法のサンプルがありますか?

答えて

11

AdamWの回答は正しいですが、SqlGeographyデータ形式のデータには対応していません。

はMicrosoft.SqlServer.Types

SqlCommand cmd = new SqlCommand("SELECT STATEMENT",ConnectionString); 
connectionString.Open(); 
SqlDataReader polygon = cmd.ExecuteReader(); 

While (polygon.read()) 
{ 
    string kmlCoordinates = string.Empty; 
    SqlGeography geo = (SqlGeography)polygon["GeoColumn"]; 
    for(int i = 1; i <= geo.STNumPoints(); i++) 
    { 
     SqlGeography point = geo.STPointN(i); 
     kmlCoordinates += point.Long + "," + point.Lat + " "; 
    } 
{ 

ConnectionString.Close(); 

注を参照含める: 地理ポイントを1インデックス付け0でない索引付けされ、それがいずれかのフレンドリーのforeachされていません。

+0

私はこれがちょっとしたことだと思います。しかし、あなたはこれらのような答えでUSING文を適切に使用するべきです。特にこのユースケースでは、オブジェクトを適切に配置していないと、メモリリークが発生する可能性があります。 – Wjdavis5

7

過去にKMLファイルを使用して、ウェブページ上のポリゴンをオーバーレイしました。

私は読書がKML tutorials

  • はKMLは、GoogleのAPIから
  • コールKMLファイルをファイルの作成、データベースから読み出す機能を作成グーグル示唆し

KMLはをご提供しているが形状をオーバーレイするためのすばやく簡単な方法ですが、Googleでは表示されるアイテムの数に制限を設けています。

以下は、KMLのアプローチを開始するのに役立ちます。

public ActionResult Kml() 
    { 
     DataAccess da = new DataAccess(); 
     string cellColor = "0032FB"; 

     string kml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
     <kml xmlns=""http://earth.google.com/kml/2.1""> 
      <Document> 
       <Style id="polygon"> 
        <LineStyle> 
         <color>FF" + cellColor + @"</color> 
        </LineStyle> 
        <PolyStyle> 
         <color>44" + cellColor [email protected]"</color> 
         <fill>1</fill> 
         <outline>1</outline> 
        </PolyStyle> 
       </Style> 
       <name>some name</name> 
       <description>some des</description> 

     "; 
     DataTable polygons; 

     foreach (DataRow polygon in polygons.Rows) 
     { 
       kml += @" 
        <Placemark> 
         <name>"somename @"</name> 
         <description><![CDATA[<p>some text</p>]]></description>" + 
         @"<styleUrl>#polygon</styleUrl> 
         <Polygon> 
          <extrude>1</extrude> 
          <altitudeMode>clampToSeaFloor</altitudeMode> 
          <outerBoundaryIs> 
           <LinearRing> 
            <coordinates>" + 
             polygon["Cell Limit Longitude West"].ToString() + "," + polygon["Cell Limit Latitude North"].ToString() + " " + 
             polygon["Cell Limit Longitude East"].ToString() + "," + polygon["Cell Limit Latitude North"].ToString() + " " + 
             polygon["Cell Limit Longitude East"].ToString() + "," + polygon["Cell Limit Latitude South "].ToString() + " " + 
             polygon["Cell Limit Longitude West"].ToString() + "," + polygon["Cell Limit Latitude South "].ToString() + " " + 
             polygon["Cell Limit Longitude West"].ToString() + "," + polygon["Cell Limit Latitude North"].ToString() + " " + 
            @"</coordinates> 
           </LinearRing> 
          </outerBoundaryIs> 
         </Polygon> 
        </Placemark> 
       "; 
     } 

     kml += @"</Document> 
     </kml>"; 
     byte[] data = Encoding.ASCII.GetBytes(kml); 

     return File(data, "application/vnd.google-earth.kml+xml", id); 
    } 

Javascriptを

var url = 'http://www.example.com/AppName/GMap/file.kml &rand=' + Math.random(); 

layer_paperCharts = new google.maps.KmlLayer(url); 

if (loadedonce) { 
    layer_paperCharts.set('preserveViewport', true); 
} else { 
    loadedonce = true; 
} 

layer_paperCharts.setMap(map); 

GoogleのキャッシュKMLファイルMath.random(の追加ので)この問題を回避します。

また、Fusion Tablesを見ることもできます。ただし、データをGoogleにアップロードする必要があります。またGoogleは提示されたデータをグループ化します。しかし、このオプションを利用できないようにするにはSQLが必要です。

6
public void KmlExport() 
    { 
     string cellColor = "COLOR"; 
     string KMLname = "KML NAME"; 
     string description = "KML DESCRIPTION"; 
     string kml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
         <kml xmlns=""http://www.opengis.net/kml/2.2""> 
          <Document> 
           <Style id=""polygon""> 
            <LineStyle> 
             <color>FF" + cellColor + @"</color> 
            </LineStyle> 
            <PolyStyle> 
             <color>44" + cellColor + @"</color> 
             <fill>1</fill> 
             <outline>1</outline> 
            </PolyStyle> 
           </Style> 
           <name>" + KMLname + @"</name> 
           <description>" + description + "</description>"; 

     SqlCommand cmd = new SqlCommand("Select Statement", connectionString); 
     cs.Open(); 
     SqlDataReader polygon = cmd.ExecuteReader(); 

     while (polygon.Read()) 
     { 
      string kmlCoordinates = string.Empty; 
      SqlGeography geo = (SqlGeography)polygon["GEOGRAPHY COLUMN"]; 

       for (int i = 1; i <= geo.STNumPoints(); i++) 
       { 
        SqlGeography point = geo.STPointN(i); 
        kmlCoordinates += point.Long + "," + point.Lat + " "; 
       } 

       string polyName = polygon["Name Column"].ToString(); 
       string polyDescription = polygon["Description Column"].ToString(); 
       kml += @" 
       <Placemark> 
        <name>" + polyName + @"</name> 
        <description><![CDATA[<p>" + polyDescription + "</p>]]></description>" + 
         @"<styleUrl>#polygon</styleUrl> 
        <Polygon> 
         <extrude>1</extrude> 
         <altitudeMode>clampToSeaFloor</altitudeMode> 
         <outerBoundaryIs> 
          <LinearRing> 
           <coordinates>" + kmlCoordinates + 
           @"</coordinates> 
          </LinearRing> 
         </outerBoundaryIs> 
        </Polygon> 
       </Placemark>"; 

       kmlCoordinates = string.Empty; 
      } 

     cs.Close(); 
     kml += @"</Document></kml>"; 
     StreamWriter file = new StreamWriter(@"OUTPUTFILE.KML"); 
     file.WriteLine(kml); 
     file.Close(); 

これはAdam WとBlair Mのソリューションの組み合わせです。データベースに複数のポリゴンがある場合、KMLファイルが生成されるように変更しました。

関連する問題