2013-05-07 12:13:09 +04:00
|
|
|
package mapping
|
|
|
|
|
2013-05-17 18:28:16 +04:00
|
|
|
import (
|
2015-07-17 11:07:55 +03:00
|
|
|
"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 {
|
2014-06-19 13:51:15 +04:00
|
|
|
if m.Tags.LoadAll {
|
|
|
|
return newExcludeFilter(m.Tags.Exclude)
|
2014-06-18 19:18:44 +04:00
|
|
|
}
|
2015-09-25 14:36:23 +03: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 {
|
2014-06-19 13:51:15 +04:00
|
|
|
if m.Tags.LoadAll {
|
|
|
|
return newExcludeFilter(m.Tags.Exclude)
|
2014-06-18 19:18:44 +04:00
|
|
|
}
|
2015-09-25 14:36:23 +03: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 {
|
2014-06-19 13:51:15 +04:00
|
|
|
if m.Tags.LoadAll {
|
|
|
|
return newExcludeFilter(m.Tags.Exclude)
|
2014-06-18 19:18:44 +04:00
|
|
|
}
|
2015-09-25 14:36:23 +03: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
|
2015-09-25 14:36:23 +03:00
|
|
|
mappings["type"] = map[Value][]OrderedDestTable{
|
|
|
|
"multipolygon": []OrderedDestTable{},
|
|
|
|
"boundary": []OrderedDestTable{},
|
|
|
|
"land_area": []OrderedDestTable{},
|
2013-05-22 17:26:00 +04:00
|
|
|
}
|
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 {
|
2015-09-25 14:36:23 +03:00
|
|
|
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
|
|
|
|
2014-06-19 13:51:15 +04:00
|
|
|
type ExcludeFilter struct {
|
2015-07-17 11:07:55 +03:00
|
|
|
keys map[Key]struct{}
|
|
|
|
matches []string
|
2014-06-19 13:51:15 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func newExcludeFilter(tags []Key) *ExcludeFilter {
|
2015-07-17 11:07:55 +03:00
|
|
|
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{}{}
|
|
|
|
}
|
2014-06-19 13:51:15 +04:00
|
|
|
}
|
|
|
|
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 {
|
2015-07-17 11:07:55 +03:00
|
|
|
if _, ok := f.keys[Key(k)]; ok {
|
2014-06-19 13:51:15 +04:00
|
|
|
delete(*tags, k)
|
2015-07-17 11:07:55 +03:00
|
|
|
} else if f.matches != nil {
|
|
|
|
for _, exkey := range f.matches {
|
|
|
|
if ok, _ := path.Match(exkey, k); ok {
|
|
|
|
delete(*tags, k)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2014-06-19 13:51:15 +04:00
|
|
|
}
|
|
|
|
}
|
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
|
|
|
}
|