私は、さまざまなオーストラリア地域の形状を格納している地理タイプの列を持つSQL Server 2008データベースを持っています。 Google Mapsでこれらの図形を描きたいと思っています。Googleマップ上のポリゴンをSQL Server地理データ型から表示する
これはASP.NET C#Webサイト用です。
私はこれを行う方法のサンプルを検索しましたが、何も見つかりませんでしたか?
SQL Serverの地理データを使用して、これを行う方法のサンプルがありますか?
私は、さまざまなオーストラリア地域の形状を格納している地理タイプの列を持つSQL Server 2008データベースを持っています。 Google Mapsでこれらの図形を描きたいと思っています。Googleマップ上のポリゴンをSQL Server地理データ型から表示する
これはASP.NET C#Webサイト用です。
私はこれを行う方法のサンプルを検索しましたが、何も見つかりませんでしたか?
SQL Serverの地理データを使用して、これを行う方法のサンプルがありますか?
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されていません。
過去にKMLファイルを使用して、ウェブページ上のポリゴンをオーバーレイしました。
私は読書がKML tutorials
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が必要です。
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ファイルが生成されるように変更しました。
私はこれがちょっとしたことだと思います。しかし、あなたはこれらのような答えでUSING文を適切に使用するべきです。特にこのユースケースでは、オブジェクトを適切に配置していないと、メモリリークが発生する可能性があります。 – Wjdavis5