In the previous blogs, I gave a brief overview of what we need and how to get the API key from Google Maps. In the final part of the blog, I will tell you how to measure the distance. In this part we will be dealing with the CRM side of things. I mentioned the use of a web resource. If you have already used this then make sure you get Latitude and Longitude of the locations. We will need these to measure distance. If you haven’t, no worries. Just check out this wonderful tutorial by Quratulain Ibrahim
Remember the link that I shared in the first part of the blog about Microsoft giving what is required? No? Then here is the link, check it out. Download the sample code and add GoogleDataContracts.cs file in your project. Make sure you add the urls and API key as suggested in the link. Don’t, under any circumstances, share your API key. You will get a fairly good idea what this code does.
So go ahead and create a plug-in.
Within the plug-in include this code, but before that make sure you get the latitude and longitude values for both source and destination entity records.
WebClient client = new WebClient(); var url = String.Format($"https://maps.googleapis.com/maps/api/distancematrix/json" + "?units=imperial" + $"&origins=" + originAddress1Latitude + "," + originAddress1Longitude + $"&destinations=" + destinationAddress1Latitude + "," + destinationAddress1Longitude + $"&key={GoogleConstants.GoogleApiKey}"); string response = client.DownloadString(url); System.Runtime.Serialization.Json.DataContractJsonSerializer jsonSerializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(DistanceMatrixResponse)); object objResponse = jsonSerializer.ReadObject(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(response))); DistanceMatrixResponse distancematrixResponse = objResponse as DistanceMatrixResponse; if (distancematrixResponse.Status != "OK") throw new ApplicationException($"Server{GoogleConstants.GoogleApiServer} application error (Status={distancematrixResponse.Status}).{distancematrixResponse.ErrorMessage}"); double distanceValueInKiloMeter = 0; if (distancematrixResponse.Rows != null && distancematrixResponse.Rows.Count > 0 && distancematrixResponse.Rows[0].Columns.Count > 0 && distancematrixResponse.Rows[0].Columns[0].Distance != null) { double distanceValueInMeter = distancematrixResponse.Rows[0].Columns[0].Distance.Value; distanceValueInKiloMeter = distanceValueInMeter / 1000; }
So, now let’s go through the code.
In the first part of the code we are merely calling the Distance Matrix API with appropriate parameters
WebClient client = new WebClient(); var url = String.Format($"https://maps.googleapis.com/maps/api/distancematrix/json" + "?units=imperial" + $"&origins=" + originAddress1Latitude + "," + originAddress1Longitude + $"&destinations=" + destinationAddress1Latitude + "," + destinationAddress1Longitude + $"&key={GoogleConstants.GoogleApiKey}"); string response = client.DownloadString(url); System.Runtime.Serialization.Json.DataContractJsonSerializer jsonSerializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(DistanceMatrixResponse)); object objResponse = jsonSerializer.ReadObject(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(response)));
The variables originAddress1Latitude and originAddress1Longitude contain latitude and longitude values of the source entity record. Similarly the variables destinationAddress1Latitude and destinationAddress1Longitude contain latitude and longitude values of the destination entity record. You can have multiple source and destination entities and the API will return distance between each of them, but for the sake of simplicity, I have used only one.
Now the next part of code stores the actual distance in meters. But, we want the distance in kilometers so we multiply the value by 1000.
DistanceMatrixResponse distancematrixResponse = objResponse as DistanceMatrixResponse; if (distancematrixResponse.Status != "OK") throw new ApplicationException($"Server{GoogleConstants.GoogleApiServer} application error (Status={distancematrixResponse.Status}).{distancematrixResponse.ErrorMessage}"); double distanceValueInKiloMeter = 0; if (distancematrixResponse.Rows != null && distancematrixResponse.Rows.Count > 0 && distancematrixResponse.Rows[0].Columns.Count > 0 && distancematrixResponse.Rows[0].Columns[0].Distance != null) { double distanceValueInMeter = distancematrixResponse.Rows[0].Columns[0].Distance.Value; distanceValueInKiloMeter = distanceValueInMeter / 1000; }
The distancematrixResponse object is where response will be stored and will contain the distance. It will contain multiple values including the time it would take to cover the distance but we don’t need that now, do we?
The variable distanceValueInKiloMeter stores the actual value which you can use just about anywhere.
So, in the blog posts starting from part 1, part 2 and this one, I walked you through the task of measuring distance between two entities. Feel free to provide some feedback. It will help me improve my skills.
ATM Inspection PowerApp to ease ATM inspection and report generation process.
https://powerapps.microsoft.com/en-us/partner-showcase/inkey-solutions-atm-inspection/
Insert data into Many-to-Many relationship in Dynamics CRM very easily & quickly, using the Drag and drop listbox.
http://www.inkeysolutions.com/what-we-do/dynamicscrmaddons/drag-and-drop-listbox
Comply your Lead, Contact, and User entities of D365 CRM with GDPR compliance using the GDPR add-on.
https://www.inkeysolutions.com/microsoft-dynamics-365/dynamicscrmaddons/gdpr
Create a personal / system view in Dynamics CRM with all the fields on the form/s which you select for a particular entity using the View Creator.
http://www.inkeysolutions.com/what-we-do/dynamicscrmaddons/view-creator
© All Rights Reserved. Inkey IT Solutions Pvt. Ltd. 2024
Thank you for referring to my blog post.
Thank you for allowing me. Yours was quite comprehensive.