Hi Guys,
This time I had a requirement to find the closest hospital from a given location. And map the route to get to that hospital. So I made a small application for that. Hope you like it.
1) ILocationService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "ILocationService" in both code and config file together.
[ServiceContract]
public interface ILocationService
{
[OperationContract]
[WebGet(UriTemplate = "/GetAllLocations",
ResponseFormat = WebMessageFormat.Json)]
List<Location> GetAllLocations();
[OperationContract]
[WebGet(UriTemplate = "/GetClosestLocation?latitude={latitude}&longtitude={longtitude}",
ResponseFormat = WebMessageFormat.Json)]
Location GetClosestLocation(string latitude,string longtitude);
}
2) LocationService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "LocationService" in code, svc and config file together.
public class LocationService : ILocationService
{
[OperationBehavior]
public List<Location> GetAllLocations()
{
using (LocationDataDataContext context = new LocationDataDataContext())
{
var temp = (from r in context.Locations
where r.IsActive == true
select r);
return temp.ToList();
}
}
[OperationBehavior]
public Location GetClosestLocation(string latitude, string longtitude)
{
using (LocationDataDataContext context = new LocationDataDataContext())
{
Dictionary<int, double> distances = new Dictionary<int, double>();
var temp = (from r in context.Locations
where r.IsActive == true
select r);
foreach (var item in temp)
{
distances.Add(item.ID,GetDistanceBetweenPoints(double.Parse(latitude), double.Parse(longtitude),
double.Parse(item.Latitude), double.Parse(item.Longtitude)));
}
var min = distances.OrderBy(kvp => kvp.Value).First();
return (from t in temp
where t.ID == min.Key
select t).FirstOrDefault();
}
}
private double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2)
{
double distance = 0;
double dLat = (lat2 - lat1) / 180 * Math.PI;
double dLong = (long2 - long1) / 180 * Math.PI;
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2)
+ Math.Cos(lat1 / 180 * Math.PI) * Math.Cos(lat2 / 180 * Math.PI)
* Math.Sin(dLong / 2) * Math.Sin(dLong / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
//Calculate radius of earth
// For this you can assume any of the two points.
double radiusE = 6378135; // Equatorial radius, in metres
double radiusP = 6356750; // Polar Radius
//Numerator part of function
double nr = Math.Pow(radiusE * radiusP * Math.Cos(lat1 / 180 * Math.PI), 2);
//Denominator part of the function
double dr = Math.Pow(radiusE * Math.Cos(lat1 / 180 * Math.PI), 2)
+ Math.Pow(radiusP * Math.Sin(lat1 / 180 * Math.PI), 2);
double radius = Math.Sqrt(nr / dr);
//Calculate distance in meters.
distance = radius * c;
return distance; // distance in meters
}
}
3) Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<script type="text/javascript">
var map;
//var lat, lng;
var lat = 24.704179, lng = 46.721524;
var directionsManager;
var directionsErrorEventObj;
var directionsUpdatedEventObj;
$(document).ready(function () {
Microsoft.Maps.loadModule('Microsoft.Maps.Themes.BingTheme', {
callback: function () {
if (navigator.geolocation) {
alert(navigator.geolocation);
navigator.geolocation.getCurrentPosition(function (position) {
alert(position.coords );
lat = position.coords.latitude; lng = position.coords.longitude;
}, errorHandler);
}
map = new Microsoft.Maps.Map(document.getElementById('SDKmap'), {
credentials: 'Your Key Here',
theme: new Microsoft.Maps.Themes.BingTheme(),
width: screen.width / 1.2, height: screen.height / 1.1
});
var infoboxOptions = { icon: '/Images/Current.png', width: 32, height: 32 };
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), infoboxOptions);
map.entities.push(pushpin);
pushpin.setLocation(new Microsoft.Maps.Location(lat, lng));
}
});
$.get("/Services/LocationService.svc/GetAllLocations", function (data, status) {
if (map) {
if (map.entities)
map.entities.clear();
var pushpinOptions;
var pushpin;
var infoboxOptions;
for (var i = 0; i < data.length; i++) {
infoboxOptions = { icon: '/Images/Hospital.png', width: 32, height: 32 };
pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), infoboxOptions);
map.entities.push(pushpin);
pushpin.setLocation(new Microsoft.Maps.Location(
data[i].Latitude,
data[i].Longtitude));
}
createDirections();
}
});
});
function errorHandler(err) {
console.warn('ERROR(' + err.code + '): ' + err.message);
};
function handlerEvent() {
alert('Handler clicked');
}
function createDirectionsManager() {
var displayMessage;
if (!directionsManager) {
directionsManager = new Microsoft.Maps.Directions.DirectionsManager(map);
displayMessage = 'Directions Module loaded\n';
displayMessage += 'Directions Manager loaded';
}
console.log(displayMessage);
directionsManager.resetDirections();
directionsErrorEventObj = Microsoft.Maps.Events.addHandler(directionsManager, 'directionsError', function (arg) { console.log(arg.message) });
directionsUpdatedEventObj = Microsoft.Maps.Events.addHandler(directionsManager, 'directionsUpdated', function () { console.log('Directions updated') });
}
function createDrivingRoute() {
if (!directionsManager) { createDirectionsManager(); }
$.get("/Services/LocationService.svc/GetClosestLocation?latitude="+lat+"&longtitude="+lng, function (data, status) {
directionsManager.resetDirections();
// Set Route Mode to driving
directionsManager.setRequestOptions({ routeMode: Microsoft.Maps.Directions.RouteMode.driving });
var pointA = new Microsoft.Maps.Directions.Waypoint({
location: new Microsoft.Maps.Location(lat, lng)
});
directionsManager.addWaypoint(pointA);
var pointB = new Microsoft.Maps.Directions.Waypoint({
location: new Microsoft.Maps.Location(data.Latitude, data.Longtitude)
});
directionsManager.addWaypoint(pointB);
// Set the element in which the itinerary will be rendered
directionsManager.setRenderOptions({ itineraryContainer: document.getElementById('directionsItinerary') });
directionsManager.calculateDirections();
});
}
function createDirections() {
if (!directionsManager) {
Microsoft.Maps.loadModule('Microsoft.Maps.Directions', { callback: createDrivingRoute });
}
else {
createDrivingRoute();
}
}
</script>
<div id="SDKmap" style="width:500px;height:500px"></div>
</asp:Content>
This time I had a requirement to find the closest hospital from a given location. And map the route to get to that hospital. So I made a small application for that. Hope you like it.
1) ILocationService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "ILocationService" in both code and config file together.
[ServiceContract]
public interface ILocationService
{
[OperationContract]
[WebGet(UriTemplate = "/GetAllLocations",
ResponseFormat = WebMessageFormat.Json)]
List<Location> GetAllLocations();
[OperationContract]
[WebGet(UriTemplate = "/GetClosestLocation?latitude={latitude}&longtitude={longtitude}",
ResponseFormat = WebMessageFormat.Json)]
Location GetClosestLocation(string latitude,string longtitude);
}
2) LocationService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "LocationService" in code, svc and config file together.
public class LocationService : ILocationService
{
[OperationBehavior]
public List<Location> GetAllLocations()
{
using (LocationDataDataContext context = new LocationDataDataContext())
{
var temp = (from r in context.Locations
where r.IsActive == true
select r);
return temp.ToList();
}
}
[OperationBehavior]
public Location GetClosestLocation(string latitude, string longtitude)
{
using (LocationDataDataContext context = new LocationDataDataContext())
{
Dictionary<int, double> distances = new Dictionary<int, double>();
var temp = (from r in context.Locations
where r.IsActive == true
select r);
foreach (var item in temp)
{
distances.Add(item.ID,GetDistanceBetweenPoints(double.Parse(latitude), double.Parse(longtitude),
double.Parse(item.Latitude), double.Parse(item.Longtitude)));
}
var min = distances.OrderBy(kvp => kvp.Value).First();
return (from t in temp
where t.ID == min.Key
select t).FirstOrDefault();
}
}
private double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2)
{
double distance = 0;
double dLat = (lat2 - lat1) / 180 * Math.PI;
double dLong = (long2 - long1) / 180 * Math.PI;
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2)
+ Math.Cos(lat1 / 180 * Math.PI) * Math.Cos(lat2 / 180 * Math.PI)
* Math.Sin(dLong / 2) * Math.Sin(dLong / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
//Calculate radius of earth
// For this you can assume any of the two points.
double radiusE = 6378135; // Equatorial radius, in metres
double radiusP = 6356750; // Polar Radius
//Numerator part of function
double nr = Math.Pow(radiusE * radiusP * Math.Cos(lat1 / 180 * Math.PI), 2);
//Denominator part of the function
double dr = Math.Pow(radiusE * Math.Cos(lat1 / 180 * Math.PI), 2)
+ Math.Pow(radiusP * Math.Sin(lat1 / 180 * Math.PI), 2);
double radius = Math.Sqrt(nr / dr);
//Calculate distance in meters.
distance = radius * c;
return distance; // distance in meters
}
}
3) Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<script type="text/javascript">
var map;
//var lat, lng;
var lat = 24.704179, lng = 46.721524;
var directionsManager;
var directionsErrorEventObj;
var directionsUpdatedEventObj;
$(document).ready(function () {
Microsoft.Maps.loadModule('Microsoft.Maps.Themes.BingTheme', {
callback: function () {
if (navigator.geolocation) {
alert(navigator.geolocation);
navigator.geolocation.getCurrentPosition(function (position) {
alert(position.coords );
lat = position.coords.latitude; lng = position.coords.longitude;
}, errorHandler);
}
map = new Microsoft.Maps.Map(document.getElementById('SDKmap'), {
credentials: 'Your Key Here',
theme: new Microsoft.Maps.Themes.BingTheme(),
width: screen.width / 1.2, height: screen.height / 1.1
});
var infoboxOptions = { icon: '/Images/Current.png', width: 32, height: 32 };
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), infoboxOptions);
map.entities.push(pushpin);
pushpin.setLocation(new Microsoft.Maps.Location(lat, lng));
}
});
$.get("/Services/LocationService.svc/GetAllLocations", function (data, status) {
if (map) {
if (map.entities)
map.entities.clear();
var pushpinOptions;
var pushpin;
var infoboxOptions;
for (var i = 0; i < data.length; i++) {
infoboxOptions = { icon: '/Images/Hospital.png', width: 32, height: 32 };
pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), infoboxOptions);
map.entities.push(pushpin);
pushpin.setLocation(new Microsoft.Maps.Location(
data[i].Latitude,
data[i].Longtitude));
}
createDirections();
}
});
});
function errorHandler(err) {
console.warn('ERROR(' + err.code + '): ' + err.message);
};
function handlerEvent() {
alert('Handler clicked');
}
function createDirectionsManager() {
var displayMessage;
if (!directionsManager) {
directionsManager = new Microsoft.Maps.Directions.DirectionsManager(map);
displayMessage = 'Directions Module loaded\n';
displayMessage += 'Directions Manager loaded';
}
console.log(displayMessage);
directionsManager.resetDirections();
directionsErrorEventObj = Microsoft.Maps.Events.addHandler(directionsManager, 'directionsError', function (arg) { console.log(arg.message) });
directionsUpdatedEventObj = Microsoft.Maps.Events.addHandler(directionsManager, 'directionsUpdated', function () { console.log('Directions updated') });
}
function createDrivingRoute() {
if (!directionsManager) { createDirectionsManager(); }
$.get("/Services/LocationService.svc/GetClosestLocation?latitude="+lat+"&longtitude="+lng, function (data, status) {
directionsManager.resetDirections();
// Set Route Mode to driving
directionsManager.setRequestOptions({ routeMode: Microsoft.Maps.Directions.RouteMode.driving });
var pointA = new Microsoft.Maps.Directions.Waypoint({
location: new Microsoft.Maps.Location(lat, lng)
});
directionsManager.addWaypoint(pointA);
var pointB = new Microsoft.Maps.Directions.Waypoint({
location: new Microsoft.Maps.Location(data.Latitude, data.Longtitude)
});
directionsManager.addWaypoint(pointB);
// Set the element in which the itinerary will be rendered
directionsManager.setRenderOptions({ itineraryContainer: document.getElementById('directionsItinerary') });
directionsManager.calculateDirections();
});
}
function createDirections() {
if (!directionsManager) {
Microsoft.Maps.loadModule('Microsoft.Maps.Directions', { callback: createDrivingRoute });
}
else {
createDrivingRoute();
}
}
</script>
<div id="SDKmap" style="width:500px;height:500px"></div>
</asp:Content>
Comments
Post a Comment