imposm3/mapping/filter.go

122 lines
2.8 KiB
Go
Raw Normal View History

2013-05-07 12:13:09 +04:00
package mapping
2013-05-17 18:28:16 +04:00
import (
"path"
"strings"
2014-08-04 17:19:35 +04:00
"github.com/omniscale/imposm3/element"
2013-05-17 18:28:16 +04:00
)
2014-06-18 19:18:44 +04:00
func (m *Mapping) NodeTagFilter() TagFilterer {
if m.Tags.LoadAll {
return newExcludeFilter(m.Tags.Exclude)
2014-06-18 19:18:44 +04:00
}
mappings := make(map[Key]map[Value][]OrderedDestTable)
2017-05-10 15:23:32 +03:00
m.mappings(PointTable, mappings)
2014-04-30 18:33:07 +04:00
tags := make(map[Key]bool)
2017-05-10 15:23:32 +03:00
m.extraTags(PointTable, tags)
m.extraTags(RelationMemberTable, tags)
2013-05-17 17:44:50 +04:00
return &TagFilter{mappings, tags}
}
2013-05-07 12:13:09 +04:00
2014-06-18 19:18:44 +04:00
func (m *Mapping) WayTagFilter() TagFilterer {
if m.Tags.LoadAll {
return newExcludeFilter(m.Tags.Exclude)
2014-06-18 19:18:44 +04:00
}
mappings := make(map[Key]map[Value][]OrderedDestTable)
2017-05-10 15:23:32 +03:00
m.mappings(LineStringTable, mappings)
m.mappings(PolygonTable, mappings)
2014-04-30 18:33:07 +04:00
tags := make(map[Key]bool)
2017-05-10 15:23:32 +03:00
m.extraTags(LineStringTable, tags)
m.extraTags(PolygonTable, tags)
m.extraTags(RelationMemberTable, tags)
2013-05-17 17:44:50 +04:00
return &TagFilter{mappings, tags}
}
2013-05-07 12:13:09 +04:00
2014-06-18 19:18:44 +04:00
func (m *Mapping) RelationTagFilter() TagFilterer {
if m.Tags.LoadAll {
return newExcludeFilter(m.Tags.Exclude)
2014-06-18 19:18:44 +04:00
}
mappings := make(map[Key]map[Value][]OrderedDestTable)
2017-05-09 16:55:21 +03:00
// do not filter out type tag for common relations
mappings["type"] = map[Value][]OrderedDestTable{
"multipolygon": []OrderedDestTable{},
"boundary": []OrderedDestTable{},
"land_area": []OrderedDestTable{},
}
2017-05-10 15:23:32 +03:00
m.mappings(LineStringTable, mappings)
m.mappings(PolygonTable, mappings)
m.mappings(RelationTable, mappings)
m.mappings(RelationMemberTable, mappings)
2017-05-09 16:55:21 +03:00
tags := make(map[Key]bool)
2017-05-10 15:23:32 +03:00
m.extraTags(LineStringTable, tags)
m.extraTags(PolygonTable, tags)
m.extraTags(RelationTable, tags)
m.extraTags(RelationMemberTable, tags)
2017-05-09 16:55:21 +03:00
return &TagFilter{mappings, tags}
2013-05-17 17:44:50 +04:00
}
type TagFilter struct {
mappings map[Key]map[Value][]OrderedDestTable
2014-04-30 18:33:07 +04:00
extraTags map[Key]bool
2013-05-17 17:44:50 +04:00
}
2013-05-07 12:13:09 +04:00
type ExcludeFilter struct {
keys map[Key]struct{}
matches []string
}
func newExcludeFilter(tags []Key) *ExcludeFilter {
f := ExcludeFilter{
keys: make(map[Key]struct{}),
matches: make([]string, 0),
}
for _, t := range tags {
if strings.ContainsAny(string(t), "?*[") {
f.matches = append(f.matches, string(t))
} else {
f.keys[t] = struct{}{}
}
}
return &f
}
2014-06-18 19:18:44 +04:00
2017-05-09 16:55:21 +03:00
func (f *ExcludeFilter) Filter(tags *element.Tags) {
for k := range *tags {
if _, ok := f.keys[Key(k)]; ok {
delete(*tags, k)
} else if f.matches != nil {
for _, exkey := range f.matches {
if ok, _ := path.Match(exkey, k); ok {
delete(*tags, k)
break
}
}
}
}
2014-06-18 19:18:44 +04:00
}
type TagFilterer interface {
2017-05-09 16:55:21 +03:00
Filter(tags *element.Tags)
2014-06-18 19:18:44 +04:00
}
2017-05-09 16:55:21 +03:00
func (f *TagFilter) Filter(tags *element.Tags) {
2013-05-17 18:28:16 +04:00
if tags == nil {
2017-05-09 16:55:21 +03:00
return
2013-05-17 18:28:16 +04:00
}
for k, v := range *tags {
2014-04-30 18:33:07 +04:00
values, ok := f.mappings[Key(k)]
2013-05-17 17:44:50 +04:00
if ok {
if _, ok := values["__any__"]; ok {
continue
2014-04-30 18:33:07 +04:00
} else if _, ok := values[Value(v)]; ok {
2013-05-17 17:44:50 +04:00
continue
2014-04-30 18:33:07 +04:00
} else if _, ok := f.extraTags[Key(k)]; !ok {
2013-05-17 18:28:16 +04:00
delete(*tags, k)
2013-05-17 17:44:50 +04:00
}
2014-04-30 18:33:07 +04:00
} else if _, ok := f.extraTags[Key(k)]; !ok {
2013-05-17 18:28:16 +04:00
delete(*tags, k)
2013-05-17 17:44:50 +04:00
}
}
2013-05-07 12:13:09 +04:00
}