那些惊艳的 GIS 轮子
一、前言
GIS 涉及测绘、几何拓扑、人文社科等多方面的科学知识。在 .Net 平台下有着许多优秀的开源产品,比如:MapWindow
、SharpMap
、WorldWind
等。而在这其中,CoordinateSharp
与NetTopologySuite
是两款极其令人惊艳的中间开发组件产品。直到最近,我才遇到它们。
真的懊恼早没有人告诉我这些优秀的作品的存在。此前都一直在调用 c/c++的接口,虽说其效率很高,但最终产品还是 .Net 桌面的产品,其间各种相互调用后谁也不能保证效率的优势所在。并且出了问题还得反馈到底层开发组去重新修改编译发布一番。更别说调用 Python 的shapely
、geopandas
,或者 Java 的JTS Topology Suite
、GeoTools
等。正如聪明的读者想到的那样,可以将业务服务架构在这些优秀的产品之上。为此,有很长一段时间我都在研究wcf
、asp.net core
、Django
、aspnet-microservices
和docker
等。的确也出了一些效果和性能均令人满意的服务。但被告知后台业务将由 Java 组的人接手。于是,又开始了 Java 的研究,spring boot
、spark
、hbase
等等。也写了一些 Java 的服务端业务。但仍然避免不了高速实时数据处理,并且面向不同终端用户要计算不同需求的问题。最终还是会有一些定制化的业务留在了桌面端。这就像有了云计算后,还需要雾计算、边缘计算作为有益的补充。不可避免的,还得使用 .Net 的实现。
以上都是我用过的各个平台上的优秀产品,没有厚此薄彼的意思。这些也仅仅是为了具体的业务解决问题。下面特别地介绍一下CoordinateSharp
与NetTopologySuite
。二者皆是可以跨平台的 .net core 产品。
二、CoordinateSharp
CoordinateSharp 是一个简单易用的进行地理坐标转换、空间天体计算的产品库。其强大与便捷之处我将以几个简单的小列子进行展示,仅抛砖引玉。
1.地理坐标转换
# 北京天安门广场的经纬度 CoordinateSharp.Coordinate.TryParse("N 39° 54' 27\" E 116° 23' 17\"",new DateTime(2019, 10, 1), out var c); Console.WriteLine($"{c.Latitude.ToDouble()},{c.Longitude.ToDouble()}");//转换结果:39.9075,116.38805555555555
这里有一点令人疑惑的地方就是:为什么会有时间信息。这正是它的独到之处,不仅仅进行坐标转换,还带有计算日、月升落时间,位置等天体信息的能力:
Console.WriteLine($"{c.CelestialInfo.SunRise},{c.CelestialInfo.SunSet}"); # 10/1/2019 10:12:00 PM,10/1/2019 10:00:08 AM
由于时差原因,我们得加上 8 小时(东八区比格林尼治早 8 小时),于是结果变为10/2/2019 6:12:00 AM,10/1/2019 06:00:08 PM
,日出时间变为第二天的早上了。日出减去 24 小时后为10/1/2019 6:12:00 AM
。而日落仍然为10/1/2019 06:00:08 PM
。查阅网上实时的信息: