コード例 #1
0
        public static OsmNode ConvertTo(SimpleNode node)
        {
            OsmNode new_way = new OsmNode();
            new_way.Id = node.Id.Value;
            new_way.Latitude = node.Latitude.Value;
            new_way.Longitude = node.Longitude.Value;
            new_way.Tags = PrimitiveExtensions.ConvertTo(node.Tags);

            return new_way;
        }
コード例 #2
0
        /// <summary>
        /// Adds a node to the target.
        /// </summary>
        /// <param name="node"></param>
        public override void AddNode(SimpleNode node)
        {
            if (_base_objects == null)
            { // the base object collection is null.
                throw new InvalidOperationException("No target collection set!");
            }

            // add the node to the collection.
            _base_objects.Add(node);
        }
コード例 #3
0
        private void Delete(SimpleNode node)
        {
            OracleCommand command;

            command = this.CreateCommand("delete from node_tags where node_id = :node_id");
            command.Parameters.Add(new OracleParameter("node_id", node.Id.Value));
            command.ExecuteNonQuery();
            command.Dispose();

            command = this.CreateCommand("delete from node where id = :id");
            command.Parameters.Add(new OracleParameter("id", node.Id.Value));
            command.ExecuteNonQuery();
            command.Dispose();
        }
コード例 #4
0
        /// <summary>
        /// Modifies the given node.
        /// </summary>
        /// <param name="node"></param>
        private void Modify(SimpleNode node)
        {
            OracleCommand command;

            string sql = string.Empty;

            DateTime? timestamp = node.TimeStamp;
            if (timestamp.HasValue)
            {
                sql = "update node set latitude = :latitude, longitude = :longitude, changeset_id = :changeset_id, visible=:visible, timestamp=to_date('{0}','YYYY/MM/DD HH24:MI'), tile=:tile, version=:version, usr=:usr, usr_id=:usr_id where id=:id";
                sql = string.Format(sql,timestamp.Value.ToString("yyyy/MM/dd HH:mm"));
            }
            else
            {
                sql = "update node set latitude = :latitude, longitude = :longitude, changeset_id = :changeset_id, visible=:visible, timestamp=null, tile=:tile, version=:version where id=:id";
            }
            command = this.CreateCommand(sql);

            // format data and create parameters.
            int? latitude = (int)(node.Latitude * 10000000); // latitude should always contain a value.
            command.Parameters.Add("latitude",latitude.ConvertToDBValue<int>());

            int? longitude = (int)(node.Longitude * 10000000); // longitude should always containt a value.
            command.Parameters.Add("longitude",longitude.ConvertToDBValue<int>());

            long? changeset_id = node.ChangeSetId;
            command.Parameters.Add("changeset_id",changeset_id.ConvertToDBValue<long>());

            bool? visible = node.Visible;
            int visible_int = 1;
            if (!visible.HasValue || !visible.Value)
            {
                visible_int = 0;
            }
            command.Parameters.Add("visible", visible_int);

            // calculate the tile the node belongs to.
            long tile = TileCalculations.xy2tile(TileCalculations.lon2x(node.Longitude.Value), TileCalculations.lat2y(node.Latitude.Value));
            command.Parameters.Add("tile", tile);

            long? version = (long)node.Version;
            command.Parameters.Add("version",version.ConvertToDBValue<long>());

            command.Parameters.Add("usr", node.UserName);
            command.Parameters.Add("usr_id", node.UserId);

            long? id = node.Id;
            command.Parameters.Add("id", id.ConvertToDBValue<long>());

            // execute the update command.
            command.ExecuteNonQuery();
            command.Dispose();

            if (this.Exists("node",id.Value))
            {
                // modify the node tags.
                this.ModifyTags(node.Id.Value, node.Tags, "node_tags", "node_id");
            }

            // raise the modified event.
            this.RaiseChange(SimpleChangeType.Modify, SimpleOsmGeoType.Node, node.Id.Value);
        }
コード例 #5
0
        /// <summary>
        /// Converts simple primitives.
        /// </summary>
        /// <param name="pbf_primitive"></param>
        /// <returns></returns>
        internal SimpleOsmGeo Convert(KeyValuePair<PrimitiveBlock, object> pbf_primitive)
        {
            if (pbf_primitive.Value == null || pbf_primitive.Key == null)
            {
                throw new ArgumentNullException("pbf_primitive");
            }

            PrimitiveBlock block = pbf_primitive.Key; // get the block properties this object comes from.
            if (pbf_primitive.Value is Node)
            {
                Node node = (pbf_primitive.Value as Node);
                SimpleNode simple_node = new SimpleNode();
                simple_node.ChangeSetId = node.info.changeset;
                simple_node.Id = node.id;
                simple_node.Latitude = .000000001 * ((double)block.lat_offset
                    + ((double)block.granularity * (double)node.lat));
                simple_node.Longitude = .000000001 * ((double)block.lon_offset
                    + ((double)block.granularity * (double)node.lon));
                simple_node.Tags = new Dictionary<string, string>();
                for (int tag_idx = 0; tag_idx < node.keys.Count; tag_idx++)
                {
                    string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)node.keys[tag_idx]]);
                    string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)node.vals[tag_idx]]);

                    if (!simple_node.Tags.ContainsKey(key))
                    {
                        simple_node.Tags.Add(new KeyValuePair<string, string>(key, value));
                    }
                }
                simple_node.TimeStamp = OsmSharp.Tools.Utilities.FromUnixTime((long)node.info.timestamp *
                    (long)block.date_granularity);
                simple_node.Visible = true;
                simple_node.Version = (uint)node.info.version;
                simple_node.UserId = node.info.uid;
                simple_node.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[node.info.user_sid]);
                simple_node.Version = (ulong)node.info.version;
                simple_node.Visible = true;

                return simple_node;
            }
            else if (pbf_primitive.Value is Way)
            {
                Way way = (pbf_primitive.Value as Way);

                SimpleWay simple_way = new SimpleWay();
                simple_way.Id = way.id;
                simple_way.Nodes = new List<long>(way.refs.Count);
                long node_id = 0;
                for (int node_idx = 0; node_idx < way.refs.Count; node_idx++)
                {
                    node_id = node_id + way.refs[node_idx];
                    simple_way.Nodes.Add(node_id);
                }
                simple_way.Tags = new Dictionary<string, string>();
                for (int tag_idx = 0; tag_idx < way.keys.Count; tag_idx++)
                {
                    string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)way.keys[tag_idx]]);
                    string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)way.vals[tag_idx]]);

                    if (!simple_way.Tags.ContainsKey(key))
                    {
                        simple_way.Tags.Add(new KeyValuePair<string, string>(key, value));
                    }
                }
                if (way.info != null)
                { // add the metadata if any.
                    simple_way.ChangeSetId = way.info.changeset;
                    simple_way.TimeStamp = OsmSharp.Tools.Utilities.FromUnixTime((long)way.info.timestamp *
                        (long)block.date_granularity);
                    simple_way.UserId = way.info.uid;
                    simple_way.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[way.info.user_sid]);
                    simple_way.Version = (ulong)way.info.version;
                }
                simple_way.Visible = true;

                return simple_way;
            }
            else if (pbf_primitive.Value is Relation)
            {
                Relation relation = (pbf_primitive.Value as Relation);

                SimpleRelation simple_relation = new SimpleRelation();
                simple_relation.Id = relation.id;
                simple_relation.Members = new List<SimpleRelationMember>();
                long member_id = 0;
                for (int member_idx = 0; member_idx < relation.types.Count; member_idx++)
                {
                    member_id = member_id + relation.memids[member_idx];
                    string role = ASCIIEncoding.ASCII.GetString(
                        block.stringtable.s[relation.roles_sid[member_idx]]);
                    SimpleRelationMember member = new SimpleRelationMember();
                    member.MemberId = member_id;
                    member.MemberRole = role;
                    switch(relation.types[member_idx])
                    {
                        case Relation.MemberType.NODE:
                            member.MemberType = SimpleRelationMemberType.Node;
                            break;
                        case Relation.MemberType.WAY:
                            member.MemberType = SimpleRelationMemberType.Way;
                            break;
                        case Relation.MemberType.RELATION:
                            member.MemberType = SimpleRelationMemberType.Relation;
                            break;
                    }

                    simple_relation.Members.Add(member);
                }
                simple_relation.Tags = new Dictionary<string, string>();
                for (int tag_idx = 0; tag_idx < relation.keys.Count; tag_idx++)
                {
                    string key = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)relation.keys[tag_idx]]);
                    string value = ASCIIEncoding.ASCII.GetString(block.stringtable.s[(int)relation.vals[tag_idx]]);

                    if (!simple_relation.Tags.ContainsKey(key))
                    {
                        simple_relation.Tags.Add(new KeyValuePair<string, string>(key, value));
                    }
                }
                if (relation.info != null)
                { // read metadata if any.
                    simple_relation.ChangeSetId = relation.info.changeset;
                    simple_relation.TimeStamp = OsmSharp.Tools.Utilities.FromUnixTime((long)relation.info.timestamp *
                        (long)block.date_granularity);
                    simple_relation.UserId = relation.info.uid;
                    simple_relation.UserName = ASCIIEncoding.ASCII.GetString(block.stringtable.s[relation.info.user_sid]);
                    simple_relation.Version = (ulong)relation.info.version;
                }
                simple_relation.Visible = true;

                return simple_relation;
            }
            throw new Exception(string.Format("PBF primitive with type {0} not supported!",
                pbf_primitive.GetType().ToString()));
        }
コード例 #6
0
        private void Create(SimpleNode node)
        {
            OracleCommand command;

            command = this.CreateCommand("insert into node (id,latitude,longitude,changeset_id,visible,timestamp,tile,version,usr,usr_id) values (:id,:latitude,:longitude,:changeset_id,:visible,:timestamp,:tile,:version,:usr,:usr_id)");

            // format data and create parameters.
            long? id = node.Id;
            command.Parameters.Add(new OracleParameter("id", id.ConvertToDBValue<long>()));

            int? latitude = (int)(node.Latitude * 10000000); // latitude should always contain a value.
            command.Parameters.Add(new OracleParameter("latitude", latitude.ConvertToDBValue<int>()));

            int? longitude = (int)(node.Longitude * 10000000); // longitude should always containt a value.
            command.Parameters.Add(new OracleParameter("longitude", longitude.ConvertToDBValue<int>()));

            long? changeset_id = node.ChangeSetId;
            command.Parameters.Add(new OracleParameter("changeset_id", changeset_id.ConvertToDBValue<long>()));

            bool? visible = node.Visible;
            int visible_int = 1;
            if (!visible.HasValue)
            {
                visible_int = 1;
            }
            command.Parameters.Add(new OracleParameter("visible", visible_int));

            DateTime? timestamp = node.TimeStamp;
            command.Parameters.Add(new OracleParameter("ts", timestamp.ConvertToDBValue<DateTime>()));

            // calculate the tile the node belongs to.
            long tile = TileCalculations.xy2tile(TileCalculations.lon2x(node.Longitude.Value), TileCalculations.lat2y(node.Latitude.Value));
            command.Parameters.Add(new OracleParameter("tile", tile));

            long? version = (long)node.Version;
            command.Parameters.Add(new OracleParameter("version", version.ConvertToDBValue<long>()));

            command.Parameters.Add("usr", node.UserName);
            command.Parameters.Add("usr_id", node.UserId);

            command.ExecuteNonQuery();
            command.Dispose();

            // insert tags.
            this.CreateTags(node.Id.Value, node.Tags, "node_tags", "node_id");
        }
コード例 #7
0
        private bool MoveNextNode()
        {
            if (_nodeReader == null)
            {
                SQLiteCommand node_command = new SQLiteCommand("select * from node left join node_tags on node_tags.node_id = node.id order by node.id");
                node_command.Connection = _connection;
                _nodeReader = node_command.ExecuteReader();
                if (!_nodeReader.Read())
                    _nodeReader.Close();
            }

            // read next node.
            if (!_nodeReader.IsClosed)
            {
                // load/parse data.
                SimpleNode node = new SimpleNode();
                node.Id = _nodeReader.GetInt64(0);
                node.Latitude = _nodeReader.GetInt64(1)/10000000.0;
                node.Longitude = _nodeReader.GetInt64(2)/10000000.0;
                node.ChangeSetId = _nodeReader.GetInt64(3);
                node.TimeStamp = _nodeReader.GetDateTime(5);
                node.Version = (ulong) _nodeReader.GetInt64(7);
                node.Visible = _nodeReader.GetInt64(4) == 1;
                //node.UserName = _node_reader.GetString(8);
                //node.UserId = _node_reader.IsDBNull(9) ? -1 : _node_reader.GetInt64(9);

                        //Has tags?
                if (!_nodeReader.IsDBNull(10))
                {
                            //if (node.Tags == null)
                                //node.Tags = new Dictionary<string, string>();

                            long currentnode = node.Id.Value;
                            while(currentnode == node.Id.Value){
                                //string key = _node_reader.GetString(11);
                                //string value = _node_reader.GetString(12);
                                //node.Tags.Add(key, value);
                                if (!_nodeReader.Read())
                                {
                                    _nodeReader.Close();
                                    break;
                                }
                                currentnode = _nodeReader.GetInt64(0);
                            }
                }else if (!_nodeReader.Read())
                    _nodeReader.Close();
                        // set the current variable!
                _current = node;
                return true;
            }
            _nodeReader.Close();
            _nodeReader.Dispose();
            _nodeReader = null;
            _currentType = SimpleOsmGeoType.Way;
            return false;
        }
コード例 #8
0
ファイル: testClass.cs プロジェクト: sic2/HaptiQ
        public void init()
        {
            // initialize the connection.
            APIConnection api_instance = new APIConnection(
            "http://api06.dev.openstreetmap.org/",
            "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("An example comment!");

            // initialize the nodes.
            SimpleNode node1 = new SimpleNode();
            node1.Latitude = -0.494497;
            node1.Longitude = -24.119325;
            node1.Tags = new Dictionary<string, string>();
            node1.Tags.Add("type", "testnode1");
            node1.Visible = true;
            node1 = api_instance.NodeCreate(node1); // create
            SimpleNode node2 = new SimpleNode();
            node2.Latitude = -0.494497 + 0.0001f;
            node2.Longitude = -24.119325 + 0.0001f;
            node2.Tags = new Dictionary<string, string>();
            node2.Tags.Add("type", "testnode2");
            node2.Visible = true;
            node2 = api_instance.NodeCreate(node2); // create

            // initialize the way.
            SimpleWay way = new SimpleWay();
            way.Tags = new Dictionary<string, string>();
            way.Tags.Add("type", "testway");
            way.Nodes = new List<long>();
            way.Visible = true;
            way.Nodes.Add(node1.Id.Value);
            way.Nodes.Add(node2.Id.Value);
            way = api_instance.WayCreate(way); // create

            // initialize the relation.
            SimpleRelation relation = new SimpleRelation();
            relation.Tags = new Dictionary<string, string>();
            relation.Tags.Add("type", "testrelation");
            relation.Members = new List<SimpleRelationMember>();
            relation.Visible = true;
            relation.Members.Add(new SimpleRelationMember()
            {
                MemberId = node1.Id.Value,
                MemberRole = "some_nodes_role",
                MemberType = SimpleRelationMemberType.Node
            });
            relation.Members.Add(new SimpleRelationMember()
            {
                MemberId = node2.Id.Value,
                MemberRole = "some_nodes_role",
                MemberType = SimpleRelationMemberType.Node
            });
            relation.Members.Add(new SimpleRelationMember()
            {
                MemberId = way.Id.Value,
                MemberRole = "some_ways_role",
                MemberType = SimpleRelationMemberType.Way
            });

            // save the relation.
            relation = api_instance.RelationCreate(relation);

            // close the changeset.
            api_instance.ChangeSetClose();
        }
コード例 #9
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestNodeCreateGetUpdate()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Node Creation Test");

            // initialize the node.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode");
            node.Visible = true;

            // save the node.
            node = api_instance.NodeCreate(node);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(node.Id.HasValue);

            // get the new node id.
            long node_id = node.Id.Value;

            // open new changeset.
            changeset_id = api_instance.ChangeSetOpen("Simple Node Update Test");

            // get the node.
            SimpleNode api_node = api_instance.NodeGet(node.Id.Value);
            api_node.Tags.Add("another_tag", "test adding a tag!");
            api_instance.NodeUpdate(api_node);

            // close the current changeset.
            api_instance.ChangeSetClose();

            // get the api node.
            api_node = api_instance.NodeGet(node.Id.Value);

            Assert.AreEqual(2, api_node.Tags.Count);
            Assert.IsTrue(api_node.Tags.ContainsKey("another_tag"));
            Assert.AreEqual("test adding a tag!", api_node.Tags["another_tag"]);
        }
コード例 #10
0
ファイル: SimpleMemoryData.cs プロジェクト: jorik041/osmsharp
 /// <summary>
 /// Adds a node.
 /// </summary>
 /// <param name="node"></param>
 public void AddNode(SimpleNode node)
 {
     _nodes[node.Id.Value] = node;
 }
コード例 #11
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestNodeCreateGet()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Node Creation Test");

            // initialize the node.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode");
            node.Visible = true;

            // save the node.
            node = api_instance.NodeCreate(node);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(node.Id.HasValue);

            // get the new node id.
            long node_id = node.Id.Value;

            // get the node from the api.
            SimpleNode node_api = api_instance.NodeGet(node.Id.Value);
            Assert.AreEqual(node.Latitude, node_api.Latitude);
            Assert.AreEqual(node.Longitude, node_api.Longitude);
            Assert.AreEqual(node.Tags.Count, node_api.Tags.Count);
            Assert.AreEqual(node.Visible, node_api.Visible);
            Assert.IsTrue(node_api.ChangeSetId.HasValue);
            Assert.AreEqual(changeset_id, node_api.ChangeSetId.Value);
        }
コード例 #12
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestNodeCreateGetDelete()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Node Creation Test");

            // initialize the node.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode");
            node.Visible = true;

            // save the node.
            node = api_instance.NodeCreate(node);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(node.Id.HasValue);

            // get the new node id.
            long node_id = node.Id.Value;

            // get the node again: a node can only be deleted using the correct changesetid and version.
            node = api_instance.NodeGet(node.Id.Value);

            // open new changeset.
            changeset_id = api_instance.ChangeSetOpen("Simple Node Delete Test");

            // get the node.
            api_instance.NodeDelete(node);

            // close the current changeset.
            api_instance.ChangeSetClose();

            // get the node.
            SimpleNode api_node = api_instance.NodeGet(node.Id.Value);
            Assert.IsNull(api_node);
        }
コード例 #13
0
ファイル: APIConnection.cs プロジェクト: jorik041/osmsharp
        /// <summary>
        /// Converts an API v6 xml node to a SimpleNode object.
        /// </summary>
        /// <param name="xml_node"></param>
        /// <returns></returns>
        private SimpleNode Convertv6XmlNode(Osm.Xml.v0_6.node xml_node)
        {
            SimpleNode node = new SimpleNode();
            node.Id = xml_node.id;
            node.Latitude = xml_node.lat;
            node.Longitude = xml_node.lon;

            if (xml_node.tag != null)
            {
                node.Tags = new Dictionary<string, string>();
                foreach (Osm.Xml.v0_6.tag xml_tag in xml_node.tag)
                {
                    node.Tags.Add(xml_tag.k, xml_tag.v);
                }
            }

            node.ChangeSetId = xml_node.changeset;
            node.TimeStamp = xml_node.timestamp;
            node.UserName = xml_node.user;
            node.UserId = xml_node.uid;
            node.Version = xml_node.version;
            node.Visible = xml_node.visible;

            return node;
        }
コード例 #14
0
ファイル: APIConnection.cs プロジェクト: jorik041/osmsharp
        /// <summary>
        /// Modifies a the given node by adding it's modification to the current changeset.
        /// </summary>
        /// <param name="node"></param>
        public void NodeUpdate(SimpleNode node)
        {
            if (_current_changeset == null)
            {
                throw new InvalidOperationException("No open changeset found!");
            }
            if (!node.Id.HasValue)
            {
                throw new ArgumentOutOfRangeException("Cannot update an object without an id!");
            }

            // build a new node.
            node xml_node = node.ConvertTo();
            xml_node.changeset = _current_changeset.id;
            xml_node.changesetSpecified = true;

            // encapsulate into an osm object.
            OsmSharp.Osm.Xml.v0_6.osm osm = new Osm.Xml.v0_6.osm();
            osm.node = new Osm.Xml.v0_6.node[1];
            osm.node[0] = xml_node;

            // serialize the changeset.
            XmlSerializer serializer = new XmlSerializer(typeof(OsmSharp.Osm.Xml.v0_6.osm));
            MemoryStream mem_stream = new MemoryStream();
            Stream stream = mem_stream;
            serializer.Serialize(stream, osm);
            stream.Flush();
            mem_stream.Flush();
            byte[] put_data = mem_stream.ToArray();

            // do the api call.
            string response_string = this.DoApiCall(true, string.Format("api/0.6/node/{0}", node.Id.Value),
                Method.PUT, put_data);
        }
コード例 #15
0
ファイル: APIConnection.cs プロジェクト: jorik041/osmsharp
        /// <summary>
        /// Creates a new node by adding it's creation to the current changeset.
        /// </summary>
        /// <param name="node"></param>
        public SimpleNode NodeCreate(SimpleNode node)
        {
            if (_current_changeset == null)
            {
                throw new InvalidOperationException("No open changeset found!");
            }

            // build a new node.
            node xml_node = node.ConvertTo();
            xml_node.changeset = _current_changeset.id;
            xml_node.changesetSpecified = true;

            // encapsulate into an osm object.
            OsmSharp.Osm.Xml.v0_6.osm osm = new Osm.Xml.v0_6.osm();
            osm.node = new Osm.Xml.v0_6.node[1];
            osm.node[0] = xml_node;

            // serialize the changeset.
            XmlSerializer serializer = new XmlSerializer(typeof(OsmSharp.Osm.Xml.v0_6.osm));
            MemoryStream mem_stream = new MemoryStream();
            Stream stream = mem_stream;
            serializer.Serialize(stream, osm);
            stream.Flush();
            mem_stream.Flush();
            byte[] put_data = mem_stream.ToArray();

            // do the api call.
            string response_string = this.DoApiCall(true, "api/0.6/node/create",
                Method.PUT, put_data);

            // get the id-response.
            long id;
            if (!long.TryParse(response_string, out id))
            { // invalid response!
                throw new APIException(string.Format("Invalid response when creating a new node: {0}", response_string));
            }
            node.Id = id;
            return node;
        }
コード例 #16
0
        public override void AddNode(SimpleNode node)
        {
            DataRow node_row = _node_table.NewRow();

            // format data and create parameters.
            long? id = node.Id;
            node_row["id"] = id.ConvertToDBValue<long>();

            int? latitude = (int)(node.Latitude * 10000000); // latitude should always contain a value.
            node_row["latitude"] = latitude.ConvertToDBValue<int>();

            int? longitude = (int)(node.Longitude * 10000000); // longitude should always containt a value.
            node_row["longitude"] = longitude.ConvertToDBValue<int>();

            long? changeset_id = node.ChangeSetId;
            node_row["changeset_id"] = changeset_id.ConvertToDBValue<long>();

            bool? visible = node.Visible;
            int visible_int = 1;
            if (!visible.HasValue || !visible.Value)
            {
                visible_int = 0;
            }
            node_row["visible"] = visible_int;

            DateTime? timestamp = node.TimeStamp;
            node_row["timestamp"] = timestamp.ConvertToDBValue<DateTime>();

            ulong? version = node.Version;
            node_row["version"] = version.ConvertToDBValue<ulong>();

            // calculate the tile the node belongs to.
            long tile = TileCalculations.xy2tile(TileCalculations.lon2x(node.Longitude.Value), TileCalculations.lat2y(node.Latitude.Value));
            node_row["tile"] = tile;

            // set the usr
            node_row["usr"] = node.UserName.ToStringEmptyWhenNull();
            node_row["usr_id"] = node.UserId.ConvertToDBValue<long>();

            // add the node and it's tags.
            _node_table.Rows.Add(node_row);

            // tags.
            if (node.Tags != null)
            {
                foreach (KeyValuePair<string, string> tag in node.Tags)
                {
                    string key = tag.Key;
                    string value = tag.Value;

                    DataRow tag_row = _node_tags_table.NewRow();
                    tag_row["node_id"] = id;
                    tag_row["key"] = key.Truncate(100);
                    tag_row["value"] = value.Truncate(500);

                    if (_node_tags_table.Rows.Contains(new[] { id, tag_row["key"] }))
                        continue;

                    _node_tags_table.Rows.Add(tag_row);
                }
            }

            // bulk insert if needed.
            if (_node_table.Rows.Count >= _batch_nodes)
            {
                this.BulkCopy(_node_table, "node");
                this.BulkCopy(_node_tags_table, "node_tags");
                this.CreateNodeTables();
            }
        }
コード例 #17
0
        internal static SimpleNode ConvertToSimple(Osm.Xml.v0_6.node nd)
        {
            SimpleNode node = new SimpleNode();

            // set id
            if (nd.idSpecified)
            {
                node.Id = nd.id;
            }

            // set changeset.
            if (nd.changesetSpecified)
            {
                node.ChangeSetId = nd.changeset;
            }

            // set visible.
            if (nd.visibleSpecified)
            {
                node.Visible = nd.visible;
            }
            else
            { // if visible is not specified it is default true.
                node.Visible = true;
            }

            // set timestamp.
            if (nd.timestampSpecified)
            {
                node.TimeStamp = nd.timestamp;
            }

            // set latitude.
            if (nd.latSpecified)
            {
                node.Latitude = nd.lat;
            }

            // set longitude.
            if (nd.lonSpecified)
            {
                node.Longitude = nd.lon;
            }

            // set uid
            if (nd.uidSpecified)
            {
                node.UserId = nd.uid;
            }

            // set version
            if (nd.versionSpecified)
            {
                node.Version = nd.version;
            }

            // set user
            node.UserName = nd.user;

            // set tags.
            node.Tags = XmlSimpleConverter.ConvertToTags(nd.tag);

            return node;
        }
コード例 #18
0
ファイル: SimpleMemoryData.cs プロジェクト: jorik041/osmsharp
 /// <summary>
 /// Updates a node.
 /// </summary>
 /// <param name="node"></param>
 public void UpdateNode(SimpleNode node)
 {
     _nodes[node.Id.Value] = node;
 }
コード例 #19
0
 /// <summary>
 /// Adds a node.
 /// </summary>
 /// <param name="node"></param>
 public override void AddNode(SimpleNode node)
 {
 }
コード例 #20
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestRelationCreateGetUpdate()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Relation Creation Test");

            // initialize the relation.
            SimpleRelation relation = new SimpleRelation();
            relation.Tags = new Dictionary<string, string>();
            relation.Tags.Add("type", "testrelation");
            relation.Members = new List<SimpleRelationMember>();
            relation.Visible = true;

            // initialize the nodes.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode1");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            relation.Members.Add(new SimpleRelationMember()
            {
                MemberId = node.Id.Value,
                MemberRole = "some_nodes_role",
                MemberType = SimpleRelationMemberType.Node
            });
            node = new SimpleNode();
            node.Latitude = -0.494497 + 0.0001f;
            node.Longitude = -24.119325 + 0.0001f;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode2");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            relation.Members.Add(new SimpleRelationMember()
            {
                MemberId = node.Id.Value,
                MemberRole = "some_nodes_role",
                MemberType = SimpleRelationMemberType.Node
            });

            // save the relation.
            relation = api_instance.RelationCreate(relation);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(relation.Id.HasValue);

            // get the new relation id.
            long relation_id = relation.Id.Value;

            // open new changeset.
            changeset_id = api_instance.ChangeSetOpen("Simple Relation Update Test");

            // get the relation.
            SimpleRelation api_relation = api_instance.RelationGet(relation.Id.Value);
            api_relation.Tags.Add("another_tag", "test adding a tag!");
            api_instance.RelationUpdate(api_relation);

            // close the current changeset.
            api_instance.ChangeSetClose();

            // get the api relation.
            api_relation = api_instance.RelationGet(relation.Id.Value);

            Assert.AreEqual(2, api_relation.Tags.Count);
            Assert.IsTrue(api_relation.Tags.ContainsKey("another_tag"));
            Assert.AreEqual("test adding a tag!", api_relation.Tags["another_tag"]);
        }
コード例 #21
0
        /// <summary>
        /// Adds a given node.
        /// </summary>
        /// <param name="simple_node"></param>
        public override void AddNode(SimpleNode simple_node)
        {
            Node node= OsmBaseFactory.CreateNodeFrom(_string_table, simple_node);
            if (node != null)
            {
                _nodes[node.Id] = node;

                _source.AddNode(node);
            }
        }
コード例 #22
0
        private bool MoveNextNode()
        {
            if (_node_reader == null)
            {
                OracleCommand node_command = new OracleCommand("select * from node order by id");
                node_command.Connection = _connection;
                _node_reader = node_command.ExecuteReader();
                if (!_node_reader.Read())
                {
                    _node_reader.Close();
                }
                OracleCommand node_tag_command = new OracleCommand("select * from node_tags order by node_id");
                node_tag_command.Connection = _connection;
                _node_tag_reader = node_tag_command.ExecuteReader();
                if (!_node_tag_reader.Read())
                {
                    _node_tag_reader.Close();
                }
            }

            // read next node.
            if (!_node_reader.IsClosed)
            {
                // load/parse data.
                long id = _node_reader.GetInt64(0);
                long latitude_int = _node_reader.GetInt64(1);
                long longitude_int = _node_reader.GetInt64(2);
                long changeset_id = _node_reader.GetInt64(3);
                bool visible = _node_reader.GetInt64(4) == 1;
                DateTime timestamp = _node_reader.GetDateTime(5);
                long tile = _node_reader.GetInt64(6);
                long version = _node_reader.GetInt64(7);
                string user = _node_reader.GetString(8);
                long uid = _node_reader.GetInt64(9);
                SimpleNode node = new SimpleNode();
                node.Id = id;
                node.Latitude = latitude_int;
                node.Longitude = longitude_int;
                node.ChangeSetId = changeset_id;
                node.TimeStamp = timestamp;
                node.UserId = null;
                node.UserName = null;
                node.Version  = (ulong)version;
                node.Visible = visible;
                node.UserName = user;
                node.UserId = uid;

                if (!_node_tag_reader.IsClosed)
                {
                    long returned_id = _node_tag_reader.GetInt64(0);
                    while (returned_id == node.Id.Value)
                    {
                        if (node.Tags == null)
                        {
                            node.Tags = new Dictionary<string, string>();
                        }
                        string key = _node_tag_reader.GetString(1);
                        string value = _node_tag_reader.GetString(2);

                        node.Tags.Add(key, value);

                        if (!_node_tag_reader.Read())
                        {
                            _node_tag_reader.Close();
                        }
                        returned_id = _node_tag_reader.GetInt64(0);
                    }
                }

                // set the current variable!
                _current = node;

                // advance the reader(s).
                if (!_node_reader.Read())
                {
                    _node_reader.Close();
                }
                if (!_node_tag_reader.IsClosed && !_node_tag_reader.Read())
                {
                    _node_tag_reader.Close();
                }
                return true;
            }
            else
            {
                _node_reader.Close();
                _node_reader.Dispose();
                _node_reader = null;

                _node_tag_reader.Close();
                _node_tag_reader.Dispose();
                _node_tag_reader = null;

                _current_type = SimpleOsmGeoType.Way;

                return false;
            }
        }
コード例 #23
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestWayCreateGet()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Way Creation Test");

            // initialize the way.
            SimpleWay way = new SimpleWay();
            way.Tags = new Dictionary<string, string>();
            way.Tags.Add("type", "testway");
            way.Nodes = new List<long>();
            way.Visible = true;

            // initialize the nodes.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode1");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);
            node = new SimpleNode();
            node.Latitude = -0.494497 + 0.0001f;
            node.Longitude = -24.119325 + 0.0001f;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode2");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);

            // save the way.
            way = api_instance.WayCreate(way);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(way.Id.HasValue);

            // get the new way id.
            long way_id = way.Id.Value;

            // get the way from the api.
            SimpleWay way_api = api_instance.WayGet(way.Id.Value);
            Assert.AreEqual(way_id, way_api.Id.Value);
            Assert.AreEqual(way.Tags.Count, way_api.Tags.Count);
            Assert.AreEqual(way.Visible, way_api.Visible);
            Assert.IsTrue(way_api.ChangeSetId.HasValue);
            Assert.AreEqual(changeset_id, way_api.ChangeSetId.Value);
            Assert.AreEqual(way.Nodes[0], way_api.Nodes[0]);
            Assert.AreEqual(way.Nodes[1], way_api.Nodes[1]);
        }
コード例 #24
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestWayCreateGetDelete()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Way Creation Test");

            // initialize the way.
            SimpleWay way = new SimpleWay();
            way.Tags = new Dictionary<string, string>();
            way.Tags.Add("type", "testway");
            way.Nodes = new List<long>();
            way.Visible = true;

            // initialize the nodes.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode1");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);
            node = new SimpleNode();
            node.Latitude = -0.494497 + 0.0001f;
            node.Longitude = -24.119325 + 0.0001f;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode2");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);

            // save the way.
            way = api_instance.WayCreate(way);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(way.Id.HasValue);

            // get the new way id.
            long way_id = way.Id.Value;

            // get the way again: a way can only be deleted using the correct changesetid and version.
            way = api_instance.WayGet(way.Id.Value);

            // open new changeset.
            changeset_id = api_instance.ChangeSetOpen("Simple Way Delete Test");

            // get the way.
            api_instance.WayDelete(way);

            // close the current changeset.
            api_instance.ChangeSetClose();

            // get the way.
            SimpleWay api_way = api_instance.WayGet(way.Id.Value);
            Assert.IsNull(api_way);
        }
コード例 #25
0
ファイル: APITests.cs プロジェクト: jorik041/osmsharp
        public void APITestWayCreateGetUpdate()
        {
            // intialize the connection.
            APIConnection api_instance = new APIConnection("http://api06.dev.openstreetmap.org/",
                "osmsharp", "osmsharp");

            // open a changeset.
            long changeset_id = api_instance.ChangeSetOpen("Simple Way Creation Test");

            // initialize the way.
            SimpleWay way = new SimpleWay();
            way.Tags = new Dictionary<string, string>();
            way.Tags.Add("type", "testway");
            way.Nodes = new List<long>();
            way.Visible = true;

            // initialize the nodes.
            SimpleNode node = new SimpleNode();
            node.Latitude = -0.494497;
            node.Longitude = -24.119325;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode1");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);
            node = new SimpleNode();
            node.Latitude = -0.494497 + 0.0001f;
            node.Longitude = -24.119325 + 0.0001f;
            node.Tags = new Dictionary<string, string>();
            node.Tags.Add("type", "testnode2");
            node.Visible = true;
            node = api_instance.NodeCreate(node);
            way.Nodes.Add(node.Id.Value);

            // save the way.
            way = api_instance.WayCreate(way);

            // close the changeset.
            api_instance.ChangeSetClose();

            // check if the id now has a value.
            Assert.IsTrue(way.Id.HasValue);

            // get the new way id.
            long way_id = way.Id.Value;

            // open new changeset.
            changeset_id = api_instance.ChangeSetOpen("Simple Way Update Test");

            // get the way.
            SimpleWay api_way = api_instance.WayGet(way.Id.Value);
            api_way.Tags.Add("another_tag", "test adding a tag!");
            api_instance.WayUpdate(api_way);

            // close the current changeset.
            api_instance.ChangeSetClose();

            // get the api way.
            api_way = api_instance.WayGet(way.Id.Value);

            Assert.AreEqual(2, api_way.Tags.Count);
            Assert.IsTrue(api_way.Tags.ContainsKey("another_tag"));
            Assert.AreEqual("test adding a tag!", api_way.Tags["another_tag"]);
        }
コード例 #26
0
 /// <summary>
 /// Adds a node to the target.
 /// </summary>
 /// <param name="node"></param>
 public abstract void AddNode(SimpleNode node);
コード例 #27
0
 /// <summary>
 /// Adds a node to this database.
 /// </summary>
 /// <param name="node"></param>
 public override void AddNode(SimpleNode node)
 {
     _cached_nodes[node.Id.Value] = node;
 }