måndag 22 januari 2018

Spatial Server Tools?

Over time Microsoft has a history of developing mapping services and applications. It spans from Encarta, with map tours, to lately announced Location based services on Azure. MSFT took the path through various online services such as MapPoint, Virtual Earth and Bing Maps.

I believe over time Microsoft have developed suite tools for handling GIS and spatial information (otherwise they would not deliver the services they have). One thing I found a bit odd is the current Bing Maps client is really powerful with the Spatial Math library in combination with services and the new routing API. But there are not so many tools on the server. Of course there is SQL Server and the library Microsoft.SqlServer.Types. Developing server side GIS with .Net you will probably end up with ESRI or NetTopology Suite (NTS), a powerful open source library).

But I believe there is room and a need for yet another library. For example:
  • Test geometry generator, create test geometries
  • IO, various formats.
  • Spatial Math
  • Geometry compression
Above are all low hanging fruit. In fact all of them are in Bing Maps client.

What if just the functions in Bing Maps client would also be available server side? That would include all four points above. Or what if just the Spatial Math library would be available as a NPM package? Or even a Nuget package and expand from that? 

torsdag 18 januari 2018

Drawing a donut in Bing Maps


Background

Polygons with holes aka donuts have been a challange in web mapping. For not too long ago when customers asked if it is possible to have holes in polygons, I was avoiding the question. It is possible to send an array of rings to the polygon constructor. But within Spatial math library it is possible to achieve holes in polygons pretty easy. If a user draw a polygon on top of a polygon on the same layer, it might mean a hole.

Steps

  1. Create a polygon. The easiest way I know for this use case is to make a circle. 
  2. Create another smaller polygon, a polygon that I use to punch out the hole on the bigger polygon.
  3. Use the difference function in Spatial Math library to punch out the polygon.
  4. Add the donut polygon to the map. Done. 

Implementation

Assuming there is an instantiated Bing Maps variable named map...
 Microsoft.Maps.loadModule('Microsoft.Maps.SpatialMath', () =>; {
    const outer = Microsoft.Maps.SpatialMath.getRegularPolygon(map.getCenter(),
                  30, 36, Microsoft.Maps.SpatialMath.DistanceUnits.Kilometers);

    const outerRing = new Microsoft.Maps.Polygon(outer);


    const  inner = Microsoft.Maps.SpatialMath.getRegularPolygon(map.getCenter(), 
                   10, 36, Microsoft.Maps.SpatialMath.DistanceUnits.Kilometers);

    const innerRing = new Microsoft.Maps.Polygon(inner);
        
    const donut = Microsoft.Maps.SpatialMath.Geometry.difference(outerRing, 
                  innerRing);

    map.entities.push(donut);

    });
It is surprisingly easy to accomplish holes in polygons - and drawing circles. It is about ten lines of code depending on how you count it. Inside the module, it is in fact six lines that acctually do something.

It is powerful, easy to use and it solves reall world problems, like drawing islands on a lake. Or lakes on islands.