Страница 1 из 1

Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 11:14
SergeyRyzhkov
Коллеги, я проф. программер. Работаю в основном в ГИС-проектах.
За время работы (более 15 лет) накопилось множество библиотек на C# для пересчета координат, работы с тайлами и т.д. Право на использование данных библиотек МОЕ, так как выполнял разработку для личных нужд и в свободное время (помогал детям товарищей с курсовиками, дипломными, коллегам из других компаний помогал и т.д.)
Ниже небольшой список того что есть.

Можно сделать Народный калькулятор (БЕСПЛАТНЫЙ для всех!) или онлайн-сервис по пересчету и т.д.
Соответственно, если есть предложение, как использовать данное наследие, пишите

admin@ryzhkov-sn.ru

Итак есть разрозненные классы для:
- описания системы координат
- выполнения конвертации геоцентрической СК в географическую
- выполнения трансформации (просто перечислю класс, кто разбирается поймет)
- CoordinateFrameTransformation.cs
- GeocentricTranslation.cs
- GeographicOffsetsTransformation.cs
- MolodenskyAbridgedTransformation.cs
- MolodenskyBadekasTransformation.cs
- MolodenskyTransformation.cs
- PositionVectorTransformation.cs
- выполнения проецирования
- GaussKrugerProjection.cs
- Mercator1SpProjection.cs
- Mercator2SpProjection.cs
- MercatorVariantCProjection.cs
- PseudoMercatorProjection.cs
- SphericalMercatorProjection.cs
- TransverseMercatorProjection.cs
- UniversalTransverseMercatorProjection.cs
- TransverseMercatorZonedGridSystemProjection.cs
- TransverseMercatorZoneLocator.cs

Все реализовано согласно EPSG. Никаких псевдо-формул.Если матрицы, так значит матрицы.

Пример кода Position Vector Transformation:

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

using System;
using nRsn.Core.Utils;
using nRsn.Map.CoordinateSystem.Elements;

namespace nRsn.Map.CoordinateSystem.Transformations
{
public class PositionVectorTransformation : IGeocentricTransformation
{

public virtual CartesianPoint Transform (CartesianPoint sourcePoint, TransformationParameter parameter)
{
double m = (1 + parameter.Ds * (Math.Pow (10, -6)));

var sourceMatrix = InitSourceCoordMatrix (sourcePoint);
var translationVectorMatrix = InitTranslationVectorMatrix (parameter);
var rotationMatrix = InitRotationMatrix (parameter);
var frameRotationMatrix = InitFrameRotationMatrix (parameter);

var resultMatrix = m * rotationMatrix * sourceMatrix + frameRotationMatrix + translationVectorMatrix;

return new CartesianPoint (resultMatrix [0, 0], resultMatrix [1, 0], resultMatrix [2, 0]);
}


protected virtual Matrix InitSourceCoordMatrix (CartesianPoint sourcePoint)
{
var matrix = new Matrix (3);
matrix [0, 0] = sourcePoint.X;
matrix [1, 0] = sourcePoint.Y;
matrix [2, 0] = sourcePoint.Z;
return matrix;
}

protected virtual Matrix InitTranslationVectorMatrix (TransformationParameter parameter)
{
var matrix = new Matrix (3);
matrix [0, 0] = parameter.Dx;
matrix [1, 0] = parameter.Dy;
matrix [2, 0] = parameter.Dz;

return matrix;
}

protected virtual Matrix InitRotationMatrix (TransformationParameter parameter)
{
double rZRad = parameter.Rz / 3600 * (Math.PI / 180.0);
var matrix = new Matrix (3, 3);
matrix [0, 0] = 1;
matrix [0, 1] = -rZRad;
matrix [0, 2] = parameter.Ry;
matrix [1, 0] = rZRad;
matrix [1, 1] = 1;
matrix [1, 2] = -parameter.Rx;
matrix [2, 0] = -parameter.Ry;
matrix [2, 1] = parameter.Rx;
matrix [2, 2] = 1;
return matrix;
}

protected virtual Matrix InitFrameRotationMatrix (TransformationParameter parameter)
{
var matrix = new Matrix (3);
matrix [0, 0] = parameter.Px;
matrix [1, 0] = parameter.Py;
matrix [2, 0] = parameter.Pz;
return matrix;
}
}
}

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 11:18
trir
А чем принципиально отличие от DotSpatial?

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 11:46
SergeyRyzhkov
trir писал(а):А чем принципиально отличие от DotSpatial?
Чисто по математике, на выходе почти ничем (немного в некоторых местах криво у них математика реализована, ну это мелочи). Также все-таки дотспешл - это более емко :). У меня все по полочкам, все отдельно.
Естественно я не первый :) , я знаю десяток API и на шарпе, жаве, питоне и т.д.

Я просто показал что есть. Так как периодически даю задания практикантам или на собеседования, то можно исходя из потребностей сообщества с использованием уже реализованных классов сделать что-то нужное и БЕСПЛАТНО!

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 12:00
trir
есть уже всё - пример

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 12:32
SergeyRyzhkov
trir писал(а):есть уже всё - пример
Таких десяток можно накидать, например, http://www.apsalin.com/online.aspx

Я про другое, что есть набор базовых классов, которые можно использовать для своих нужд легально.
Пример, одной компании (за Байкалом) в ходе своей деятельности необходимо было лицензировать и аттестовать сове ПО, в том числе и по пересчету координат. Они изначально использовали proj4, но чинуши завернули (ну зачем понятно :) )
Так вот я им дал свои классы и они спокойно прошли аттестацию, так как используемый код был открытым и легальным, а более того они четко делали преобразования и трансформация по ГОСТ (ГЦСК-ГЦСК-ГСК-Проекция). И каждое преобразование (и трансформация) также именно описанным в ГОСТ методом.

Вот я и хотел поделиться чем есть. Ладно тему можно закрыть ...

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 13:10
KolesovDmitry
Просто не очень понятна суть вопроса.

Если я не ошибаюсь, вы хотите открыть ваш исходный код и дать его в общее пользование? Тогда не понятно, почему не пойти стандартным путем -- прописать коду лицензию и выложить его в общедоступный репозиторий (github, bitbucket, ...). Или речь идет не об этом?

Re: Свободное GEOAPI для пересчета координат

Добавлено: 03 июл 2014, 13:34
SergeyRyzhkov
KolesovDmitry писал(а):Просто не очень понятна суть вопроса.
Если я не ошибаюсь, вы хотите открыть ваш исходный код и дать его в общее пользование? Тогда не понятно, почему не пойти стандартным путем -- прописать коду лицензию и выложить его в общедоступный репозиторий (github, bitbucket, ...). Или речь идет не об этом?
Коллеги, прошу прощения, я не до конца выразил свою мысль (ну не всем дано :) )
Прошу прощения!

Выложить то не проблема куда угодно. Но у меня все в "разобранном" виде, нет единого API, поэтому выкладывать в таком виде не буду.
Итак, постараюсь свою мысль все-таки оформить:
1. Есть реализация всех прописанных в EPSG операции (трансформация,конвертация)
2. Есть наброски по реализации базовой модели GeoAPI
3. Отдельно есть классы для работы с тайлами (доступ, преобразование координат, многоуровневое кэширование и т.д.)
4. Все в виде отдельных классов в разных сборках.
5. Мотивации все собирать в одно место и типизировать, то есть реализовать полноценное API у меня нет. Задачи у меня по работе другие.
6. Поэтому и спросил:
а ) если есть потребность в реализации каких-либо небольших программ связанных с вышеуказанным функционалом - мне это станет интересно :) и можно поработать
б) если есть интерес с точки зрения программирования и поработать вместе, я готов всем поделиться и поработать вместе
Результатом а) и б) станет общедоступное API которое уже не стыдно будет показать.

Как пример по а) что меня уже попросили сделать (и сделаю).
- сделать возможность работы с тайлами из MapInfo, используя стандартный механизм, но используя свой источник тайлов и чтобы работа осуществлялась локально на ПК
- реализовать GUI-приложения что-то вроде регистра систем координат со встроенным мини-калькулятором. То есть чтобы в одном приложении были собраны все описания СК (из фалов prj и т.д.) с возможности производить экспорт в различные форматы, производить пакетное преобразование координат и т.д.
- реализовать на MapExtreme возможность в WEB-приложении отображать тайлы из своего хранилища и со своей СК
- реализовать на ArcGIS Runtime возможность в WPF-приложении отображать тайлы из своего хранилища и со своей СК

То есть применений масса. Но у меня есть работа, есть хобби и несколько opensource-проектов, которые надо закончить.

Вот и попробовал поинтересоваться, что было бы интересно и нужным.