在使用 GDAL(C# Wrapper)、NTS、ArcGIS Object SDK 过程中发现这几个类库对于 Geometry 是否为空图形的认定不同,具体差异如下:
- Point 对象
类型 | 情况 | GDAL | NTS | AO |
---|---|---|---|---|
Point | 对象无值(内部坐标对象为Null) | Not Support 1 | True | UnKnow |
Point | x 或 y 值为 NaN | True | False | True |
Point | x 或 y 值为 double.MinValue 2 | False | False | False |
- MultiPoint 对象
类型 | 情况 | GDAL | NTS | AO |
---|---|---|---|---|
MultiPoint | 对象无值(内部坐标串数量为0) | True | True | True |
MultiPoint | 总点对象数量>0且都为 Empty 点对象 | True | False | True |
MultiPoint | 总点对象数量>0且部分点对象为 Empty 点对象 | False | False | False |
- Polyline(MultiLineString)、Polygon(MultiPolygon)对象
类型 | 情况 | GDAL | NTS | AO |
---|---|---|---|---|
Polyline、Polygon | 对象无值(内部坐标串数量为0) | True | True | True |
Polyline、Polygon | 总点对象数量>0且都为 Empty 点对象 | False | False | False |
Polyline、Polygon | 总点对象数量>0且部分点对象为 Empty 点对象 | False | False | False |
- Path(LineString)、 Ring(Polygon)对象
类型 | 情况 | GDAL | NTS | AO |
---|---|---|---|---|
Path、Ring | 对象无值(内部坐标串数量为0) | True | True | True |
Path、Ring | 总点对象数量>0且都为 Empty 点对象 | False | False | False |
Path、Ring | 总点对象数量>0且部分点对象为 Empty 点对象 | False | False | False |
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,则该对象为空对象。