Beispiel #1
0
        //========
        // Запись результата в 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());
            }
        }
Beispiel #2
0
        //========
        // Обработать 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++;
                    }
                }
            }
        }
Beispiel #3
0
        //========
        // Обработать 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++;
                        }
                    }
                }
            }
        }