SASGIS - SAS.Планета  | 
| View Issue Details | 
  | 
| ID | Project | Category | View Status | Date Submitted | Last Update | 
| 0002932 | SAS.Планета | Рефакторинг / Refactoring | public | 20-12-2015 14:26 | 09-09-2023 18:37 | 
  | 
| Reporter | zed |   | 
| Assigned To |  |   | 
| Priority | normal | Severity | minor | Reproducibility | have not tried | 
| Status | new | Resolution | open |   | 
| Platform |  | OS |  | OS Version |  | 
| Product Version | 151111 |   | 
| Target Version |  | Fixed in Version |  |   | 
  | 
| Summary | 0002932: Сделать универсальную поддержку различных систем координат | 
| Description | Немного поразмыслив над тем, как сделана поддержка СК-42, пришёл к мысли, что можно сделать лучше и универсальнее. 
 
1. Сделать базовый интерфейс "система координат" (ICoordSystem), с параметрами: 
- id данной СК 
- отображаемое имя 
 
2. Сделать интерфейс "геодезическая СК" IGeodeticCoordSystem = interface(ICoordSystem) с методами: 
- конвертирование lonlat в/из wgs84 
- парсинг/сереализация lonlat в строку 
 
3. Сделать интерфейс "прямоугольная СК" IProjectedCoordSystem = interface(ICoordSystem) с методами: 
- конвертирование XY в lonlat (wgs84) и обратно  
- парсинг/сереализация XY в строку 
Так же, тут надо держать ссылку на геодезическую СК (IGeodeticCoordSystem) с которой работает данная СК. 
 
Таким образом, можно будет создать список СК и даже подгружать СК динамически из ini, так же, в конвертере координат CoordToStringConverter и парсере CoordFromStringParser полностью абстрагироваться от СК и лишь вызывать нужные методы у интерфейса активной СК. 
 | 
| Steps To Reproduce |  | 
| Additional Information |  | 
| Tags | No tags attached. | 
| Relationships | | related to  | 0000376 | resolved  | zed  | Отображение координат в СК42  |  | related to  | 0002576 | resolved  | zed  | Add support for MGRS coordinates  |  | related to  | 0003871 | resolved  | zed  | Система координат ГСК-2011  |  | has duplicate  | 0003257 | closed  | zed  | Import custom prj coordinate system  |  | related to  | 0003766 | closed  | zed  | Координаты в таблице. Работа с местными системами координат.  |  | related to  | 0003856 | resolved  | zed  | Добавить отображение и ввод UTM координат  |  
  | 
| Attached Files |  | 
  | 
| Issue History | 
| Date Modified | Username | Field | Change | 
| 20-12-2015 14:26 | zed | New Issue |  | 
| 20-12-2015 14:26 | zed | Relationship added | related to 0000376 | 
| 20-12-2015 14:28 | zed | Relationship added | related to 0002576 | 
| 20-12-2015 19:39 | vdemidov | Note Added: 0016951 |  | 
| 20-12-2015 20:43 | zed | Note Added: 0016955 |  | 
| 20-12-2015 21:05 | vdemidov | Note Added: 0016956 |  | 
| 20-12-2015 21:21 | zed | Note Added: 0016958 |  | 
| 20-12-2015 22:13 | vdemidov | Note Added: 0016959 |  | 
| 22-12-2015 14:39 | zed | Note Added: 0016961 |  | 
| 22-12-2015 21:22 | vdemidov | Note Added: 0016962 |  | 
| 11-07-2017 14:12 | zed | Relationship added | related to 0003257 | 
| 11-07-2017 16:35 | zed | Relationship replaced | has duplicate 0003257 | 
| 18-06-2021 07:35 | zed | Relationship added | related to 0003766 | 
| 04-07-2023 10:20 | zed | Relationship added | related to 0003856 | 
| 09-09-2023 18:37 | zed | Relationship added | related to 0003871 | 
| 08-08-2025 13:25 | zed | Category | Рефакторинг => Рефакторинг / Refactoring | 
	| 
		Notes	 | 
	
		 
	 | 
	| 
		
	 | 
	
		
		
			| 
				То что ты назваешь IGeodeticCoordSystem уже есть и называется датум - интерфейс IDatum. Когда нибудь будут и не совместимые напрямую c WGS84.			 | 
		 
		 
	 | 
	
		 
	 | 
	
		
		
			| 
				(0016955)
			 | 
		 
		
			| 
				zed   
			 | 
		 
		
			| 
				20-12-2015 20:43   
							 | 
		 
		 
	 | 
	
		
		
			| 
				У предлагаемого интерфейса будет несколько иная задача. При создании объекта, он будет инициализироваться строкой для proj4 и при помощи этой либы будет выполнять необходимые преобразования координат.			 | 
		 
		 
	 | 
	
		 
	 | 
	| 
		
	 | 
	
		
		
			
				Ну, я думал ты это с самого начала так сделаешь, вместо огорода с отдельными функциями geodetic_wgs84_to_sk42 и тд. Но донести в комментариях к тому коммиту не сумел. А вообще я только за, но рассчитывай, что бы экземпляры IGeodeticCoordSystem могли использоваться как IDatum. Я сейчас пилю IConverteProjectionToProjection. Пока он будет делать для одинаковых типов проекций пересчет через Relative координаты, для разных - через LonLat, а в перспективе для разных датумов еще добьавится пересчет самих координат.  
 
Просто сейчас все эти операции пересчета координат расскиданы по куче мест и добавлять туда еще пересчет координат между разными датумами это проще застрелиться. А так оно будет более-менее локализовано в нескольких реализациях этого интерфейса.			 | 
		 
		 
	 | 
	
		 
	 | 
	
		
		
			| 
				(0016958)
			 | 
		 
		
			| 
				zed   
			 | 
		 
		
			| 
				20-12-2015 21:21   
							 | 
		 
		 
	 | 
	
		
		
			| 
				Что-то я не понимаю что и зачем надо учитывать. Ты хочешь в СК-42 или какие там еще появятся, площадь и прочие расстояния считать?			 | 
		 
		 
	 | 
	
		 
	 | 
	| 
		
	 | 
	
		
		
			
				Ну в общем то да. Хотя оно все равно в отдельный код выделено.  
 
Просто есть отдельные сущности: Система координат/Датум (Совокупность геоида и начала системы координат. Возможно стоит выделить понятие геоида в отдельную сущность), Тип проекции (Задает как пересчитывать геодезические координаты в некоторые условные прямоугольные координаты - в сас я их в свое время обозвал Relative и изменяются они от 0 до 1, в геодезии приняты метры, но сути это не меняет), Проекция (задает как из условных прямогуольных координат получить координаты в пикселах), Проекция с нарезкой на тайлы (Одну и ту же проекцию можно по разному на резать на тайлы. Самый простой вариант тайлы размером 128, 256, 512 и тд пикселов). 
Эти сущности представлены в программе в той или иной мере и ИМХО не стоит их дублировать без лишней необходимости.			 | 
		 
		 
	 | 
	
		 
	 | 
	
		
		
			| 
				(0016961)
			 | 
		 
		
			| 
				zed   
			 | 
		 
		
			| 
				22-12-2015 14:39   
							 | 
		 
		 
	 | 
	
		
	 | 
	
		 
	 | 
	| 
		
	 | 
	
		
		
			| 
				Именно в таком виде точно переносить не нужно. Как минимум заменить отдельные даблы на TDoublePoint. Еще желательно разделить саму вычислялку и ее метаданные, что бы можно было описания к ним сделать локализируемыми на другие языки.			 | 
		 
		 
	 |