Владислав,
Обращайся, как будет потребность. Все отдам, с потрохами. Там на самом деле все очень просто.
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 ();
}