回答:
これを行うための既存のツールは知りませんが、ArcPyで記述したり、GDAL / OGRを使用して次のように記述したりできます。
以下は1つの可能なアプローチです。この関数は、ポリゴンに特定のサイズ未満の角度があるか、ターゲット角度の範囲内にあるかによって、trueまたはfalseを返します。これは非常に単純なアプローチであり、直線的なデジタル化を前提としています。私は円をテストしますが、曲線や、機能が作動する可能性のある他の可能性をテストしません。
angleTarget =希望する角度(例:90)。
edgeVariance =直線の許容ワッフル(例:0.5度の方向変更が許可されます)。
angleVariance =希望する角度の許容偏差(例:91度がOKの場合は1)。
ブライアン
private static bool AngleWithinTolerance(IPolygon pPoly, double angletarget, double edgeVariance, double angleVariance)
{
GeometryEnvironment geometryEnvironment = new GeometryEnvironment();
IConstructAngle constructAngle = geometryEnvironment as IConstructAngle;
IPointCollection ptcol = (IPointCollection)pPoly;
double angle;
//No circles!
if (ptcol.PointCount < 3) return false;
//Check angle made by last point first point and second point in the collection.
angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(ptcol.PointCount - 2), ptcol.get_Point(0), ptcol.get_Point(1)) * (180/3.14159250439667));
if (angle < edgeVariance || (angle < angletarget + angleVariance & angle > angletarget - angleVariance))
{
//Angle at index 0 is OK - check all other points in collection.
for (int x = 0; x != ptcol.PointCount - 2; x++)
{
angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(x), ptcol.get_Point(x + 1), ptcol.get_Point(x + 2)) * (180 / 3.14159250439667));
if (angle > edgeVariance & (angle > angletarget + angleVariance || angle < angletarget - angleVariance))
{
return false;
}
}
}
else
{
return false;
}
//never failed.
return true;
}