Пример #1
0
        public void MapCoordinates(osmNode node)
        {
            Vector2 pos = Vector2.zero;

            GetPos(node.lon, node.lat, ref pos);
        }
Пример #2
0
        public osm ExportData(string generator)
        {
            osm osmData = new osm();

            osmData.Version = "0.6";
            osmData.Upload  = false;
            if (String.IsNullOrEmpty(generator))
            {
                osmData.Generator = "OsmUtils";
            }
            else
            {
                osmData.Generator = generator;
            }

            osmData.Node     = new List <osmNode> ();
            osmData.Way      = new List <osmWay> ();
            osmData.Relation = new List <osmRelation> ();

            foreach (OsmNode node in nodes.Values)
            {
                osmNode exportedNode = new osmNode();
                exportedNode.Id        = node.ObjectId;
                exportedNode.Lat       = node.Latitude;
                exportedNode.Lon       = node.Longitude;
                exportedNode.Timestamp = node.Timestamp.ToString("o", CultureInfo.InvariantCulture);
                exportedNode.User      = node.User.Name;
                exportedNode.Uid       = node.User.Id;
                exportedNode.Visible   = node.Visible;
                exportedNode.Action    = FormatOsmObjectAction(node.Action);
                exportedNode.Version   = 1;
                exportedNode.Changeset = node.ChangesetId;

                // Do explicity set the Lat- / LonSpecified properties.
                // Otherwise the lat / lon XML attributes would not get written, if the node has
                // a latitude or longitude of exactly 0°.
                exportedNode.LatSpecified = true;
                exportedNode.LonSpecified = true;

                exportedNode.Tag = new List <tag> ();
                foreach (OsmTag tag in node.EnumerateTags())
                {
                    exportedNode.Tag.Add(new tag(tag.Key, tag.Value));
                }

                osmData.Node.Add(exportedNode);
            }

            foreach (OsmWay way in ways.Values)
            {
                osmWay exportedWay = new osmWay();
                exportedWay.Id        = way.ObjectId;
                exportedWay.Timestamp = way.Timestamp.ToString("o", CultureInfo.InvariantCulture);
                exportedWay.User      = way.User.Name;
                exportedWay.Uid       = way.User.Id;
                exportedWay.Visible   = way.Visible;
                exportedWay.Action    = FormatOsmObjectAction(way.Action);
                exportedWay.Version   = 1;
                exportedWay.Changeset = way.ChangesetId;

                exportedWay.Nd = new List <osmWayND> ();
                foreach (long nodeId in way.EnumerateNodesIds())
                {
                    osmWayND wayNode = new osmWayND();
                    wayNode.Ref = nodeId;
                    exportedWay.Nd.Add(wayNode);
                }

                exportedWay.Tag = new List <tag> ();
                foreach (OsmTag tag in way.EnumerateTags())
                {
                    exportedWay.Tag.Add(new tag(tag.Key, tag.Value));
                }

                osmData.Way.Add(exportedWay);
            }

            foreach (OsmRelation relation in relations.Values)
            {
                osmRelation exportedRelation = new osmRelation();
                exportedRelation.Id        = relation.ObjectId;
                exportedRelation.Timestamp = relation.Timestamp.ToString("o", CultureInfo.InvariantCulture);
                exportedRelation.User      = relation.User.Name;
                exportedRelation.Uid       = relation.User.Id;
                exportedRelation.Visible   = relation.Visible;
                exportedRelation.Action    = FormatOsmObjectAction(relation.Action);
                exportedRelation.Version   = 1;
                exportedRelation.Changeset = relation.ChangesetId;

                exportedRelation.Member = new List <osmRelationMember> ();
                foreach (OsmRelationMember member in relation.EnumerateMembers())
                {
                    osmRelationMember exportedMember = new osmRelationMember();
                    exportedMember.Type = FormatOsmReferenceType(member.MemberReference.ReferenceType);
                    exportedMember.Ref  = member.MemberReference.ReferenceId;
                    exportedMember.Role = member.Role;
                    exportedRelation.Member.Add(exportedMember);
                }

                exportedRelation.Tag = new List <tag> ();
                foreach (OsmTag tag in relation.EnumerateTags())
                {
                    exportedRelation.Tag.Add(new tag(tag.Key, tag.Value));
                }

                osmData.Relation.Add(exportedRelation);
            }

            return(osmData);
        }
Пример #3
0
        public override void ProcessIsohypse(Isohypse isohypse, NextIdCallback nodeCallback, NextIdCallback wayCallback)
        {
            if (writer == null)
            {
                throw new InvalidOperationException("The Begin method must be called before calling ProcessIsohypse.");
            }
            if (isohypse == null)
            {
                throw new ArgumentNullException("isohypse");
            }

            foreach (Polyline polyline in isohypse.Segments)
            {
                OsmUtils.OsmSchema.osmWay way = new osmWay();

                settings.ContourMarker.MarkContour(way, isohypse);

                way.Id        = wayCallback();
                way.Nd        = new List <osmWayND> ();
                way.Timestamp = DateTime.UtcNow.ToString("o", System.Globalization.CultureInfo.InvariantCulture);
                way.Version   = 1;
                way.User      = settings.UserName;
                way.Uid       = settings.UserId;
                way.Changeset = settings.ChangesetId;

                long firstWayNodeId = 0;

                for (int i = 0; i < polyline.Vertices.Count; i++)
                {
                    Point3 <double> point = polyline.Vertices[i];

                    OsmUtils.OsmSchema.osmNode node = new osmNode();
                    node.Id        = nodeCallback();
                    node.Lat       = point.Y + settings.LatitudeCorrection;
                    node.Lon       = point.X + settings.LongitudeCorrection;
                    node.Timestamp = DateTime.UtcNow.ToString("o", System.Globalization.CultureInfo.InvariantCulture);
                    node.Version   = 1;
                    node.User      = settings.UserName;
                    node.Uid       = settings.UserId;
                    node.Changeset = settings.ChangesetId;

                    // Do explicity set the Lat- / LonSpecified properties.
                    // Otherwise the lat / lon XML attributes would not get written, if the node has
                    // a latitude or longitude of exactly 0°.
                    node.LatSpecified = true;
                    node.LonSpecified = true;

                    if (i == 0)
                    {
                        firstWayNodeId = node.Id;
                    }

                    nodeSerializer.Serialize(writer, node, ns);

                    way.Nd.Add(new osmWayND(node.Id, true));

                    // Split the way if the maximum node count per way is reached.
                    if (way.Nd.Count == settings.MaxWayNodes && polyline.VerticesCount > settings.MaxWayNodes)
                    {
                        // Don't create a new way if already at the end of the *unclosed* polyline
                        if (i == polyline.VerticesCount - 1 && !polyline.IsClosed)
                        {
                            continue;
                        }

                        // first, serialize old way
                        waySerializer.Serialize(writer, way, ns);

                        way           = new osmWay();
                        way.Id        = wayCallback();
                        way.Nd        = new List <osmWayND> ();
                        way.Timestamp = DateTime.UtcNow.ToString("o", System.Globalization.CultureInfo.InvariantCulture);
                        way.Version   = 1;
                        way.User      = settings.UserName;
                        way.Uid       = settings.UserId;
                        way.Changeset = settings.ChangesetId;

                        settings.ContourMarker.MarkContour(way, isohypse);
                        way.Nd.Add(new osmWayND(node.Id, true));
                    }
                }

                // if the isohypse segment is closed, add the first node as the final node of the way
                if (polyline.IsClosed)
                {
                    way.Nd.Add(new osmWayND(firstWayNodeId, true));
                }

                waySerializer.Serialize(writer, way, ns);
            }
        }
Пример #4
0
        void ParseXml(XmlDocument xmlDoc)
        {
            XmlNode mainNode = xmlDoc.SelectSingleNode("osm");

            var nodes = mainNode.SelectNodes("node");

            if (allNodes == null) {
                allNodes = new Dictionary<long, osmNode>(nodes.Count);
            }

            for (int i = 0; i < nodes.Count; i++) {
                var lat = nodes[i].Attributes["lat"].Value;
                var lon = nodes[i].Attributes["lon"].Value;
                var id  = nodes[i].Attributes["id"].Value;

                var node		= new osmNode {id = long.Parse(id), Latitude = double.Parse(lat), Longitude = double.Parse(lon)};
                node.Position	= GeoHelper.WorldToTilePos(node.Longitude, node.Latitude);

                if (!allNodes.ContainsKey(node.id)) {
                    allNodes.Add(node.id, node);
                }
            }

            var ways = mainNode.SelectNodes("way");

            if (allWays == null) {
                allWays = new Dictionary<long, osmWay>(ways.Count);
            }

            foreach (XmlNode way in ways) {
                long id = long.Parse(way.Attributes["id"].Value);

                var refNodes = way.SelectNodes("nd");
                long[] refs = new long[0];
                if (refNodes != null) {
                    refs = new long[refNodes.Count];
                    for (int i = 0; i < refNodes.Count; i++) {
                        refs[i] = long.Parse(refNodes[i].Attributes["ref"].Value);
                    }
                }

                float minX = float.MaxValue;
                float minY = float.MaxValue;
                float maxX = float.MinValue;
                float maxY = float.MinValue;

                foreach (var reff in refs) {
                    osmNode nd;
                    if (allNodes.TryGetValue(reff, out nd)) {
                        var p = nd.Position;
                        if (p.X < minX) minX = p.X;
                        if (p.Y < minY) minY = p.Y;
                        if (p.X > maxX) maxX = p.X;
                        if (p.Y > maxY) maxY = p.Y;
                    }
                }

                var bbox = new BoundingBox(new Vector3(minX, minY, -1.0f), new Vector3(maxX, maxY, 1.0f));

                osmWay osmWay = new osmWay {
                        id		= id,
                        nodeRef = refs,
                        BBox	= bbox
                    };

                var tags = way.SelectNodes("tag");
                if (tags != null) {
                    foreach (XmlNode tag in tags) {
                        var key = tag.Attributes["k"].Value;
                        var val = tag.Attributes["v"].Value;

                        if (key == "building" || key == "building:levels") {
                            osmWay.isBuilding = true;
                        }
                        if (key == "highway") {
                            osmWay.isHighway = true;
                        }
                    }
                }

                if (!allWays.ContainsKey(id)) {
                    allWays.Add(id, osmWay);
                }
            }

            var relations	= mainNode.SelectNodes("relation");

            if (allRelations == null) {
                allRelations = new Dictionary<long, osmRelation>();
            }

            foreach (XmlNode rel in relations) {
                long id = long.Parse(rel.Attributes["id"].Value);

                var refMembers = rel.SelectNodes("member");
                var members = new RelationMember[0];
                if (refMembers != null) {
                    members = new RelationMember[refMembers.Count];
                    for (int i = 0; i < refMembers.Count; i++) {

                        var rm = refMembers[i];

                        var type = rm.Attributes["type"].Value;
                        MemberType mType = MemberType.Way;
                        if (type == "node") mType = MemberType.Node;

                        long refff = long.Parse(rm.Attributes["ref"].Value);

                        MemberRole mRole = MemberRole.None;
                        var role = rm.Attributes["role"].Value;
                        if (role == "inner") mRole = MemberRole.Inner;
                        if (role == "outer") mRole = MemberRole.Outer;

                        members[i] = new RelationMember {Ref = refff, Role = mRole, Type = mType};
                    }
                }

                var refTags = rel.SelectNodes("tag");
                Dictionary<string, string> tags = new Dictionary<string, string>();
                if (refTags != null) {
                    foreach (XmlNode tag in refTags) {
                        var key = tag.Attributes["k"].Value;
                        var val = tag.Attributes["v"].Value;

                        tags.Add(key, val);
                    }
                }

                if (!allRelations.ContainsKey(id)) {
                    allRelations.Add(id, new osmRelation {Id = id, Members = members, Tags = tags});
                }
            }
        }
Пример #5
0
 public Node(osmNode dirtyNote)
 {
     Id        = UInt64.Parse(dirtyNote.id);
     Latitude  = Decimal.Parse(dirtyNote.lat);
     Longitude = Decimal.Parse(dirtyNote.lon);
 }
Пример #6
0
        void ParseXml(XmlDocument xmlDoc)
        {
            XmlNode mainNode = xmlDoc.SelectSingleNode("osm");

            var nodes = mainNode.SelectNodes("node");

            if (allNodes == null)
            {
                allNodes = new Dictionary <long, osmNode>(nodes.Count);
            }

            for (int i = 0; i < nodes.Count; i++)
            {
                var lat = nodes[i].Attributes["lat"].Value;
                var lon = nodes[i].Attributes["lon"].Value;
                var id  = nodes[i].Attributes["id"].Value;

                var node = new osmNode {
                    id = long.Parse(id), Latitude = double.Parse(lat), Longitude = double.Parse(lon)
                };
                node.Position = GeoHelper.WorldToTilePos(node.Longitude, node.Latitude);

                if (!allNodes.ContainsKey(node.id))
                {
                    allNodes.Add(node.id, node);
                }
            }

            var ways = mainNode.SelectNodes("way");

            if (allWays == null)
            {
                allWays = new Dictionary <long, osmWay>(ways.Count);
            }

            foreach (XmlNode way in ways)
            {
                long id = long.Parse(way.Attributes["id"].Value);

                var    refNodes = way.SelectNodes("nd");
                long[] refs     = new long[0];
                if (refNodes != null)
                {
                    refs = new long[refNodes.Count];
                    for (int i = 0; i < refNodes.Count; i++)
                    {
                        refs[i] = long.Parse(refNodes[i].Attributes["ref"].Value);
                    }
                }

                float minX = float.MaxValue;
                float minY = float.MaxValue;
                float maxX = float.MinValue;
                float maxY = float.MinValue;

                foreach (var reff in refs)
                {
                    osmNode nd;
                    if (allNodes.TryGetValue(reff, out nd))
                    {
                        var p = nd.Position;
                        if (p.X < minX)
                        {
                            minX = p.X;
                        }
                        if (p.Y < minY)
                        {
                            minY = p.Y;
                        }
                        if (p.X > maxX)
                        {
                            maxX = p.X;
                        }
                        if (p.Y > maxY)
                        {
                            maxY = p.Y;
                        }
                    }
                }

                var bbox = new BoundingBox(new Vector3(minX, minY, -1.0f), new Vector3(maxX, maxY, 1.0f));


                osmWay osmWay = new osmWay {
                    id      = id,
                    nodeRef = refs,
                    BBox    = bbox
                };


                var tags = way.SelectNodes("tag");
                if (tags != null)
                {
                    foreach (XmlNode tag in tags)
                    {
                        var key = tag.Attributes["k"].Value;
                        var val = tag.Attributes["v"].Value;

                        if (key == "building" || key == "building:levels")
                        {
                            osmWay.isBuilding = true;
                        }
                        if (key == "highway")
                        {
                            osmWay.isHighway = true;
                        }
                    }
                }

                if (!allWays.ContainsKey(id))
                {
                    allWays.Add(id, osmWay);
                }
            }


            var relations = mainNode.SelectNodes("relation");

            if (allRelations == null)
            {
                allRelations = new Dictionary <long, osmRelation>();
            }

            foreach (XmlNode rel in relations)
            {
                long id = long.Parse(rel.Attributes["id"].Value);

                var refMembers = rel.SelectNodes("member");
                var members    = new RelationMember[0];
                if (refMembers != null)
                {
                    members = new RelationMember[refMembers.Count];
                    for (int i = 0; i < refMembers.Count; i++)
                    {
                        var rm = refMembers[i];

                        var        type  = rm.Attributes["type"].Value;
                        MemberType mType = MemberType.Way;
                        if (type == "node")
                        {
                            mType = MemberType.Node;
                        }

                        long refff = long.Parse(rm.Attributes["ref"].Value);

                        MemberRole mRole = MemberRole.None;
                        var        role  = rm.Attributes["role"].Value;
                        if (role == "inner")
                        {
                            mRole = MemberRole.Inner;
                        }
                        if (role == "outer")
                        {
                            mRole = MemberRole.Outer;
                        }

                        members[i] = new RelationMember {
                            Ref = refff, Role = mRole, Type = mType
                        };
                    }
                }


                var refTags = rel.SelectNodes("tag");
                Dictionary <string, string> tags = new Dictionary <string, string>();
                if (refTags != null)
                {
                    foreach (XmlNode tag in refTags)
                    {
                        var key = tag.Attributes["k"].Value;
                        var val = tag.Attributes["v"].Value;

                        tags.Add(key, val);
                    }
                }

                if (!allRelations.ContainsKey(id))
                {
                    allRelations.Add(id, new osmRelation {
                        Id = id, Members = members, Tags = tags
                    });
                }
            }
        }