在地图上显示圆圈会显示拉长的椭圆

时间:2018-08-14 16:42:46

标签: c# sql sql-server spatial gmap.net

我需要在地图上的某个点周围显示一个圆圈。我正在使用Windows应用程序和GMap.NET控件。而不是一个圆圈,我得到了这个:

enter image description here

这是我用来获取多边形点的SQL:

declare @lat float = 43.722385, @lng float = -79.415241, @radius int = 100;
DECLARE @g geography;
SET @g = geography::STGeomFromText('POINT(' + Str(@lat, 10, 7) + ' ' + Str(@lng, 10, 7) + ')', 4326);
SELECT @g.STBuffer(@radius).STAsText() as circle, @g.STBuffer(@radius)

我似乎得到了正确的结果:

enter image description here 但是当您在地图上显示时,正如您在第一张图片上看到的那样,我得到的是椭圆形。

这里是多边形边界的示例,如果我只是查找所有经度和纬度的最大值/最小值,并在bing映射中显示它们,以进行健全性检查,并确认这不只是GMap.NET问题:

enter image description here

这是我使用多边形创建圆的代码:

 List<PointLatLng> points = new List<PointLatLng>();
 string[] ps = radCirclePoints.Split(',');
 foreach (string p in ps) {
     string[] coords = p.Trim().Split(' ');
     points.Add(new PointLatLng(double.Parse(coords[0]), double.Parse(coords[1])));
 }

 GMapPolygon polygon = new GMapPolygon(points, "circ");
 polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
 polygon.Stroke = new Pen(Color.Red, 1);
 markersOverlay.Polygons.Add(polygon);

这是怎么回事?使用STBuffer是一种为多边形显示边界以显示圆形的好方法,但是它在某处失败。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在创建STGeomFromText时,您需要将经度和纬度反转。更改此顺序后,还必须调整要从缓冲区输出中解析它们的顺序。通过反转它们,该点被缓冲,就好像它位于南极/在南极之下,这就是椭圆形的原因。

DECLARE @g geography;
SET @g = geography::STPointFromText('POINT(' + Str(@lng, 10, 7) + ' ' + Str(@lat, 10, 7) + ')', 4326);

SELECT @g.STBuffer(@radius).STAsText() as circle, @g.STAsText() AS point, @g.STBuffer(@radius)

然后在C#

List<PointLatLng> points = new List<PointLatLng>();
 string[] ps = radCirclePoints.Split(',');
 foreach (string p in ps) {
     string[] coords = p.Trim().Split(' ');
     points.Add(new PointLatLng(double.Parse(coords[1]), double.Parse(coords[0])));
 }