GDAL(C# Wrapper)、NTS、ArcGIS Object SDK 关于 Geometry IsEmpty的认定差异。

在使用 GDAL(C# Wrapper)、NTS、ArcGIS Object SDK 过程中发现这几个类库对于 Geometry 是否为空图形的认定不同,具体差异如下:

  1. Point 对象
类型情况GDALNTSAO
Point对象无值(内部坐标对象为Null)Not Support 1TrueUnKnow
Pointx 或 y 值为 NaNTrueFalseTrue
Pointx 或 y 值为 double.MinValue 2FalseFalseFalse
  1. MultiPoint 对象
类型情况GDALNTSAO
MultiPoint对象无值(内部坐标串数量为0)TrueTrueTrue
MultiPoint总点对象数量>0且都为 Empty 点对象TrueFalseTrue
MultiPoint总点对象数量>0且部分点对象为 Empty 点对象FalseFalseFalse
  1. Polyline(MultiLineString)、Polygon(MultiPolygon)对象
类型情况GDALNTSAO
Polyline、Polygon对象无值(内部坐标串数量为0)TrueTrueTrue
Polyline、Polygon总点对象数量>0且都为 Empty 点对象FalseFalseFalse
Polyline、Polygon总点对象数量>0且部分点对象为 Empty 点对象FalseFalseFalse
  1. Path(LineString)、 Ring(Polygon)对象
类型情况GDALNTSAO
Path、Ring对象无值(内部坐标串数量为0)TrueTrueTrue
Path、Ring总点对象数量>0且都为 Empty 点对象FalseFalseFalse
Path、Ring总点对象数量>0且部分点对象为 Empty 点对象FalseFalseFalse

NTS相关判断代码:

//Point
public override bool IsEmpty => _coordinates.Count == 0;

//Other Geometry
public override bool IsEmpty => _points.Count == 0;

//GeometryCollection
public override bool IsEmpty
{
    get
    {
        for (int i = 0; i < _geometries.Length; i++)
        {
            if (!_geometries[i].IsEmpty)
            {
                return false;
            }
        }

        return true;
    }
}

GDAL相关判断代码:

//Point
virtual OGRBoolean IsEmpty() const override
{
    return !(flags & OGR_G_NOT_EMPTY_POINT);
}

OGRPoint::OGRPoint(double xIn, double yIn) : x(xIn), y(yIn), z(0.0), m(0.0)
{
    flags = GetEmptyNonEmptyFlag(xIn, yIn);
}

static int GetEmptyNonEmptyFlag(double x, double y)
{
    if (std::isnan(x) || std::isnan(y))
        return 0;
    return OGRGeometry::OGR_G_NOT_EMPTY_POINT;
}

//GeometryCollection
OGRBoolean OGRGeometryCollection::IsEmpty() const
{
    for (auto &&poSubGeom : *this)
    {
        if (poSubGeom->IsEmpty() == FALSE)
            return FALSE;
    }
    return TRUE;
}

总结:NTS内判断图形是否为空仅有一个条件,即该图形内部的坐标数量是否为0,GDAL 与 AO 对于 Point、MultiPoint 两种数据有额外判断条件,其它数据类型判断条件与 NTS 一致。对于 Point 数据而言,只要坐标内数据X或Y值为 NaN,则该对象为空图形,对于 MultiPoint 数据而言,图形内部的坐标数量为0或图形内部的每个个坐标都满足X和Y值中至少有一个为 NaN,则该对象为空对象。


  1. GDAL 中的 Point 对象的内部坐标对象一定存在,且恒等于 1,无法删除、添加,调用 AddPoint 函数等效于更新函数,会将Point 的坐标信息进行更新。 ↩︎

  2. 在 shpfile 文件中,坐标值如果等于 double.MinValue,AO在解析过程中会转换为 NaN。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值