c# - 在 map 上显示圆圈会显示拉长的椭圆形

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

我需要在 map 上的一个点周围显示一个圆圈。我正在使用 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 但是当显示在 map 上时,我得到了一个椭圆,正如您在第一张图片上看到的那样。

这是多边形边界的示例,如果我只是找到所有 lats 和 lngs 的最大/最小值并将它们显示在 bing map 中作为完整性检查并确认这不仅仅是一个 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 是找到多边形边界以显示圆的一种优雅方式,但它在某处失败了。有什么想法吗?

最佳答案

当您创建 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])));
 }

关于c# - 在 map 上显示圆圈会显示拉长的椭圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846175/

相关文章:

c# - vs2008 c# : Facebook. rest.api 如何使用它获取好友列表?

c# - 在添加迁移期间忽略来自引用程序集的实体

mysql - 如果不使用另一个表作为 'SELECT' 语句,则检查表是否存在

sql-server - SQL Server 2000 : Invalid column name 'bar'

c# - 在c#中运行Stanford.NLP.CoreNLP 3.8示例时出现TypeInitializationException

c# - 实现文件上传的 MVP 模式

php - 用于 WordPress 中非唯一列更新的 MySQL 重复条目

php - 获取特定日期的记录

mysql - 使用 PDO 返回最接近表中日期的 Mysql/MSSQL

java - 如何检查 JAVA 代码(持续存在于数据库中)是否正确完成或突然终止?