//======== // Запись результата в GEOJSON //======== private static void OSM_WriteResultToFilesGeojson() { string geojsonFeatureBegin = Environment.NewLine + "{" + Environment.NewLine + "\"type\":\"Feature\"," + Environment.NewLine + "\"geometry\":"; string geojsonFeatureEnd = Environment.NewLine + "},"; string geojsonPointBegin = "{\"type\":\"Point\",\"coordinates\":"; string geojsonPointEnd = "},"; //string geojsonPolygonBegin = "{\"type\":\"Polygon\",\"coordinates\":[["; //string geojsonPolygonEnd = "]]}"; string geojsonLineBegin = "{\"type\":\"LineString\",\"coordinates\":["; string geojsonLineEnd = "]}"; string geojsonPropBegin = Environment.NewLine + "\"properties\":{"; string geojsonPropEnd = "}"; StringBuilder sbGeojson = new StringBuilder(); int cntToFile = 0; // WAY Attrs (Points) // foreach (WayAttrItem wayAttrItem in wayAttrList) { WayToNodeItem wayToNodeItem = wayToNodeList.Find(x => x.WayId == wayAttrItem.WayId); if (wayToNodeItem == null) { OSM_WriteLog(fileLog, String.Format("WARNING: wayToNodeItem == null (wayAttrItem.WayId == {0})", wayAttrItem.WayId)); } else if (wayAttrItem.Name != "No name") { sbGeojson.Append(geojsonFeatureBegin) .Append(geojsonPointBegin) .Append(String.Format("[{0},{1}]", wayToNodeItem.Lon, wayToNodeItem.Lat)) .Append(geojsonPointEnd) .Append(geojsonPropBegin) .Append(String.Format("\"{0}\":\"{1}\",", "Type", wayAttrItem.Type)) .Append(String.Format("\"{0}\":\"{1}\"", "Addr", wayAttrItem.Name)) //.Append(String.Format("\"{0}\":\"{1}\",", "Name(en)", wayAttrItem.NameEn)) //.Append(String.Format("\"{0}\":\"{1}\"", "Name(ru)", wayAttrItem.NameRu)) .Append(geojsonPropEnd) .Append(geojsonFeatureEnd); cntToFile++; } // записать буфер в файл // if (cntToFile == sizeFileBuffer) { OSM_WriteFile(fileOutWayGeoJsonBuildings, sbGeojson.ToString()); sbGeojson.Clear(); cntToFile = 0; } } // записать буфер в файл // if (cntToFile > 0) { OSM_WriteFile(fileOutWayGeoJsonBuildings, sbGeojson.ToString()); sbGeojson.Clear(); cntToFile = 0; } // WAY (Polygon) // long prevId = 0; foreach (WayToNodeItem wayToNodeItem in wayToNodeList) { if (prevId == 0) { sbGeojson.Append(geojsonFeatureBegin) .Append(geojsonLineBegin); //Append(geojsonPolygonBegin); } else if (prevId == wayToNodeItem.WayId) { sbGeojson.Append(","); } else { sbGeojson.Append(geojsonLineEnd) //Append(geojsonPolygonEnd) .Append(geojsonFeatureEnd) .Append(geojsonFeatureBegin) .Append(geojsonLineBegin); //.Append(geojsonPolygonBegin); } sbGeojson.Append(String.Format("[{0},{1}]", wayToNodeItem.Lon, wayToNodeItem.Lat)); prevId = wayToNodeItem.WayId; // записать буфер в файл // cntToFile++; if (cntToFile == sizeFileBuffer) { OSM_WriteFile(fileOutWayGeoJsonBuildings, sbGeojson.ToString()); sbGeojson.Clear(); cntToFile = 0; } } // записать буфер в файл // if (cntToFile > 0) { OSM_WriteFile(fileOutWayGeoJsonBuildings, sbGeojson.ToString()); sbGeojson.Clear(); } // закрыть последний элемент POLYGON в GEOJSON и записать буфер в файл // if (prevId != 0) { sbGeojson.Append(geojsonLineEnd) // sbGeojson.Append(geojsonPolygonEnd) .Append(geojsonFeatureEnd); OSM_WriteFile(fileOutWayGeoJsonBuildings, sbGeojson.ToString()); } }
//======== // Обработать WAY //======== private static void OSM_ProcessWay(string xmlWay) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlWay); long wayId = Int64.Parse(xmlDoc.DocumentElement.Attributes["id"].Value); // ["id"] = [0] // Статистика // cntWayTotal++; if (cntWayTotal % sizeLogPeriod == 0) OSM_WriteLog(fileLog, String.Format("Processed Ways: {0}", cntWayTotal)); if (wayId < minWay) minWay = wayId; else if (wayId > maxWay) maxWay = wayId; // не обрабатывать дубликаты (все встреченные) // //if (useIndexedCheck) //{ // if (OSM_WayIdxAdd(wayId) > 1) // дубликаты не обрабатывать // return; //} foreach (XmlNode wayTag in xmlDoc.DocumentElement.ChildNodes) { if (wayTag.Name == "tag" && wayTag.Attributes["k"].Value == "natural" && wayTag.Attributes["v"].Value == "desert") // ["k"] = [0], ["v"] = [1] { // не обрабатывать дубликаты (только для поисковых значений) // if (useIndexedCheck) { if(OSM_WayIdxAdd(wayId) > 1) return; } // добавить WAY // if (!wayToNodeList.Exists(x => x.WayId == wayId)) { bool isAttrs = false; WayAttrItem wayAttrItem = new WayAttrItem(); wayAttrItem.WayId = wayId; wayAttrItem.Type = wayTag.Attributes["v"].Value; // ["v"] = [1] wayAttrItem.Name = "No name"; wayAttrItem.NameEn = wayAttrItem.Name; wayAttrItem.NameRu = wayAttrItem.Name; wayAttrItem.Attrs = "\"Attrs\":\"No\""; foreach (XmlNode wayNd in xmlDoc.DocumentElement.ChildNodes) { if (wayNd.Name == "nd") { long nodeId = Int64.Parse(wayNd.Attributes["ref"].Value); // ["ref"] = [0] if (useIndexedCheck) OSM_NodeIdxSet(nodeId); WayToNodeItem wayToNodeItem = new WayToNodeItem(); wayToNodeItem.WayId = wayId; wayToNodeItem.NodeId = nodeId; wayToNodeList.Add(wayToNodeItem); } else if (wayNd.Name == "tag") // собрать все аттрибуты WAY { if (isAttrs) wayAttrItem.Attrs += ","; else wayAttrItem.Attrs = String.Empty; isAttrs = true; wayAttrItem.Attrs += String.Format("\"{0}\":\"{1}\"", wayNd.Attributes["k"].Value, wayNd.Attributes["v"].Value.Replace('\"', '\'')); if (wayNd.Attributes["k"].Value == "name") wayAttrItem.Name = wayNd.Attributes["v"].Value.Replace('\"', '\''); else if (wayNd.Attributes["k"].Value == "name:en") wayAttrItem.NameEn = wayNd.Attributes["v"].Value.Replace('\"', '\''); else if (wayNd.Attributes["k"].Value == "name:ru") wayAttrItem.NameRu = wayNd.Attributes["v"].Value.Replace('\"', '\''); } } if (isAttrs) wayAttrList.Add(wayAttrItem); cntWayNpark++; } } } }
//======== // Обработать WAY //======== private static void OSM_ProcessWay(string xmlWay) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlWay); long wayId = Int64.Parse(xmlDoc.DocumentElement.Attributes["id"].Value); // ["id"] = [0] // Статистика // cntWayTotal++; if (cntWayTotal % sizeLogPeriod == 0) { OSM_WriteLog(fileLog, String.Format("Processed Ways: {0}", cntWayTotal)); } if (wayId < minWay) { minWay = wayId; } else if (wayId > maxWay) { maxWay = wayId; } // не обрабатывать дубликаты (все встреченные) // //if (useIndexedCheck) //{ // if (OSM_WayIdxAdd(wayId) > 1) // дубликаты не обрабатывать // return; //} foreach (XmlNode wayTag in xmlDoc.DocumentElement.ChildNodes) { if (wayTag.Name == "tag" && wayTag.Attributes["k"].Value == "building" && wayTag.Attributes["v"].Value == "house") // ["k"] = [0], ["v"] = [1] { { // не обрабатывать дубликаты (только для поисковых значений) // if (useIndexedCheck) { if (OSM_WayIdxAdd(wayId) > 1) { return; } } // добавить WAY // if (!wayToNodeList.Exists(x => x.WayId == wayId)) { bool isAttrs = false; WayAttrItem wayAttrItem = new WayAttrItem(); wayAttrItem.WayId = wayId; wayAttrItem.Type = wayTag.Attributes["v"].Value; // ["v"] = [1] wayAttrItem.Name = "No name"; wayAttrItem.NameEn = wayAttrItem.Name; wayAttrItem.NameRu = wayAttrItem.Name; wayAttrItem.Attrs = "\"Attrs\":\"No\""; foreach (XmlNode wayNd in xmlDoc.DocumentElement.ChildNodes) { if (wayNd.Name == "nd") { long nodeId = Int64.Parse(wayNd.Attributes["ref"].Value); // ["ref"] = [0] if (useIndexedCheck) { OSM_NodeIdxSet(nodeId); } WayToNodeItem wayToNodeItem = new WayToNodeItem(); wayToNodeItem.WayId = wayId; wayToNodeItem.NodeId = nodeId; wayToNodeList.Add(wayToNodeItem); } else if (wayNd.Name == "tag") // собрать все аттрибуты WAY { if (isAttrs) { wayAttrItem.Attrs += ","; } else { wayAttrItem.Attrs = String.Empty; } isAttrs = true; wayAttrItem.Attrs += String.Format("\"{0}\":\"{1}\"", wayNd.Attributes["k"].Value, wayNd.Attributes["v"].Value.Replace('\"', '\'')); if (wayNd.Attributes["k"].Value == "addr:housenumber") { wayAttrItem.Name = wayNd.Attributes["v"].Value.Replace('\"', '\''); } } } if (isAttrs) { wayAttrList.Add(wayAttrItem); } cntWaybuildings++; } } } } }