我正在用C#编写WinForms应用程序。我需要确保Datarow中的两个Datatable相距不超过100公里。每行在单独的DataColumn中具有UTM区域,东移和北移。所有坐标都使用相同的基准,但是有些坐标具有不同的区域(否则,由于UTM以米为单位,因此我将仅使用pythag数学)。到目前为止,我正在使用下面的代码来执行此操作,但是我的DbGeography.PointFromText方法似乎运行不正确(请参阅代码中的*),因为当代码到达带有'**的代码行时'开始时,我收到一条错误消息:“24201:纬度值必须在-90到90度之间”。我也尝试过:

dtTrap.Rows[i]["TrapGeog"] = DbGeography.PointFromText(pointWellKnownText: "POINT M(" + dtTrap.Rows[i][intEastingIndex].ToString() + " " + dtTrap.Rows[i][intNorthingIndex].ToString() + " " + dtTrap.Rows[i][Zone].ToString() + ")", coordinateSystemId: SRID);

只是提示它“没有第17列”(17是我的UTM区域)。

据我所知,我发现使用这些东西的文档很少。据我所知,我的SRID是正确的(我从this site提取了它们)。我以前使用Lat + Longs做过这种事情,并且效果很好。我只是找不到适合UTM的语法。
using System.Data.Entity.Spatial;
...
DataColumn dcGeog = new DataColumn("TrapGeog", typeof(DbGeography));
dtTrap.Columns.Add(dcGeog);
byte Zone;
Int16 SRID;
for (int i = 0; i < dtTrap.Rows.Count; ++i)
{
    if (dtTrap.Rows[i][intZoneIndex] != null
    && dtTrap.Rows[i][intNorthingIndex] != null
    && dtTrap.Rows[i][intEastingIndex] != null
    && byte.TryParse(dtTrap.Rows[i][intZoneIndex].ToString(), out Zone) == true)
    {
        if (Zone == 15) { SRID = 26915; }
        else if (Zone == 16) { SRID = 26916; }
        else if (Zone == 17) { SRID = 26917; }
        else { SRID = 26918; }
        // shove it in:
        try
        {
            *dtTrap.Rows[i]["TrapGeog"] = DbGeography.PointFromText(pointWellKnownText: "POINT(" + dtTrap.Rows[i][intEastingIndex].ToString() + " " + dtTrap.Rows[i][intNorthingIndex].ToString() + ")", coordinateSystemId: SRID);
        }
        catch (Exception ex)
        {
            if (ex.InnerException != null)
            {
                **MessageBox.Show(ex.InnerException.Message);
            }
            else
            {
                MessageBox.Show(ex.Message);
            }
        }

    }
}
for (int i = 0; i < dtTrap.Rows.Count - 1; ++i)
{
    for (int k = i + 1; k < dtTrap.Rows.Count; ++i)
    {
        DbGeography iTrap = (DbGeography)dtTrap.Rows[i]["TrapGeog"];
        DbGeography kTrap = (DbGeography)dtTrap.Rows[k]["TrapGeog"];
        if (iTrap.Distance(kTrap) > 100000)
        {
            sbErrorsAndWarningsLog.Append(@"Warning:  Line number " + (i + 2).ToString() + " on the Trap spreadsheet has coordinates that are at least 100 km away from row " + (k + 2).ToString() + "'s point.  Please check that these coordinates are correct.").AppendLine();
            boolWarningsFound = true;
            break;
        }
    }
}

最佳答案

为了弄清楚这一点,我在一个姐妹网站here上偶然发现了该帖子。我认为DbGeography基于SQL Server的地理数据类型,而DbGeometry同样基于几何数据类型。

一些相关的花絮:



...



因此,我将代码更改为:

DataColumn dcGeom = new DataColumn("TrapGeom", typeof(DbGeometry));
...
dtTrap.Rows[i]["TrapGeom"] = DbGeometry.PointFromText(pointWellKnownText: stPoint, coordinateSystemId: SRID);

它似乎可以很好地解析。不过,帖子的最后部分让我担心:



因此,当我最终执行if (Trap1.Distance(Trap2) > 100000) ...时,当我在不同的SRID中有两个不同的点时,我就期望它会出现故障。我将对所发现的内容进行测试并发表评论。

关于c# - 在C#中将UTM坐标解析为DBGeography,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48835261/

10-13 06:24