Утилита конвертации GeoJSON в MET-формат (Панорама)

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: Утилита конвертации GeoJSON в MET-формат (Панорама)

Сообщение SergeyRyzhkov » 03 апр 2015, 11:49

Дотнет, как дотнет. У меня нет претензий к нему :)
(дабы избежать флуд, сразу предупрежу я еще в 2002 году получил Sun certified java developer, так что пишу почти на всем что движется :) ), но по работе любимый C#, так уж сложилось, все заказчики на винде сидят.

Код открытого нет, нет от него никому пользы.
Тем более используется моя помойка кода
https://github.com/SergeyRyzhkov/MapExpress

Владислав, если хочешь на Java перетащить,
я с удовольствием тебе вышлю все исходники, разгребешь (я пояснить смогу что да как),
сделаешь код более внятным, сделаешь конвертер - думаю польза будет коллегам!
Спойлер
ЗЫ: По утрам делаю пулл с cadXML2GeoJSON, что-то нет коммитов от тебя ... Продолжаешь?

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: Утилита конвертации GeoJSON в MET-формат (Панорама)

Сообщение Филиппов Владислав » 03 апр 2015, 12:27

у меня возможно будет потребность в конвертации для Панорамы, один заказчик "Панорама-only". Но не сейчас, я просто прощупать насчёт исходников.
А перетащить можно будет: Java, Python, JavaScript

с cadXML2GeoJSON пока нет времени, но он не заброшен!!

Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: Утилита конвертации GeoJSON в MET-формат (Панорама)

Сообщение SergeyRyzhkov » 03 апр 2015, 12:42

Владислав,
Обращайся, как будет потребность. Все отдам, с потрохами. Там на самом деле все очень просто.
MET-формат то простой как тапок (кстати в чем его и красота в чем-то),
начинаешь объект #,
далее список атрибутов SEM code value,
далее coordinate sequence

У меня то немного запутаннее получилось, так как помимо стандартного GeoJSON
была просьба сделать возможность использовать еще и ESRI json и более того делать из невалидного валидный.
Также была задача автоматического преобразования из одной СК в другую (3857 и 4326)

Дабы не потерялось, пару основных кусков кода

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

public void ExportDirectory (bool merge, string dir, SpatialReferneceType sourceCrs, SpatialReferneceType targetCrs)
        {
            var headerTemplate = "MET" + Environment.NewLine + "BEGIN" + Environment.NewLine + "{0}";
            var src = string.Empty;
            if (targetCrs == SpatialReferneceType.SphericalMercator)
            {
                src = "WGS84";
            }
            if (targetCrs == SpatialReferneceType.WGS84)
            {
                src = "WGS84" + Environment.NewLine + "GRAD";
            }

            var mergedResult = new StringBuilder ();
            mergedResult.Append (string.Format (headerTemplate, src));

            var files = Directory.GetFiles (dir, "*.json");
            foreach (var file in files)
            {
                var body = Export (file, sourceCrs, targetCrs);
                mergedResult.Append ("// Файл источник: ").Append (file);
                mergedResult.Append (body);

                var result = new StringBuilder ();
                if (!merge)
                {
                    result.Append (string.Format (headerTemplate, src));
                    result.Append (body);
                    result.Append ("END");
                    File.WriteAllText (Path.ChangeExtension (file, "met"), result.ToString (), Encoding.GetEncoding (1251));
                }
            }
            if (merge)
            {
                mergedResult.Append ("END");
                File.WriteAllText (Path.Combine (dir,"merged.met"), mergedResult.ToString (), Encoding.GetEncoding (1251));
            }
        }

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

private string Export (string file, SpatialReferneceType sourceCrs, SpatialReferneceType targetCrs)
        {
            using (var sr = new StreamReader (file))
            {
                var text = sr.ReadToEnd ();
                return CovertFeature2Met (text, sourceCrs, targetCrs);
            }
        }

        private string CovertFeature2Met (string text, SpatialReferneceType sourceCrs, SpatialReferneceType targetCrs)
        {
            var objectDelimeter = Environment.NewLine + "#R";

            const string propTemplate = "SEM {0} {1}";
            var result = new StringBuilder ();
            var geoJsonReader = new GeoJSONGeometryReader ();

            JsonData json;
            if (!TryGetGeoJson (text, out json))
            {
                const string errorTExt = "Файл не является валидным GeoJSON";
                MessageBox.Show (errorTExt);
                return errorTExt;
            }

            var testCount = json.Keys.Contains ("features");
            var count = testCount ? json ["features"].Count : 1;

            for (var i = 0; i < count; i++)
            {
                result.Append (objectDelimeter);

                var iterProperties = testCount ? json["features"][i]["properties"] : json["properties"];
                var propSb = new StringBuilder ();
                foreach (var iterKey in iterProperties.Keys)
                {
                    var propValue = iterProperties [iterKey];
                    var key = GetCode (iterKey);
                    if (key != -100000)
                    {
                        propSb.Append (Environment.NewLine);
                        propSb.Append (string.Format (propTemplate, key, propValue));
                    }
                }
                var geometryText = testCount ? json ["features"] [i] ["geometry"].ToJson () : json ["geometry"].ToJson ();
                var iterGeometry = geoJsonReader.Read (geometryText);
                var geomText = GeometryCoordSequence (iterGeometry, sourceCrs, targetCrs);
                result.Append (propSb).Append (Environment.NewLine).Append (geomText);
            }
            return result.ToString ();
        }

Аватара пользователя
Павиан из Найроби
Новоприбывший
Сообщения: 2
Зарегистрирован: 25 май 2015, 23:23
Репутация: 0
Откуда: Казань
Контактная информация:

Re: Утилита конвертации GeoJSON в MET-формат (Панорама)

Сообщение Павиан из Найроби » 26 май 2015, 16:48

Странно, но у меня на восьмерку она не ставится. на семерке идет нормально. а при инсталляции на восьмерку пишет "несовместимое программное обеспечение" Может патч какой нужен?

Александр Фадеев
Завсегдатай
Сообщения: 438
Зарегистрирован: 14 май 2011, 11:20
Репутация: 98
Откуда: Йошкар-Ола
Контактная информация:

Re: Утилита конвертации GeoJSON в MET-формат (Панорама)

Сообщение Александр Фадеев » 21 окт 2015, 09:11

Сделал небольшой сервис по получению текста для met-файла с ПКК. Объекты точечного вида виде центров с соответствующей семантикой.
Изображение
Иногда тружусь ----> http://terraingis.ru/

Ответить

Вернуться в «Общий - ПО»

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

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