imposm3/writer/nodes.go

97 lines
2.0 KiB
Go
Raw Normal View History

package writer
import (
"sync"
2014-08-04 17:19:35 +04:00
"github.com/omniscale/imposm3/cache"
"github.com/omniscale/imposm3/database"
"github.com/omniscale/imposm3/element"
"github.com/omniscale/imposm3/expire"
geomp "github.com/omniscale/imposm3/geom"
2014-08-04 17:19:35 +04:00
"github.com/omniscale/imposm3/geom/geos"
"github.com/omniscale/imposm3/mapping"
"github.com/omniscale/imposm3/stats"
)
type NodeWriter struct {
2013-05-28 14:54:19 +04:00
OsmElemWriter
nodes chan *element.Node
pointMatcher mapping.NodeMatcher
}
func NewNodeWriter(
osmCache *cache.OSMCache,
nodes chan *element.Node,
inserter database.Inserter,
progress *stats.Statistics,
matcher mapping.NodeMatcher,
srid int,
) *OsmElemWriter {
nw := NodeWriter{
2013-05-28 14:54:19 +04:00
OsmElemWriter: OsmElemWriter{
2013-10-28 11:26:51 +04:00
osmCache: osmCache,
progress: progress,
wg: &sync.WaitGroup{},
inserter: inserter,
srid: srid,
2013-05-28 14:54:19 +04:00
},
pointMatcher: matcher,
nodes: nodes,
}
2013-05-28 14:54:19 +04:00
nw.OsmElemWriter.writer = &nw
return &nw.OsmElemWriter
}
func (nw *NodeWriter) loop() {
geos := geos.NewGeos()
geos.SetHandleSrid(nw.srid)
defer geos.Finish()
for n := range nw.nodes {
nw.progress.AddNodes(1)
if matches := nw.pointMatcher.MatchNode(n); len(matches) > 0 {
2016-11-22 19:06:58 +03:00
nw.NodeToSrid(n)
point, err := geomp.Point(geos, *n)
if err != nil {
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
log.Warn(err)
}
continue
}
geom, err := geomp.AsGeomElement(geos, point)
if err != nil {
log.Warn(err)
continue
}
inserted := false
2013-07-30 10:17:47 +04:00
if nw.limiter != nil {
parts, err := nw.limiter.Clip(geom.Geom)
2013-05-28 10:59:59 +04:00
if err != nil {
log.Warn(err)
2013-05-28 10:59:59 +04:00
continue
}
if len(parts) >= 1 {
if err := nw.inserter.InsertPoint(n.OSMElem, geom, matches); err != nil {
log.Warn(err)
continue
}
inserted = true
2013-05-28 10:59:59 +04:00
}
} else {
if err := nw.inserter.InsertPoint(n.OSMElem, geom, matches); err != nil {
log.Warn(err)
continue
}
inserted = true
}
if inserted && nw.expireor != nil {
expire.ExpireProjectedNode(nw.expireor, *n, nw.srid)
}
}
}
nw.wg.Done()
}