точность площади полигона

Системы координат, проекции, преобразования, привязка
Ответить
fvlad
Новоприбывший
Сообщения: 5
Зарегистрирован: 14 апр 2009, 10:08
Репутация: 0

точность площади полигона

Сообщение fvlad » 31 июл 2009, 10:43

Доброго дня всем.
я пишу свой генератор отчетов для землеустройства на основе текстовых файлов с координатами и сталкнулся со следующей проблемой:
1. создаю полилинию в Автокаде, и макросом выгружаю все ее координаты в txt с точностью до 2-го знака после запятой(в Автокаде в Юнитс установлено "Метры" и "0.00"), а недавно написал парсер для MID/MIF в которых точность описания координат 6 знаков после запятой, типа так:

Код: Выделить всё

Region  1
  5
12542.86281 -1649.421804
12561.2033 -1616.825747
12589.73248 -1627.012002
12579.54379 -1665.719729
12542.86281 -1649.421804
    Pen (1,2,0) 
    Brush (2,16777215,16777215)
    Center 12566.29764 -1641.272738
расчет площади произвожу так (взято тута):

Код: Выделить всё

public double Area
        {
            get
            {
                double s = 0;
                double res = 0;
                if (areaValid == false)
                //{
                //    for (int i = 0; i < Vertexs.Count - 1; i++)
                //    {
                //        //_Area += Vertexs[i].X * Vertexs[i + 1].Y - Vertexs[i + 1].X * Vertexs[i].Y;
                //        _Area += (Vertexs[i].X + Vertexs[i + 1].X) * (Vertexs[i].Y - Vertexs[i + 1].Y);
                //    }
                //    //_Area += Vertexs[Vertexs.Count - 1].X * Vertexs[0].Y - Vertexs[0].X * Vertexs[Vertexs.Count - 1].Y;
                //    _Area += (Vertexs[Vertexs.Count - 1].X + Vertexs[0].X) * (Vertexs[Vertexs.Count - 1].Y - Vertexs[0].Y);
                //    _Area = Math.Abs(_Area / 2);
                //    //
                //    //_Area = Math.Round(_Area, 0);
                //    areaValid = true;
                //}
                    
                    for (int i = 0; i < Vertexs.Count; i++)
                    {
                        if (i == 0)
                        {
                            s = Vertexs[i].X * (Vertexs[Vertexs.Count - 1].Y - Vertexs[i + 1].Y); //если i == 0, то y[i-1] заменяем на y[n-1]
                            res += s;
                        }
                        else
                            if (i == Vertexs.Count - 1)
                            {
                                s = Vertexs[i].X * (Vertexs[i - 1].Y - Vertexs[0].Y); // если i == n-1, то y[i+1] заменяем на y[0]
                                res += s;
                            }
                            else
                            {
                                s = Vertexs[i].X * (Vertexs[i - 1].Y - Vertexs[i + 1].Y);
                                res += s;
                            }
                    }
                _Area = Math.Abs(res/2);
                _Area = Math.Round(_Area, prec);
                areaValid = true;
                return _Area;
            }
        }
и при чем больше количество точек и больше площадь, тем больше несоответствие моей расчетной площади и площади в МапИнфо и Автокаде.
В чем моя ошибка? или они как то по другому считают площадь?

конкретно пример на основе автокада:
внутренности файла

Код: Выделить всё

1007.87 2503.63
22241.68 2503.63
21698.10 11068.55
19217.99 15758.86
17315.44 17220.33
17111.60 17220.33
13442.39 18307.94
11539.84 18307.94
10520.62 18307.94
10860.36 18307.94
8380.25 16948.43
8380.25 16030.76
8380.25 14535.30
8380.25 13889.53
8719.99 13889.53
8719.99 12326.10
7870.64 11850.27
8006.54 11850.27
6002.07 11204.50
6409.76 11204.50
4439.26 10252.84
4575.15 10252.84
2366.84 8009.65
2366.84 8179.59
1721.33 5936.40
площад автокада - 244 804 048,37 кв.м.
моя площадь - 244 804 115,72 кв.м. - разница в 67 кв.м.

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: точность площади полигона

Сообщение Boris » 31 июл 2009, 18:23

Скажите точно, что вы НЕ издеваетесь, что время зря не тратить.
Мой калькулятор говорит, что расхождение составляет 2,75e-5 процентов или 3 десяти-милиионых части.
Даже ошибки округления дают большие погрешности.
Кроме того, раз уж вы писали парсер в MIF/MID, то ГДЕ:
1. Система координат для MIF/MID
2. Полный текст для этого же полигона в MIF/MID
3. Площадь, которую для вашей системы координат рассчитала MapInfo

fvlad
Новоприбывший
Сообщения: 5
Зарегистрирован: 14 апр 2009, 10:08
Репутация: 0

Re: точность площади полигона

Сообщение fvlad » 03 авг 2009, 05:54

ну что же вы так сразу :oops: . издевки никакой, просто хочу выяснить где ошибаюсь.


итак, создал полигон в мапинфо, План-схема(метры)
его площадь - 73516265 кв. м. слой с этим полигоном экспортирован в MIF/MID.
В autoCAD Map 3D 2009 MIF/MID импортирован (СК - arbitrary X-Y Meters).
автокадовская площадь - 73516264.82 кв.м.

у меня выходит при обработке MIFа 73516229,46 кв. м.

внутренности MIF

Код: Выделить всё

Version   300
Charset "WindowsCyrillic"
Delimiter ","
CoordSys NonEarth Units "m" Bounds (0, 0) (1000000, 1000000)
Columns 2
  num Integer
  Name Char(30)
Data

Region  1
  53
489540.8635 436089.5495
489659.2635 436657.9335
489825.0235 437344.7175
489825.0235 437771.0055
489825.0235 438149.9175
489706.6235 438765.6615
489588.2235 439499.8055
489588.2235 439712.9575
489588.2235 440044.5095
489753.9835 440826.0295
489801.3435 441157.5815
490180.2875 441891.7255
490630.2395 442436.4295
490677.5995 442744.3015
491174.9435 443217.9495
491790.6875 443478.4455
492382.7195 443691.5975
493803.6795 443904.7335
494632.5435 443786.3175
495437.7275 443454.7655
496385.0555 443052.1735
496977.1195 442981.1175
497545.4395 442673.2455
497805.9835 441986.4615
497805.9835 441749.6295
497924.3835 441110.2055
498847.9675 439736.6375
498824.2875 439547.1815
498611.1675 438623.5655
498492.7675 438126.2375
498398.0475 437439.4535
498279.6475 436847.3895
497971.7435 436231.6455
497450.7195 435521.1735
496834.9755 434621.2455
496385.0555 434029.1895
495911.3915 433673.9495
495579.8075 433650.2695
494987.7435 433697.6375
494490.4635 433792.3655
493898.3995 434266.0135
493661.5675 434502.8375
493211.6155 434810.7095
492548.5115 434929.1175
491790.6875 434858.0695
490867.0715 434763.3415
490275.0075 434881.7495
490227.6475 434952.7975
490061.8555 435118.5735
489635.5835 435402.7655
489469.7915 435473.8135
489469.7915 435473.8135
489540.8635 436089.5495
    Pen (1,2,0) 
    Brush (2,16777215,16777215)
    Center 494158.8795 438777.5015

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: точность площади полигона

Сообщение Boris » 03 авг 2009, 20:18

MI говорит:
73 516 265 sq m
Clipboard05.gif
Clipboard05.gif (7.23 КБ) 8370 просмотров
Выходит они с Автокадом думаю одинаково.
Для начала еще раз просмотрите свой исходный алгоритм, может в нем есть какие не очевидные допущения.
Второе, что надо сделать - начать считать как MI. У вас границы выставлены в 1 000 000 метров. 1000 км - очень богатое допущение. При таких размерах Земля уже становится круглой.
Значит согласно стратегии MI - она хранит единицы в виде целых чисел, округленных ДО 0.5 метра.
Проведите свои вычисления в целых числах, умноженных на два. Результат поделите на 4. С переменными - тоже только целочисленными :shock: , а не плавающими, может все дело в этом наследии времен, когда сопроцессор был сильно дороже процессора ? Может тогда и сойдется.
Как известно Автокад, ну до версии = 14, то же точно был целочисленным. Потом - не знаю...
---
Либо все таки дело в том, что надо найти еще один алгоритм?

fvlad
Новоприбывший
Сообщения: 5
Зарегистрирован: 14 апр 2009, 10:08
Репутация: 0

Re: точность площади полигона

Сообщение fvlad » 04 авг 2009, 05:25

Спасибо.
В приведенном выше C#-ом коде верхняя часть закомментирована, это перваначальная формула. По ней результат такой же как и по незакомментированному коду. еще есть и др метод - везде используется одна и та же формула аналитического метода определения площади полигона. 2 из них писанные другими людьми и взяты из опенсорсных ГИС проектов.
и еще использовал по-началу тип данных float, теперь double - на результат не повлияло :(
спасибо за способы хранения координат.
буду проверять еще.

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: точность площади полигона

Сообщение Boris » 04 авг 2009, 18:52

В вашем случае, я бы все же проверил точность алгоритма, по шагам, как учили в средней школе - методом индукции:
1. для треугольника, каковы различия
2. для четырех угольника (3+1)
3. Для 16 угольника выпуклого
4. Для аналогичного, но невыпуклого
5. Для вашего многоугольника.
---
Думаю, что основная засада кроется в том, как разбивается исходный многоугольник на треугольники. Не помню уже ваш многоугольник выпуклый или нет.
---
А может найти какой-нибудь простой многоугольник, на котором видны ваши различия и "ручками" его перемерять, перечертив в автокаде и самому разбив на треугольники. Помнится мне из средней школы, что есть формула, связывающая три стороны и площадь :)

Ответить

Вернуться в «Координаты и привязка»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя