2012-04-03 12 views
14

Ich verfüge über eine SQL Server 2008-Datenbank mit einer Spalte vom Typ Geographie, in der die Form verschiedener australischer Regionen gespeichert ist. Ich möchte diese Formen in Google Maps zeichnen können.Anzeigen von Polygonen in Google Maps vom SQL Server-Datentyp

Dies ist für eine ASP.NET C# -Website.

Ich habe nach Beispielen gesucht, wie man das macht, aber nichts finden kann?

Hat jemand einige Beispiele, wie man das macht, speziell mit geographischen Daten von SQL Server?

Antwort

11

Die Antwort von AdamW ist korrekt, adressiert jedoch nicht die Daten im SqlGeography-Datenformat.

Fügen Sie einen Verweis auf 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(); 

Hinweis: Geographie Punkte 1 indiziert nicht 0 indiziert, und es ist auch nicht freundlich foreach.

+0

Ich weiß, das ist ein bisschen pingelig - aber Sie sollten die ordnungsgemäße Verwendung von USING-Anweisungen in Antworten wie diese veranschaulichen. Gerade in diesem Anwendungsfall, bei dem ich meine Objekte nicht richtig entsorgen könnte, könnte es zu erheblichen Speicherverlusten kommen. – Wjdavis5

7

Ich habe KML-Dateien in der Vergangenheit verwendet, um Polygone auf Webseiten zu überlagern.

Ich würde vorschlagen, Lesung googelt KML tutorials

  • Erstellen Sie eine Funktion aus der Datenbank lesen
  • KML-Datei erstellen
  • Anruf KML-Datei von Google API

Während KML bieten Ihnen Google kann die Anzahl der angezeigten Objekte schnell und einfach überlagern.

Die folgenden Schritte sollen Ihnen den Einstieg in den KML-Ansatz erleichtern.

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 Cache-Speicher KML-Dateien, so dass die Zugabe des Math.random() wird dieses Problem umgehen.

Sie könnten auch Fusion Tables betrachten. Sie müssen jedoch Ihre Daten in Google hochladen. Auch Google gruppiert die präsentierten Daten. Aber Sie möchten SQL, damit diese Option nicht für Sie verfügbar ist.

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(); 

Dies ist eine Kombination von Adam W und Blair M's Lösung. Ich habe es so modifiziert, dass die KML-Datei generiert wird, wenn mehr als ein Polygon in Ihrer Datenbank vorhanden ist.

Verwandte Themen