// private static final byte ZOOM_NAME = (byte) 16; /// <summary> /// Constructs a new TDNode from a given osmosis node entity. Checks the validity of the entity. /// </summary> /// <param name="node"> /// the osmosis entity </param> /// <param name="preferredLanguages"> /// the preferred language(s) or null if no preference </param> /// <returns> a new TDNode </returns> public static TDNode fromNode(Node node, IList <string> preferredLanguages) { SpecialTagExtractionResult ster = OSMUtils.extractSpecialFields(node, preferredLanguages); short[] knownWayTags = OSMUtils.extractKnownPOITags(node); return(new TDNode(node.Id, LatLongUtils.degreesToMicrodegrees(node.Latitude), LatLongUtils.degreesToMicrodegrees(node.Longitude), ster.Elevation, ster.Layer, ster.Housenumber, ster.Name, knownWayTags)); }
/// <summary> /// Creates a new TDWay from an osmosis way entity using the given NodeResolver. /// </summary> /// <param name="way"> /// the way </param> /// <param name="resolver"> /// the resolver </param> /// <param name="preferredLanguages"> /// the preferred language(s) or null if no preference </param> /// <returns> a new TDWay if it is valid, null otherwise </returns> public static TDWay fromWay(Way way, NodeResolver resolver, IList <string> preferredLanguages) { if (way == null) { return(null); } SpecialTagExtractionResult ster = OSMUtils.extractSpecialFields(way, preferredLanguages); short[] knownWayTags = OSMUtils.extractKnownWayTags(way); // only ways with at least 2 way nodes are valid ways if (way.WayNodes.size() >= 2) { bool validWay = true; // retrieve way nodes from data store TDNode[] waynodes = new TDNode[way.WayNodes.size()]; int i = 0; foreach (WayNode waynode in way.WayNodes) { // TODO adjust interface to support a method getWayNodes() waynodes[i] = resolver.getNode(waynode.NodeId); if (waynodes[i] == null) { validWay = false; LOGGER.finer("unknown way node: " + waynode.NodeId + " in way " + way.Id); } i++; } // for a valid way all way nodes must be existent in the input data if (validWay) { // mark the way as polygon if the first and the last way node are the same // and if the way has at least 4 way nodes sbyte shape = LINE; if (waynodes[0].Id == waynodes[waynodes.Length - 1].Id) { if (waynodes.Length >= GeoUtils.MIN_NODES_POLYGON) { if (OSMUtils.isArea(way)) { shape = SIMPLE_POLYGON; } } else { LOGGER.finer("Found closed polygon with fewer than 4 way nodes. Way-id: " + way.Id); return(null); } } return(new TDWay(way.Id, ster.Layer, ster.Name, ster.Housenumber, ster.Ref, knownWayTags, shape, waynodes)); } } return(null); }
/// <summary> /// Creates a new TDRelation from an osmosis entity using the given WayResolver. /// </summary> /// <param name="relation"> /// the relation </param> /// <param name="resolver"> /// the resolver </param> /// <param name="preferredLanguages"> /// the preferred(s) language or null if no preference </param> /// <returns> a new TDRelation if all members are valid and the relation is of a known type, null otherwise </returns> public static TDRelation fromRelation(Relation relation, WayResolver resolver, IList <string> preferredLanguages) { if (relation == null) { return(null); } if (relation.Members.Empty) { return(null); } SpecialTagExtractionResult ster = OSMUtils.extractSpecialFields(relation, preferredLanguages); short[] knownWayTags = OSMUtils.extractKnownWayTags(relation); // special tags // TODO what about the layer of relations? // TODO exclude boundaries if (!knownRelationType(ster.Type)) { return(null); } IList <RelationMember> members = relation.Members; IList <TDWay> wayMembers = new List <TDWay>(); foreach (RelationMember relationMember in members) { if (relationMember.MemberType != EntityType.Way) { continue; } TDWay member = resolver.getWay(relationMember.MemberId); if (member == null) { LOGGER.finest("relation is missing a member, rel-id: " + relation.Id + " member id: " + relationMember.MemberId); continue; } wayMembers.Add(member); } if (wayMembers.Count == 0) { LOGGER.finest("relation has no valid members: " + relation.Id); return(null); } return(new TDRelation(relation.Id, ster.Layer, ster.Name, ster.Housenumber, ster.Ref, knownWayTags, wayMembers.ToArray())); }