imposm3/mapping/filter.go

96 lines
2.1 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 (
"goposm/element"
)
2013-05-17 17:44:50 +04:00
func (m *Mapping) NodeTagFilter() *TagFilter {
mappings := make(map[string]map[string][]string)
m.mappings("point", mappings)
tags := make(map[string]bool)
m.extraTags("point", tags)
return &TagFilter{mappings, tags}
}
2013-05-07 12:13:09 +04:00
2013-05-17 17:44:50 +04:00
func (m *Mapping) WayTagFilter() *TagFilter {
mappings := make(map[string]map[string][]string)
m.mappings("linestring", mappings)
m.mappings("polygon", mappings)
tags := make(map[string]bool)
m.extraTags("linestring", tags)
m.extraTags("polygon", tags)
return &TagFilter{mappings, tags}
}
2013-05-07 12:13:09 +04:00
2013-05-17 17:44:50 +04:00
func (m *Mapping) RelationTagFilter() *RelationTagFilter {
mappings := make(map[string]map[string][]string)
m.mappings("linestring", mappings)
m.mappings("polygon", mappings)
tags := make(map[string]bool)
m.extraTags("linestring", tags)
m.extraTags("polygon", tags)
// do not filter out type tag
mappings["type"] = map[string][]string{
"multipolygon": []string{},
"boundary": []string{},
"land_area": []string{},
}
2013-05-17 17:44:50 +04:00
return &RelationTagFilter{TagFilter{mappings, tags}}
}
type TagFilter struct {
mappings map[string]map[string][]string
extraTags map[string]bool
}
2013-05-07 12:13:09 +04:00
2013-05-17 17:44:50 +04:00
type RelationTagFilter struct {
TagFilter
}
2013-05-17 18:28:16 +04:00
func (f *TagFilter) Filter(tags *element.Tags) bool {
if tags == nil {
return false
}
2013-05-17 17:44:50 +04:00
foundMapping := false
2013-05-17 18:28:16 +04:00
for k, v := range *tags {
2013-05-17 17:44:50 +04:00
values, ok := f.mappings[k]
if ok {
if _, ok := values["__any__"]; ok {
foundMapping = true
continue
} else if _, ok := values[v]; ok {
foundMapping = true
continue
} else if _, ok := f.extraTags[k]; !ok {
2013-05-17 18:28:16 +04:00
delete(*tags, k)
2013-05-17 17:44:50 +04:00
}
} else if _, ok := f.extraTags[k]; !ok {
2013-05-17 18:28:16 +04:00
delete(*tags, k)
2013-05-17 17:44:50 +04:00
}
}
if foundMapping {
return true
} else {
2013-05-17 18:28:16 +04:00
*tags = nil
2013-05-17 17:44:50 +04:00
return false
}
}
2013-05-07 12:13:09 +04:00
2013-05-17 18:28:16 +04:00
func (f *RelationTagFilter) Filter(tags *element.Tags) bool {
if tags == nil {
return false
}
if t, ok := (*tags)["type"]; ok {
2013-05-17 17:44:50 +04:00
if t != "multipolygon" && t != "boundary" && t != "land_area" {
2013-05-17 18:28:16 +04:00
*tags = nil
2013-05-17 17:44:50 +04:00
return false
}
} else {
2013-05-17 18:28:16 +04:00
*tags = nil
2013-05-17 17:44:50 +04:00
return false
2013-05-07 12:13:09 +04:00
}
2013-05-17 17:44:50 +04:00
f.TagFilter.Filter(tags)
// always return true here since we found a matching type
return true
2013-05-07 12:13:09 +04:00
}