Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 8 / 5
Регистрация: 15.08.2011
Сообщений: 57
1

Экранные координаты в мировые

01.03.2017, 10:28. Просмотров 2178. Ответов 5
Метки нет (Все метки)

Ребят всем доброго времени суток, подскажите как перевести координаты курсора т.е. (X и Y) в долготу и широту мировую куда копать что почитать? Может кто то делал и поделится. Я понимаю что нужно установить начальную точку в виде долготы и широты и от нее уже считать, только как считать не могу найти полезного ресурса что б изучить данный вопрос.

Всем спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2017, 10:28
Ответы с готовыми решениями:

как получить экранные координаты пунка меню ToolStripMenuItem
Хочу получить координаты пункта меню ToolStripMenuItem, т.е. точку Point его верхнего левого угла....

Даны координаты вершин треугольника и координаты некоторой точки внутри него
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от...

Мировые координаты через экранные
Здравствуйте!Мне необходимо найти мировые координаты в пространстве с помощью точки на экране(точка...

Vb.net directx, slimdx преобразовать экранные координаты мыши в 3d координаты
vb.net directx, slimdx преобразовать экранные координаты мыши в 3d координаты необходимо...

5
Модератор
868 / 777 / 326
Регистрация: 03.02.2015
Сообщений: 5,045
Записей в блоге: 9
01.03.2017, 10:51 2
xmaksasx, Оно? https://www.cyberforum.ru/blogs/534661/
0
8 / 8 / 5
Регистрация: 15.08.2011
Сообщений: 57
01.03.2017, 11:06  [ТС] 3
Неа не оно но за ссылку спасибо большое почитаю
0
Модератор
868 / 777 / 326
Регистрация: 03.02.2015
Сообщений: 5,045
Записей в блоге: 9
01.03.2017, 11:40 4
Лучший ответ Сообщение было отмечено xmaksasx как решение

Решение

Цитата Сообщение от xmaksasx Посмотреть сообщение
Я понимаю что нужно установить начальную точку в виде долготы и широты и от нее уже считать
Но там точность УЖАСНАЯ!
А смысл прост:
Задаем точки "привязки" они включают долготу широту и относительные координаты () того куска карты который хотим привязать. И от них уже пляшем.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
public class ClassGeoTransform : IClassGeoTransform
    {
        private const double M_PI = 3.14159265358979323846;
        private const double M_PI_2 = M_PI / 2.0;
        private const double D_R = (M_PI / 180.0);
        private const double R_D = (180.0 / M_PI);
        private const double R_MAJOR = 6378137.0;
        private const double R_MINOR = 6356752.3142;
        private static double R_MAJOR_POW_2 = System.Math.Pow(R_MAJOR, 2);
        private static double R_MINOR_POW_2 = System.Math.Pow(R_MINOR, 2);
        private const double RATIO = (R_MINOR / R_MAJOR);
        private static double ECCENT = (System.Math.Sqrt(1.0 - (RATIO * RATIO)));
        private double COM = (0.5 * ECCENT);
 
        //private const double SPHERICAL_A = 6378137;
        //private const double EQUATOR_R = 6378245.0;         // Радиус по экватору
        //private const double MERIDIAN_R = 6356863.0;        // Радиус по меридиану
 
        //#define min(a, b) (a <= b ? a : b)
        //#define max(a, b) (a >= b ? a : b)
 
        // Проекция Меркатора
        public ClassPointD MercatorTransform(double longitude, double latitude)
        {
            //auto lat = min(89.5, max(latitude, -89.5));
            double lat = (89.5 <= ((latitude >= -89.5) ? latitude : -89.5)) ? 89.5 : ((latitude >= -89.5) ? latitude : -89.5);
            double phi = lat * D_R;
            double sin_phi = System.Math.Sin(phi);
            double con = ECCENT * sin_phi;
            con = System.Math.Pow((1.0 - con) / (1.0 + con), COM);
            double ts = System.Math.Tan(0.5 * (M_PI * 0.5 - phi)) / con;
            double y = 0 - R_MAJOR * System.Math.Log(ts);
            double x = R_MAJOR * longitude * D_R;
            return new ClassPointD(x, y);
        }
 
        // Преобразование коодинат из одной системы в другую с учетом поворота
        public ClassPointD VectorTransform(double csys1_ax1, double csys1_ay1, double csys1_ax2, double csys1_ay2, double csys1_bx2, double csys1_by2,
        double csys2_ax1, double csys2_ay1, double csys2_ax2, double csys2_ay2)
        {
            double ax = csys1_ax2 - csys1_ax1;
            double ay = csys1_ay2 - csys1_ay1;
            double cx = ay;
            double cy = -ax;
            double csys2_ax = csys2_ax2 - csys2_ax1;
            double csys2_ay = csys2_ay2 - csys2_ay1;
 
            // Знаки выставлены наоборот по сравнению с географическими координатами, т.к. оси OY расположена в противоположную сторону
            double csys2_cx = -csys2_ay;
            double csys2_cy = csys2_ax;
            double a_len_2 = ax * ax + ay * ay;
 
            double bx = csys1_bx2 - csys1_ax1;
            double by = csys1_by2 - csys1_ay1;
 
            double d = (ax * bx + ay * by) / a_len_2;
            double f = (cx * bx + cy * by) / a_len_2;
 
            return new ClassPointD(csys2_ax * d + csys2_cx * f + csys2_ax1, csys2_ay * d + csys2_cy * f + csys2_ay1);
        }
 
        // Обратная проекция Меркатора
        public ClassPointD RevertMercatorTransform(double x, double y)
        {
            double ts = System.Math.Exp(-y / R_MAJOR);
            double phi = M_PI_2 - 2.0 * System.Math.Atan(ts);
            double dphi = 1.0;
            for (int i = 0; System.Math.Abs(dphi) > 0.000000001 && i < 15; i++)
            {
                double con = ECCENT * System.Math.Sin(phi);
                dphi = M_PI_2 - 2 * System.Math.Atan(ts * System.Math.Pow((1.0 - con) / (1.0 + con), COM)) - phi;
                phi += dphi;
            }
 
            double latitude = phi * R_D;
            double longitude = x * R_D / R_MAJOR;
 
            return new ClassPointD(longitude, latitude);
        }
 
        // Пресчёт гео в относительные 
        public ClassPointD GeoToRelative(double geo_coords_x, double geo_coords_y, anhorsPoins anh_points)
        {
            if (anh_points._Anchor_Longitude_1 == 0.0 || anh_points._Anchor_Latitude_1 == 0.0 || anh_points._Anchor_Longitude_2 == 0.0 || anh_points._Anchor_Latitude_2 == 0.0)
                return new ClassPointD(0.0, 0.0);
 
            if (anh_points._Anchor_X_1 == 0.0 || anh_points._Anchor_Y_1 == 0.0 || anh_points._Anchor_X_2 == 0.0 || anh_points._Anchor_Y_2 == 0.0)
                return new ClassPointD(0.0, 0.0);
 
            ClassPointD a1 = MercatorTransform(anh_points._Anchor_Longitude_1, anh_points._Anchor_Latitude_1);
            ClassPointD a2 = MercatorTransform(anh_points._Anchor_Longitude_2, anh_points._Anchor_Latitude_2);
            ClassPointD b2 = MercatorTransform(geo_coords_x, geo_coords_y);
 
            ClassPointD res = VectorTransform(a1._X, a1._Y, a2._X, a2._Y, b2._X, b2._Y,
                                              anh_points._Anchor_X_1, anh_points._Anchor_Y_1,
                                              anh_points._Anchor_X_2, anh_points._Anchor_Y_2);
            return res;
        }
 
        // Растояние между двумя точками
        public static ClassPointD GetDistanceBetweenTwoPoint(double longitude1, double latitude1, double longitude2, double latitude2)
        {
            if (longitude1 == 0.0 || latitude1 == 0.0 || longitude2 == 0.0 || latitude2 == 0.0)
                return null;
 
            //Вычисляем угол с учетом радиусов элипсоида
            double angle_1 = System.Math.Atan((R_MINOR_POW_2 / R_MAJOR_POW_2) * System.Math.Tan(M_PI / 180 * latitude1));
            double angle_2 = System.Math.Atan((R_MINOR_POW_2 / R_MAJOR_POW_2) * System.Math.Tan(M_PI / 180 * latitude2));
 
            //radius of small circle (radius between meridians) 
            double point_radius1 = (1 / System.Math.Sqrt((System.Math.Pow(System.Math.Cos(angle_1), 2) / R_MAJOR_POW_2) + (System.Math.Pow(System.Math.Sin(angle_1), 2) / R_MINOR_POW_2))); //+ высота точки; 
            double point_radius2 = (1 / System.Math.Sqrt((System.Math.Pow(System.Math.Cos(angle_2), 2) / R_MAJOR_POW_2) + (System.Math.Pow(System.Math.Sin(angle_2), 2) / R_MINOR_POW_2))); //+ высота точки; 
 
            double earth_point_1_x = point_radius1 * System.Math.Cos(angle_1);
            double earth_point_1_y = point_radius1 * System.Math.Sin(angle_1);
 
            double earth_point_2_x = point_radius2 * System.Math.Cos(angle_2);
            double earth_point_2_y = point_radius2 * System.Math.Sin(angle_2);
 
            double x = System.Math.Sqrt(System.Math.Pow((earth_point_1_x - earth_point_2_x), 2) + System.Math.Pow((earth_point_1_y - earth_point_2_y), 2));
            double y = M_PI * ((earth_point_1_x + earth_point_2_x) / 360) * (longitude1 - longitude2);
 
            return new ClassPointD(x, y);
        }
 
        // Относительные координаты в гео
        public ClassPointD RelativeToGeo(anhorsPoins anh_points, double X_rel, double Y_rel)
        {
            ClassPointD a1 = MercatorTransform(anh_points._Anchor_Longitude_1, anh_points._Anchor_Latitude_1);
            ClassPointD a2 = MercatorTransform(anh_points._Anchor_Longitude_2, anh_points._Anchor_Latitude_2);
            ClassPointD metric_coords = VectorTransform(anh_points._Anchor_X_1, anh_points._Anchor_Y_1,
                                                anh_points._Anchor_X_2, anh_points._Anchor_Y_2,
                                                X_rel, Y_rel, a1._X, a1._Y, a2._X, a2._Y);
            ClassPointD res = RevertMercatorTransform(metric_coords._X, metric_coords._Y);
 
            return new ClassPointD(res._X, res._Y);
        }
 
        // Угол между точками
        public int GetAngelTwoPoint(double longitude1, double latitude1, double longitude2, double latitude2)
        {            
            // Результат
            int angel_res = 0;
            bool chetvertUP;
            bool chetvertRIGHT;
            
            // Точки
            ClassPointD p_1 = new ClassPointD(longitude1, latitude1);   // точка старта
            ClassPointD p_2 = new ClassPointD(longitude2, latitude2);   // текущая точка
            ClassPointD range = ClassGeoTransform.GetDistanceBetweenTwoPoint(p_1._X, p_1._Y, p_2._X, p_2._Y);
 
            // Длины сторон треугольника
            double distance = (Math.Sqrt(Math.Pow(range._X, 2) + Math.Pow(range._Y, 2)));
            double distanceX = range._X;
            double distanceY = range._Y;
 
            // Найдём углы треугольник
            const int angel_distanceX_distanceY_GRAD = 90;
            int angel_distance_distanceX_GRAD = (int)((double)angel_distanceX_distanceY_GRAD * distanceX / distance);
            int angel_distance_distanceY_GRAD = 180 - angel_distanceX_distanceY_GRAD - angel_distance_distanceX_GRAD;
 
            // Определим в какой мы четверти
            if ((p_1._Y - p_2._Y) <= 0)
               chetvertUP = true;
            else
               chetvertUP = false;
 
            if ((p_1._X - p_2._X) <= 0)
                chetvertRIGHT = true;
            else
                chetvertRIGHT = false;
 
            //
            if (chetvertUP && chetvertRIGHT)
                angel_res = angel_distance_distanceX_GRAD + angel_distanceX_distanceY_GRAD;
            else if (!chetvertUP && chetvertRIGHT)
                angel_res = angel_distance_distanceY_GRAD;
            else if (!chetvertUP && !chetvertRIGHT)
                angel_res = 270 + angel_distance_distanceX_GRAD;
            else if (chetvertUP && !chetvertRIGHT)
                angel_res = 180 + angel_distance_distanceY_GRAD;
 
            return angel_res;
        }
 
        // Расчет удаления от точки старта
        public int GetRangeTwoPoint(double longitude1, double latitude1, double longitude2, double latitude2)
        {
            int distance;
 
            ClassPointD p_1 = new ClassPointD(longitude1, latitude1);
            ClassPointD p_2 = new ClassPointD(longitude2, latitude2);
 
            ClassPointD range = ClassGeoTransform.GetDistanceBetweenTwoPoint(p_1._X, p_1._Y, p_2._X, p_2._Y);
 
            if (range != null)
                distance = (int)(Math.Sqrt(Math.Pow(range._X, 2) + Math.Pow(range._Y, 2)));
            else
                distance = 0;
 
            return distance;
        }        
    }
 
 
 public class ClassPointD
    {
        public double _X;
        public double _Y;
 
        public ClassPointD()
        {
            _X = 0;
            _Y = 0;
        }
 
        public ClassPointD(double x, double y)
        {
            _X = x;
            _Y = y;
        }
    }
1
8 / 8 / 5
Регистрация: 15.08.2011
Сообщений: 57
01.03.2017, 11:42  [ТС] 5
Спасибо большое, а есть ссылка на какой нить ресурс что б почитать?
0
Модератор
868 / 777 / 326
Регистрация: 03.02.2015
Сообщений: 5,045
Записей в блоге: 9
01.03.2017, 11:51 6
Цитата Сообщение от xmaksasx Посмотреть сообщение
Спасибо большое, а есть ссылка на какой нить ресурс что б почитать?
Неа сам днями сидел искал. Толкового ничего не находил.
Самое нормальное что попадалось - https://msdn.microsoft.com/en-us/library/bb259689.aspx
И еще какой то сайт про магнитные склонения и наклонения не помню уже(.

Добавлено через 4 минуты
xmaksasx, К стати в коде, что привел, использовал относительные координаты (координата x / ширину "куска" карты, координата y / высоту "куска" карты). И того работаем с pABS (x, y) и pREL(x / w, y / h).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2017, 11:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Мировые координаты и координаты устройства
Пишу программу с интерфейсом напоминающем Autocad. А точнее ту часть в которой происходит черчение....

Оконные и мировые координаты
Вот заметил, что у многих людей, которые делают проекты на OpenGL, и у меня, когда делается вид от...

Перевод в мировые координаты
Проблема такая: у меня есть координаты мыши: mousePos , есть матрица view - view, есть матрица...

Как получить мировые координаты
Всем привет знаю что подобных тем куча но я никак не могу разобраться у меня есть сетка. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.