måndag 7 augusti 2017

How far can my electric car take me?

Routing- and module pearls in Bing Maps

Bing maps v8 has been released quite some time now. At a first glance, the API offering what to expect. There are a few things that I would like to have seen as part of the core API.  For example, GeoJSON as it is more or less the industry standard transferring GIS data over network.  However, the sweet juicy bits are in modules and are available whenever needed. Be aware it is not JavaScript modules. The modules spans from visualization, parsing, digitizing to analyze. Some modules, such as GeoJSON, might over time be part of the core API. Adding GeoJSON parsing would indeed make sense. For a complete list of modules see https://msdn.microsoft.com/en-us/library/mt712663.aspx.

Microsoft.Maps.SpatialMath is a truly competent module. That module adds complex spatial calculations and analysis. And yet there is more, combining this module with projects like Nanjing opens up for interesting applications.  For example, how far can I get with my electric car? Or, consider truck drivers, at least in Sweden, they are allowed to drive for a limit of time without having a break. Let’s say 2 hours, then they need to have a break for 15 minutes or so, then they can continue. I don’t know the exact limits. The industry definitely has a need to plan the route with stops accordingly to regulations. For example they might need to find a stop along the route between 90-120 minutes.

To resolve the use case above one way could be:

  1. Calculate the route from A to B.
  2. Calculate Isochrones from start to 120 minutes.
  3. Calculate Isochrones from start to 90 minutes.
  4. Use Microsoft.Maps.SpatialMath.difference operation to resolve the area between 90-120 minutes.
  5. Buffer the area, Microsoft.Maps.SpatialMath.buffer
  6. Use the buffered area and Microsoft.Maps.SpatialMath.intersection operation to calculate the route that is between 90-120 minutes (intersection)
  7. Visualize the calculated (intersected) area.

In these steps, a pretty complex problem has been addressed. From the routing-service I got the isochrones, then it is easy to combine the isochrones with geometry math operations. The operations I used is:
  • Intersection (to see where the buffer overlaps the difference area.
  • Buffer (for better visualization of the located area)
  • Difference (between the isochrones)


Now it is easy to find a spot where the driver must find a place to stop. Remember, from the beginning this is not a trivial problem, by combining powerful geodataservices, client-side operations and knowing how to solve the pieces in the puzzle makes it is easy to finish.

I made a demo application to this post. https://github.com/perfahlen/BingMaps-Routing-And-Module-Pearls

måndag 17 juli 2017

Extended geospatial routing service in Bing Maps?

Sometimes GIS are complicated. Especially when it comes to access to data. I remember when I was building a dynamic routing engine based on PostGIS and data from Navteq. The dynamic part consisted of different vehicles behaving different in traffic. For example a truck or bus doesn't behave in the same way as a motorcycle or car. And moreover there can be obstacles, for example height and weight on bridges or the curve is too narrow. Most of the routing engines today are fast - not dynamic, or dynamic and less fast. 

However, after discussed with a good friend about the secret keys to routing, using most of networks SQL indexes skills, adding some routing tricks we manage to make it pretty fast and dynamic, for the time being (2011). But it was hard to make it scale. Routing is CPU heavy and there are no rights and wrongs when it comes to routing. For example, the best route can be the shortest, fastest, safest or maybe most beautiful! 

Isochrones 

During that time I also played with isochrones. An isochrone is the routing extent, for example 50 km from a given point. Not just a circle. In every case 50 km radius covering a bigger area than the corresponding isochrone. I have seen many municipalities using radius for example for the fire department. However, project Nanjing addresses that issue.

Radius and Isochrone showing approximately 60 km from
Sundsvall, Sweden
Projects as Nanjing are important making complicated use cases available for the public. Many organizations doesn't have the knowledge, fundings etc to pull this off. Using real distances, or time to calculate coverage or use it for further processing. I hope many other data providers with API:s will consider taking a GeoJSON as an argument. In that way, it will be possible to from a GeoJSON as one criteria among others. Project Wollongong from Microsoft probably makes that behind the scenes. 

After trying the Nanjing API for the first time I was a bit surprised. I expected a GeoJSON as response, but it was a JSON with geographical information. It is not a big thing and it is easy to serialize - but I was surprised. My experience is to use standards whenever it possible. And in this case sending geographical information as JSON I use GeoJSON. The projects API is pretty straight forward to use and there are examples in a handful of languages.

However project Nanjing as a really new cool useful geospatial feature available for preview as today. I hope it will be part of the Bing Maps platform since it address an important useful feature.

There are several others project available for preview and a presentation on channel9.

tisdag 4 juli 2017

POGO RENT 3000 PART 2


In the first part, I described how to build for a robust GIS system. In this part I’ll move on to static maps and modules.

The Pogo Rent Website have a need to show a few non-interactive map images where it is great to Pogo. Moreover, the company also wants to send confirmation e-mails to customers who have booked a pogo. In the e-mail maps should be included showing great place to pogo in the area where they have rented the pogo.

Static Maps

Static maps are great. In many cases you just need to provide an image. You really don’t need an interactive map. Sometimes you just want to show a location, or a route between locations. For this purpose, static maps are great. So where does static maps fit in our solution? On our web site! We want to show spots where it is great to pogo. It is really easy to embed a static map. Just treat it as any image! For example
<img src="http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/-28.014407569005286,153.42029571533203/12?mapSize=200,200&key={BING KEY} />




The above will include an image on a web page that is 200x200px in size. Since it is an image it can be treated as an image. For example, put them in a slider. It is a bit tricky to get the URL correct, here is the documentation on MSDN https://msdn.microsoft.com/en-us/library/ff701724.aspx. And a 3rd party configuration tool is available online here http://staticmapmaker.com/bing/.
In the example site, I have just included static maps as images since it fits our purpose of showing where to pogo.

Modules

Modules is a pluggable technique to add functions to Bing Maps. In the demo site the GeoJSON module being used. There are a several modules, for a complete list see here, https://msdn.microsoft.com/en-us/library/dd877180.aspx. There is also an open source project for modules on Codeplex. The project is originally for Bing Maps v7 control, the good news is most of them works with v8 control. There is a compability list here https://bingmapsv7modules.codeplex.com/wikipage?title=Module%20Compatibility%20with%20Bing%20Maps%20V8.

Open source Modules


The v7 contral has an open source project for modules. I think the modules for v8 control should be released as Open Source, with a MIT-license. Modules extends the control and therefor it provides a great opportunity for developers to modify, enhance, extend modules to fill their needs. V7 control has a great project, I know many modules works for v8 control. Combining v7 modules and v8 modules would be a powerful combination. I think the modules have a place on GitHub like many other Bing Maps project from Microsoft. More over, I think Microsoft is the natural coordinator and organizer of such open source project. There is a risk that there will be modules spread in different repositories and no compilation of the modules.  The compiled list on Codeplex is really an asset. It also gives a hint of no of contributors that work in one place. So with this paragraph I really encourage to coordinate such project to keep the modules together.

The code is here on GITHUB and a live example temporary hosted here..

onsdag 21 juni 2017

Pogo Rent 3000

Background

The aim of the article is to give and idea how to build robust GIS applications build on .Net and Bing Maps.
Pogo Rent 3000 is a fictional company that hires pogo sticks round the world. As a consultant, I am asked to help implement GIS functionality to their web site and to where ever it gives value. Through a couple of posts I will show how to address this in a pragmatic way. For start the company wants to show a basic map with great Pogo parks in northern Sweden.
The aim of this article is to describe the implementation of Pogo Rent 3000. The idea of this project is to provide a solid implementation of a GIS project based on Bing Maps. The techniques and framework used are well known and provide a robust foundation for GIS applications.
I strongly recommend using standard formats for communication with GIS backend is really importance and cannot be stated enough. The application also showing an example of an endpoint that simulates a Web Feature Service (WFS from OGC, see http://www.opengeospatial.org/standards/wfs) or included in the code as a GeoServiceController. OGC formats and protocol gives flexibility and maintainability.

Application structure

The application is structured the simplest way possible and providing a robust platform to extend the system later on. I build a classic 3-tier application.

UI Tier

On top there is Bing Maps V8, it is one of the best map client out there as today. It provides a straight forward, documented API. More over a set of spatial function like measuring and a set of modules. A module is functionality you can extend the web client with. For example, with GeoJSON, (http://geojson.org) support. The small script that is needed is, for convenience, written in TypeScript. GeoJSON is an OGC standard since 2016. This means we can add in other datasets from other sources without worrying about the format as long as it is GeoJSON.
With the GeoJSON module it is super easy to parse the JSON from the server.
let primitives = Microsoft.Maps.GeoJson.read(geoJSONtext) as Array;

Service Tier

As service tier I have a Asp.NET Web API. This tier is boosted with Net Topology Suit (NTS, https://github.com/NetTopologySuite/NetTopologySuite) which provide a rich set of GIS operations. NTS is great for adding spatial functions to the application. It also provides GeoJSON support. With this in place we have the possibility to serve OGC formats.

Data Tier

In this example we use a single text file as data source. The source is a GeoJSON file. I could of course easily just accessed GeoJSON file directly through a GET request from the client but for demo purpose I actually read and parse the file with NTS. The data tier also have an interface. The idea with the interface is that it should be easy to add other data sources, for example SQL Server.
Reading GeoJSON with NTS is really simple, here is a snippet from the application:
var reader = new NetTopologySuite.IO.GeoJsonReader();
var features = reader.Read<FeatureCollection>(data);
     
Data is the GeoJSON. It will parse the json into an object which we can spatial filter, manipulate compare or do other operations.

Wrap up

With the techniques and framework in place, it is pretty straight forward to implement. The implementation is as simple as possible and it provides possibility to extend the PogoRent3000 system. To summarize, building a GIS application is not different than building any 3-tier application.

A demo application is online here.

And the code is here 

A special thanks to SoulSolutions.










onsdag 7 juni 2017

Maps for blinds - with Bing Maps

In the late 90's I worked with Swedish Institute for Disability, we were doing R&D about Maps for people who are either blind or a big disability seeing. Last week at an event the last session was about how IT made life more accessible for people who are blind. I was not surprised I met a blind programmer. Back in the 90's we were doing C++, nowadays it is C#. 

After that session I started to think that maybe many of our challenges at that time would be more easy to overcome now or even not a problem. A major challenge at that time was just access to GIS data. Today it is not a problem. At that time text to speech was also a problem and really a new thing, at least on the consumer market. Today, there are several on Windows Store for free.

I have made some Googling, and Binging and I found some ambitious initiatives regarding the subject. But some were even not working and were build on outdated libraries. So I decided to do something by combining the thoughts we had from that late 90's and common widespread technology. And guess what. Things that took weeks or months took me just a couple of hours. Most of the time thinking, maybe this is not relevant. But I decided to publish this anyway.

describing the application
Every person has a mental map we use to navigate. We know, or at least have an idea how locations are related. One idea about the application is to help the user to build up an mental map about how things are related. That is one reason the application is really simple and narrowed down. It consists of three text fields:

1. Bing maps key field
2. Search field 
3. Result field. 

The search field as made for searching. The result field is made for display search result WHEN the user clicked on the map. When the user clicks on the map there is a reverse geo-coding made in the background. The result is displayed in the text field so it should be possible to use the speech to text.

When the user moves the mouse it will give a sound signaling the user how close to center of the map she is. The brighter sound the closer to the center. Combing sound, reverse geo-coding and searching I hope this might useful.

I also started to think that vendors should also provide semantic about the imaginary the deliver. It would be interesting to request metadata over a view as when requesting itinerary. 

Here is the code. You need to provide your own Bing Maps key. You can get one from the portal.



tisdag 21 mars 2017

Browser: HTTP Error 502.5 - Process Failure

Just upgraded to Visual Studio 2017 from Visual Studio 2015. Everything went well until I deployed the application. I kept getting 502.5 from the server.

I turns out Visual Studio 2017 changed   from 1.1.0 to 1.1.1. I found it by opening the project.csproj file.Just right click on the project open the file and make sure 
Lägg till bildtext
the hosting environment has that version installed. In my case I just needed to change back to 1.1.0 and bang it started to work.

Here is where I got the hint what to search for.


måndag 20 mars 2017

Bing Maps and GeoBuf

Background
Geographic data can be large, or huge in size. Lots of application demands offline data or for scenarios where you have limited storage, like mobile devices. GeoJSON is the industry standard for communication from server to web client. It has many advantages, for example it is standardized and readable for humans. A disadvantage is that it can have loads of redundancy, for example it can share the same border which increases the data set. For that there is another format, TopoJSON which can save 80% or even more.

Both formats are text based and the commonality is JSON. When it comes to large datasets: if it is possible using TopoJSON is a good idea depending on how the data sets looks like. It is also possible to down size the data by cutting some decimals. But sometimes it is not enough. Sometimes we need something else. Something that makes a different. GeoBuf is such a format that is not so public known but the format is on uprising the last years.

GeoBuf

GeoBuf is an extension of Protocol Buffers. GeoBuf using GeoJSON when encoding the data. In the example provided it packed the data almost x 10. Since GeoBuf using GeoJSON it is straight forward to apply. I would be surprised if it doesn’t show up in spatial servers soon, there is an initiative for PostGIS. However, the product is from one vendor, not standardized so there is no guarantee that it will not be changed without notice or backword compability. Not likely though, but possible working with propriety formats. GeoBuf comes with ISC license. The downside of geobuf is it takes some time to first unpack the data and then parse the GeoJSON.



Example implementation

The example provided packs the countries in the world, a GeoJSON file with the size of 23.5 MB. The server logic, written in NodeJS, is super easy and straight forward.



var countries = fs.readFileSync("./public/countries.json")
var geoJson = JSON.parse(countries)
var content = geobuf.encode(geoJsonnew pbf())
var buffer = Buffer.from(content)
return buffer

That’s it! We are done on the server. The example using Express for structure and routing in the application.

On the client. It is even easier with the GeoJSON module!

var geojson = geobuf.decode(new Pbf(geoBuffer));
var geoms = Microsoft.Maps.GeoJson.read(geojson);
client.map.entities.push(geoms);

So, with 7 lines of code GeoBuf helped downsize the data size with a factor of almost x10!




And network data.






Happy buffering!