fix import of relations without way members when using -limitto
parent
8949fe28c4
commit
368c6699a7
|
@ -3,9 +3,11 @@ package cache
|
||||||
import (
|
import (
|
||||||
bin "encoding/binary"
|
bin "encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/jmhodges/levigo"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/jmhodges/levigo"
|
||||||
|
"github.com/omniscale/imposm3/element"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -129,6 +131,33 @@ func (c *OSMCache) Remove() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FirstMemberIsCached checks whether the first way or node member is cached.
|
||||||
|
// Also returns true if there are no members of type WAY or NODE.
|
||||||
|
func (c *OSMCache) FirstMemberIsCached(members []element.Member) (bool, error) {
|
||||||
|
for _, m := range members {
|
||||||
|
if m.Type == element.WAY {
|
||||||
|
_, err := c.Ways.GetWay(m.Id)
|
||||||
|
if err == NotFound {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
} else if m.Type == element.NODE {
|
||||||
|
_, err := c.Coords.GetCoord(m.Id)
|
||||||
|
if err == NotFound {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
type cache struct {
|
type cache struct {
|
||||||
db *levigo.DB
|
db *levigo.DB
|
||||||
options *cacheOptions
|
options *cacheOptions
|
||||||
|
|
|
@ -113,22 +113,6 @@ func (self *WaysCache) FillMembers(members []element.Member) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *WaysCache) FirstMemberIsCached(members []element.Member) (bool, error) {
|
|
||||||
for _, m := range members {
|
|
||||||
if m.Type == element.WAY {
|
|
||||||
_, err := self.GetWay(m.Id)
|
|
||||||
if err == NotFound {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type InsertedWaysCache struct {
|
type InsertedWaysCache struct {
|
||||||
cache
|
cache
|
||||||
}
|
}
|
||||||
|
|
|
@ -242,7 +242,7 @@ func Update(oscFile string, geometryLimiter *limit.Limiter, expireor expire.Expi
|
||||||
if elem.Rel != nil {
|
if elem.Rel != nil {
|
||||||
// check if first member is cached to avoid caching
|
// check if first member is cached to avoid caching
|
||||||
// unneeded relations (typical outside of our coverage)
|
// unneeded relations (typical outside of our coverage)
|
||||||
cached, err := osmCache.Ways.FirstMemberIsCached(elem.Rel.Members)
|
cached, err := osmCache.FirstMemberIsCached(elem.Rel.Members)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return diffError(err, "query first member %v", elem.Rel)
|
return diffError(err, "query first member %v", elem.Rel)
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ func ReadPbf(cache *osmcache.OSMCache, progress *stats.Statistics,
|
||||||
numWithTags += 1
|
numWithTags += 1
|
||||||
}
|
}
|
||||||
if withLimiter {
|
if withLimiter {
|
||||||
cached, err := cache.Ways.FirstMemberIsCached(rels[i].Members)
|
cached, err := cache.FirstMemberIsCached(rels[i].Members)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("error while checking for cached members of relation %d: %v", rels[i].Id, err)
|
log.Errorf("error while checking for cached members of relation %d: %v", rels[i].Id, err)
|
||||||
cached = true // don't skip in case of error
|
cached = true // don't skip in case of error
|
||||||
|
|
Loading…
Reference in New Issue