func readNodes( nodes []*osmpbf.Node, block *osmpbf.PrimitiveBlock, stringtable stringTable) ([]element.Node, []element.Node) { coords := make([]element.Node, len(nodes)) nds := make([]element.Node, 0, len(nodes)/8) granularity := int64(block.GetGranularity()) latOffset := block.GetLatOffset() lonOffset := block.GetLonOffset() coordScale := 0.000000001 for i := range nodes { id := *nodes[i].Id lon := *nodes[i].Lon lat := *nodes[i].Lat coords[i].Id = id coords[i].Long = (coordScale * float64(lonOffset+(granularity*lon))) coords[i].Lat = (coordScale * float64(latOffset+(granularity*lat))) if stringtable != nil { tags := parseTags(stringtable, nodes[i].Keys, nodes[i].Vals) if tags != nil { if _, ok := tags["created_by"]; ok && len(tags) == 1 { // don't add nodes with only created_by tag to nodes cache } else { nd := coords[i] nd.Tags = tags nds = append(nds, nd) } } } } return coords, nds }
func readDenseNodes( dense *osmpbf.DenseNodes, block *osmpbf.PrimitiveBlock, stringtable stringTable) (coords []element.Node, nodes []element.Node) { var lastId int64 var lastLon, lastLat int64 coords = make([]element.Node, len(dense.Id)) nodes = make([]element.Node, 0, len(dense.Id)/8) granularity := int64(block.GetGranularity()) latOffset := block.GetLatOffset() lonOffset := block.GetLonOffset() coordScale := 0.000000001 lastKeyValPos := 0 for i := range coords { lastId += dense.Id[i] lastLon += dense.Lon[i] lastLat += dense.Lat[i] coords[i].Id = lastId coords[i].Long = (coordScale * float64(lonOffset+(granularity*lastLon))) coords[i].Lat = (coordScale * float64(latOffset+(granularity*lastLat))) if stringtable != nil && len(dense.KeysVals) > 0 { if dense.KeysVals[lastKeyValPos] != 0 { tags := parseDenseNodeTags(stringtable, &dense.KeysVals, &lastKeyValPos) if tags != nil { if _, ok := tags["created_by"]; ok && len(tags) == 1 { // don't add nodes with only created_by tag to nodes cache } else { nd := coords[i] nd.Tags = tags nodes = append(nodes, nd) } } } else { lastKeyValPos += 1 } } } return coords, nodes }