2013-05-21 11:50:10 +04:00
|
|
|
package writer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"goposm/cache"
|
|
|
|
"goposm/element"
|
|
|
|
"goposm/geom"
|
|
|
|
"goposm/geom/geos"
|
|
|
|
"goposm/mapping"
|
|
|
|
"goposm/proj"
|
|
|
|
"goposm/stats"
|
|
|
|
"log"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type NodeWriter struct {
|
2013-05-28 14:54:19 +04:00
|
|
|
OsmElemWriter
|
|
|
|
nodes chan *element.Node
|
|
|
|
tagMatcher *mapping.TagMatcher
|
2013-05-21 11:50:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewNodeWriter(osmCache *cache.OSMCache, nodes chan *element.Node,
|
2013-05-28 14:54:19 +04:00
|
|
|
insertBuffer *InsertBuffer, tagMatcher *mapping.TagMatcher, progress *stats.Statistics) *OsmElemWriter {
|
2013-05-21 11:50:10 +04:00
|
|
|
nw := NodeWriter{
|
2013-05-28 14:54:19 +04:00
|
|
|
OsmElemWriter: OsmElemWriter{
|
|
|
|
osmCache: osmCache,
|
|
|
|
progress: progress,
|
|
|
|
wg: &sync.WaitGroup{},
|
|
|
|
insertBuffer: insertBuffer,
|
|
|
|
},
|
|
|
|
nodes: nodes,
|
|
|
|
tagMatcher: tagMatcher,
|
2013-05-21 11:50:10 +04:00
|
|
|
}
|
2013-05-28 14:54:19 +04:00
|
|
|
nw.OsmElemWriter.writer = &nw
|
|
|
|
return &nw.OsmElemWriter
|
2013-05-21 11:50:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
func (nw *NodeWriter) loop() {
|
2013-05-24 12:08:38 +04:00
|
|
|
geos := geos.NewGeos()
|
2013-05-21 11:50:10 +04:00
|
|
|
defer geos.Finish()
|
|
|
|
var err error
|
|
|
|
|
|
|
|
for n := range nw.nodes {
|
|
|
|
nw.progress.AddNodes(1)
|
2013-05-23 15:09:47 +04:00
|
|
|
if matches := nw.tagMatcher.Match(&n.Tags); len(matches) > 0 {
|
2013-05-21 11:50:10 +04:00
|
|
|
proj.NodeToMerc(n)
|
2013-05-24 12:08:38 +04:00
|
|
|
n.Geom, err = geom.PointWkb(geos, *n)
|
2013-05-21 11:50:10 +04:00
|
|
|
if err != nil {
|
|
|
|
if err, ok := err.(ErrorLevel); ok {
|
|
|
|
if err.Level() <= 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
log.Println(err)
|
|
|
|
continue
|
|
|
|
}
|
2013-05-28 10:59:59 +04:00
|
|
|
if nw.clipper != nil {
|
|
|
|
parts, err := nw.clipper.Clip(n.Geom.Geom)
|
|
|
|
if err != nil {
|
|
|
|
log.Println(err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if len(parts) >= 1 {
|
2013-05-28 14:54:19 +04:00
|
|
|
nw.insertMatches(&n.OSMElem, matches)
|
2013-05-28 10:59:59 +04:00
|
|
|
}
|
|
|
|
} else {
|
2013-05-28 14:54:19 +04:00
|
|
|
nw.insertMatches(&n.OSMElem, matches)
|
2013-05-21 11:50:10 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
nw.wg.Done()
|
|
|
|
}
|