2012-04-03 30 views
14

Tôi có một cơ sở dữ liệu SQL Server 2008 với một cột loại địa lý lưu trữ hình dạng của các vùng khác nhau của Úc. Tôi muốn có thể vẽ các hình dạng này trên Google Maps.Hiển thị đa giác trên Google Maps từ kiểu dữ liệu địa lý SQL Server

Đây là trang web ASP.NET C#.

Tôi đã tìm kiếm bất kỳ mẫu nào về cách thực hiện việc này nhưng không thể tìm thấy bất kỳ thứ gì?

Có ai có một số mẫu về cách thực hiện điều này, cụ thể là sử dụng dữ liệu địa lý từ SQL Server?

Trả lời

11

Câu trả lời từ AdamW là chính xác, tuy nhiên không giải quyết được dữ liệu ở định dạng dữ liệu SqlGeography.

Bao gồm một tham chiếu đến 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(); 

Lưu ý: điểm Địa lý được 1 lập chỉ mục không phải 0 lập chỉ mục, và nó không được foreach thân thiện với một trong hai.

+0

Tôi nhận thấy điều này hơi khó tính - nhưng bạn nên minh họa việc sử dụng đúng các câu lệnh USING trong các câu trả lời như thế này. Đặc biệt trong trường hợp sử dụng này, tôi cảm thấy không vứt bỏ đúng đối tượng của bạn có thể dẫn đến rò rỉ bộ nhớ đáng kể. – Wjdavis5

7

Tôi đã sử dụng tệp KML trong quá khứ để đa giác lớp phủ trên các trang web.

tôi sẽ đề nghị đọc Googles KML tutorials

  • Tạo một chức năng để đọc từ cơ sở dữ liệu của bạn
  • Tạo KML tập
  • Gọi KML File từ Google API

Trong khi KML cung cấp cho bạn một cách nhanh chóng và dễ dàng để chồng hình, Google đặt giới hạn về số lượng mục được hiển thị.

Phần dưới đây sẽ giúp bạn bắt đầu với phương pháp tiếp cận 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 Caches KML file nên việc bổ sung các Math.random() sẽ làm được việc này.

Bạn cũng có thể xem Fusion Tables. Tuy nhiên, bạn phải tải dữ liệu của mình lên Google. Ngoài ra Google nhóm dữ liệu được trình bày. Nhưng bạn muốn SQL để tùy chọn này có thể không có sẵn cho bạn.

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

Đây là sự kết hợp của giải pháp Adam W và Blair M. Tôi đã sửa đổi nó để tệp KML sẽ được tạo nếu có nhiều hơn một đa giác trong cơ sở dữ liệu của bạn.

Các vấn đề liên quan