YouTube | Facebook | X(Twitter) | RSS

ラスターのジオリファレンス(アジャスト)残差・RMS エラーの取得

2016/9/1 (木)

namespace DesktopConsoleApplication1
{
    class Program
    {
        private static LicenseInitializer m_AOLicenseInitializer = new DesktopConsoleApplication1.LicenseInitializer();
     
        [STAThread()]
        static void Main(string[] args)
        {
            m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeAdvanced },
            new esriLicenseExtensionCode[] { });
 
            //source points
            IPointCollection sourcePoints = new MultipointClass();
            sourcePoints.AddPoint(new PointClass() { X = 13409940.35673, Y = 392571.701364 });
            sourcePoints.AddPoint(new PointClass() { X = 13419810.148396, Y = 393222.743031 });
            sourcePoints.AddPoint(new PointClass() { X = 13420252.85673, Y = 383352.951364 });
            sourcePoints.AddPoint(new PointClass() { X = 13410487.23173, Y = 382519.618031 });
 
            //map points
            IPointCollection mapPoints = new MultipointClass();
            mapPoints.AddPoint(new PointClass() { X = 13410367.811396, Y = 392612.103411 });
            mapPoints.AddPoint(new PointClass() { X = 13420185.51973, Y = 392872.520078 });
            mapPoints.AddPoint(new PointClass() { X = 13420576.14473, Y = 382950.645078 });
            mapPoints.AddPoint(new PointClass() { X = 13410732.39473, Y = 382820.436745 });
 
            //get the adjusted points
            IPointCollection adjustedPoints = adjust(sourcePoints, mapPoints);
 
            //calculate and print the residual and RMS values
            printResidualsAndRMS(adjustedPoints, mapPoints);
 
            Console.ReadLine();
 
            m_AOLicenseInitializer.ShutdownApplication();
        }
 
        static IPointCollection adjust(IPointCollection sourcePoints, IPointCollection mapPoints)
        {
            IAdjustXform axf = new AdjustXformClass();
            axf.DefineFromControlPoints(sourcePoints, mapPoints);
            axf.TransformPoints(esriTransformDirection.esriTransformForward, sourcePoints);
            return sourcePoints;
        }
 
        static void printResidualsAndRMS(IPointCollection pc1, IPointCollection pc2)
        {
            double xSum = 0;
            double ySum = 0;
 
            int pntCount = pc1.PointCount;
 
            for (int i = 0; i < pntCount; i++)
            {
                double X1 = pc1.get_Point(i).X;
                double Y1 = pc1.get_Point(i).Y;
 
                double X2 = pc2.get_Point(i).X;
                double Y2 = pc2.get_Point(i).Y;
 
                double residualX = X2 - X1;
                double residualY = Y2 - Y1;
 
                double residual = Math.Sqrt(Math.Pow(residualX,2) + Math.Pow(residualY,2));
 
                xSum += Math.Pow(residualX, 2);
                ySum += Math.Pow(residualY, 2);
  
                Console.WriteLine(String.Format("Observed X: {0}     Expected X: {1}    Residual X: {2}", X1, X2, residualX));
                Console.WriteLine(String.Format("Observed Y: {0}     Expected Y: {1}    Residual Y: {2}", Y1, Y2, residualY));
                Console.WriteLine(String.Format("Residual {0}", residual));
            }
 
            double xRMS = Math.Sqrt(xSum / pntCount);
            double yRMS = Math.Sqrt(ySum / pntCount);
 
            double totalRMS = Math.Sqrt(Math.Pow(xRMS, 2) + Math.Pow(yRMS, 2));
 
            Console.WriteLine(totalRMS);
        }
    }
}
  • この記事を書いた人

羽田 康祐

伊達と酔狂のGISエンジニア。GIS上級技術者、Esri認定インストラクター、CompTIA CTT+ Classroom Trainer、潜水士、PADIダイブマスター、四アマ。WordPress は 2.1 からのユーザーで歴だけは長い。 代表著書『"地図リテラシー入門―地図の正しい読み方・描き方がわかる』 GIS を使った自己紹介はこちら。ESRIジャパン(株)所属、元青山学院大学非常勤講師を兼務。日本地図学会第31期常任委員。発言は個人の見解です。

-プログラミング, ArcGIS
-,