Spatial data in sql and draw boundary on bing maps




Spatial data at the sql server




spatial view:



接下来需要用这些数据在bing map上画出boundary

我使用的是ASP.NET MVC4.
1。在现有项目中添加数据库文件


然后选择generate from database, 连接数据库选择需要连接的table,添加。


添加后的结果。

查看mapdata.Context.cs文件


记住ProSpatialEntities, 这是以后在Controller里连接数据库的方法。

2。新建两个class,在model文件夹下

Response class

public class Response
{
 public List<County> Results { get; set;  }
}

County class

public class County
{
public string WKT { get; set; }
public string Name { get; set; }
}

3。在对应的controller里添加以下代码(显示map对应的controller)

 protected override JsonResult Json(object  data, string contentType, System.Text.Encoding contentEncoding,  JsonRequestBehavior behavior)
{
      return new  JsonResult() {
Data = data,
ContentType =  contentType,
ContentEncoding =  contentEncoding,
JsonRequestBehavior =  behavior,
MaxJsonLength =  Int32.MaxValue
};
}



     
  [HttpPost]
  public JsonResult MapBoundary(double longitude,  double latitude, double radius)
{
Parent  models = new Parent();
 var nearby  = FindNearBy(latitude, longitude, radius);
      models.Response = nearby;
return  Json(models, JsonRequestBehavior.AllowGet);
}

 public Response FindNearBy(double latitude,  double longitude, double radius)
{
Response  re = new Response();
try
{
double lat2 = latitude -  0.01;
double lon2 = longitude -  0.01;
//here, it must using the  same SRID, I used to use 4326, it would return an exception  called 
 //data is null.
DbGeometry point =  pe.pvs_14_v1_tracts2010_17.FirstOrDefault().ogr_geometry;
DbGeometry center =  DbGeometry.PointFromText("POINT(" + longitude + " " + latitude +  ")", 4269);
re.Results = (from k in  pe.pvs_14_v1_tracts2010_17
let  distance = center.Distance(k.ogr_geometry)
where  distance <= radius
orderby  distance
select new  County
{
Name = k.name,
WKT =  k.ogr_geometry.AsText()
}).ToList();
 }  catch  (Exception ex)
{
  throw ex;
}
return  re;
}


解释:
(1)override Json method详情看exceeding maxJsonLength 文
(2)MapBoundary()会读取某地点一定范围内的boundary并返回json格式
(3)FindNearBy()是MapBoundary内部调用的函数,使用Geometry类的相关方法将返回结果限定在一定距离范围内


4。接下来是画地图
这里使用了WKTModule.js
详情请见:https://bingmapsv7modules.codeplex.com/wikipage?title=Well  Known Text Reader/Writer


@model MvcApplication6.Models.Response

<body οnlοad="GetMap()" />
<div id="Map">
<div id="myMap"  style="position:relative;width:635px;height:470px;"></div>
   
</div>

<button value="show boundary" id="boundary"  οnclick="showbound()">show  boundary</button>
<button value="clear boundary"  id="clearboundary" οnclick="clearbound()">clear  boundary</button>

<script  type="text/javascript">
var map, infobox,  dataLayer;
function GetMap() {
map = new  Microsoft.Maps.Map(document.getElementById_x_x("myMap"),  center: new  Microsoft.Maps.Location(41.592,-87.332),  zoom: 13,  credentials:  your bingmap credentials here  });
dataLayer  = new Microsoft.Maps.EntityCollection();
map.entities.push(dataLayer);
var  infoboxLayer = new Microsoft.Maps.EntityCollection();
map.entities.push(infoboxLayer);
infobox =  new Microsoft.Maps.Infobox(new Microsoft.Maps.Location(0, 0),
visible: false, offset: new  Microsoft.Maps.Point(0, 20)  });
infoboxLayer.push(infobox);
//Register  and load the WKT Module 
Microsoft.Maps.registerModule("WKTModule",  "/Scripts/WKTModule.js");
Microsoft.Maps.loadModule("WKTModule");
}

function CallRESTService(request, callback) {
 var xmlHttp;
if  (window.XMLHttpRequest) {
 xmlHttp = new XMLHttpRequest();
 } else if  (window.ActiveXObject) {
try {
xmlHttp =  new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try
{
 xmlHttp = new  ActiveXObject("Microsoft.XMLHTTP");
 } catch (e) {
throw (e);
}
}
}
xmlHttp.open("GET",  request, false);
    xmlHttp.onreadystatechange = function (r) {
      if (xmlHttp.readyState == 4) {
callback(eval_r('(' + xmlHttp.responseText + ')'));
}
 };
    xmlHttp.send();
}

function clearbound() { 
document.getElementById_x_x("myMap").remove();
$('#Map').append('<div id="myMap"  style="position:relative;width:635px;height:470px;"></div>');
GetMap();
}

function showbound() {
var center =  map.getCenter();
var lat =  center.latitude;
var lon =  center.longitude;
$.ajax({
url: '@Url.Action("MapBoundary")',
data: { "longitude": lon, "latitude": lat,  "radius": 0.1 },
type: "post",
dataType: "json",
cache: false
})
.done(function (data) {
if (data.Response &&  data.Response.Results != null) {
for (var i = 0; i < data.Response.Results.length; i++) {
var shape =  WKTModule.Read(data.Response.Results[i].WKT);
dataLayer.push(shape);
}
}  else if  (data.Response &&  data.Response.Error != null) {
alert("Error: " +  data.Response.Error);
}
 })
    .fail(function (xhr)  {
alert(xhr.responseText);
});
}
  
</script>



最后结果:





放大后:




主要参考: http://blogs.bing.com/maps/2013/07/31/how-to-create-a-spatial-web-service-that-connects-a-database-to-bing-maps-using-ef5/
数据来源:http://www.census.gov/geo/partnerships/pvs/partnership14/st17_il.html
(Parse shapefile into sql server会在以后写)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值