проекция многоугольника по ГОСТ 51794

Тема в разделе "Другие программы", создана пользователем ilovegeodesy, .

ГЕОДЕЗИСТ.RU
  1. #21
    Сильно:
    Код:
    {6212326.274570419,7543535.62790688},
    {6181860.299589701,7554524.910116848},
    {6170822.904022064,7548417.116165986},
    {6166457.151118587,7521673.970982113},
    {6166409.651748076,7492634.767155303},
    {6182196.549988738,6483555.32433239},
    {6218178.811830429,6445931.059716251},
    {6234628.029316824,6464366.708307678},
    {6250118.487136461,6473746.1853555245},
    {6212326.274570419,7543535.62790688}
    
    Код:
    function POWER(x, y) {return Math.pow(x, y);}
    function RADIANS(x) {return x*Math.PI/180;}
    function sin(x) {return Math.sin(x);}
    function cos(x) {return Math.cos(x);}
    function FLOOR(x) {return Math.floor(x);}
     
    function getProjections(geoCoords) {
    	var projections = [], 
    		maxL = 0, 
    		minL = 180, 
    		B, L, Lc, i;
    	for (i in geoCoords) {
    		L = geoCoords[1];
    		maxL = L > maxL ? L : maxL;
    		minL = L < minL ? L : minL;
    	}
    	Lc = minL + (maxL-minL)/2;
    	for (i in geoCoords) {
    		B = geoCoords[0];
    		L = geoCoords[1];
    		projections.push(getProjection(B, L, Lc));
    	}
    	return projections;
    }
     
    function getProjection(latitude, longitude, Lc) {
    	var result = [],
    		n = FLOOR((6+longitude)/6),
    		l = RADIANS(longitude - Lc),
    		l2 = POWER(l, 2),
    		radLat = RADIANS(latitude),
    		sin2 = POWER(sin(radLat), 2),
    		sin4 = sin2*sin2,
    		sin6 = sin2*sin4;
    	result.push((6367558.4968*radLat - sin(2*radLat)*(16002.89 + 66.9607*sin2 + 0.3515*sin4 -
    				l2*(1594561.25 + 5336.535*sin2 + 26.790*sin4 + 0.149*sin6 + l2*(672483.4 -
    				811219.9*sin2 + 5420.0*sin4 - 10.6*sin6 + l2*(278194.0 - 830174.0*sin2 +
    				572434.0*sin4 - 16010.0*sin6 + l2*(109500.0 - 574700.0*sin2 + 863700.0*sin4 -
    				398600.0*sin6)))))) );
    	result.push(((5.0 + 10.0*n)*100000.0 + l*cos(radLat)*(6378245.0 + 21346.1415 * sin2 + 107.159*sin4 +
    		 0.5977*sin6 + l2*(1070204.16 - 2136826.66*sin2 + 17.98*sin4 - 11.99*sin6 +
    		 l2*(270806.0 - 1523417.0*sin2 + 1327645.0*sin4 - 21701.0*sin6 + l2*(79690.0 -
    		 866190.0*sin2 + 1730360.0*sin4 - 945460.0*sin6))))) );
    	return result;
    }
     
    function getArea(coords) {
    	var result = 0;
    	
    	for (var i = 0; i < coords.length-1; i++)
    		result += coords[0]*coords[i+1][1]-coords[1]*coords[i+1][0];
    		
    	return Math.abs(result)/2000000;
    }
    
     
  2. trir

    trir Форумчанин

  3. #23
    Спасибо, но это слишком тяжеловесное решение.
     
  4. stout

    stout Форумчанин

    #24
    А это-то зачем?
    Считал для Lc = 36.18724822995°
     
    ilovegeodesy нравится это.
  5. #25
    А, это и есть номер зоны. Убрал и получилось 5215.4. Погрешность больше 200 км2.
     
  6. trir

    trir Форумчанин

    #26
    номер зоны то зачем??
    Если считаем площадь, то все точки надо определять в одной зоне! (есть специальные 3-х градусные!)
     
  7. #27
  8. trir

    trir Форумчанин

    #28
    Что за сервер?
    ST_Area
     
  9. #29
    Здорово! Жаль, что в используемой мной СУБД (Sybase ASA 11.01) нет встроенных функций для работы с геообъектами.
     
  10. trir

    trir Форумчанин

    #30
  11. #31
    trir нравится это.
  12. trir

    trir Форумчанин

  13. #33
    Вопрос решен, считаю по ГОСТу с l = L - (Lmin + (Lmax-Lmin)/2).
    Спасибо всем за помощь!
     
  14. stout

    stout Форумчанин

    #34
    Вообще-то это только один из возможных способов выбора долготы осевого меридиана. Основная идея заключается в том, чтобы большая часть фигуры была как можно ближе к осевому меридиану.
    Если фигура симметричная относительно какого-либо меридиана, то можно и так считать.
    Далее можно слегка уточнить площадь, введя масштаб на осевом меридиане меньший единицы, так как это делается в проекции Transverse Mercator.
     
  15. #35
    точность хромает, но оставлю пока так. Ваш код с комплексными числами и гиперболическими тригонометрическими функциями я не стал пытаться реализовывать в SQL. Если потребуется более высокая точность, буду дальше двигаться. Спасибо за помощь!
     
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление