log more sql errors during import and diff updates
parent
90154d7c51
commit
f2d40b047b
|
@ -37,9 +37,9 @@ type Inserter interface {
|
||||||
ProbePolygon(element.OSMElem) (bool, interface{})
|
ProbePolygon(element.OSMElem) (bool, interface{})
|
||||||
// InsertXxx inserts element of that type into the database.
|
// InsertXxx inserts element of that type into the database.
|
||||||
// element.Geom is set to that type.
|
// element.Geom is set to that type.
|
||||||
InsertPoint(element.OSMElem, interface{})
|
InsertPoint(element.OSMElem, interface{}) error
|
||||||
InsertLineString(element.OSMElem, interface{})
|
InsertLineString(element.OSMElem, interface{}) error
|
||||||
InsertPolygon(element.OSMElem, interface{})
|
InsertPolygon(element.OSMElem, interface{}) error
|
||||||
// SelectRelationPolygons returns a slice of all members that are already
|
// SelectRelationPolygons returns a slice of all members that are already
|
||||||
// imported with a relation with tags.
|
// imported with a relation with tags.
|
||||||
SelectRelationPolygons(element.Tags, []element.Member) []element.Member
|
SelectRelationPolygons(element.Tags, []element.Member) []element.Member
|
||||||
|
@ -107,9 +107,9 @@ func (n *nullDb) Begin() error
|
||||||
func (n *nullDb) End() error { return nil }
|
func (n *nullDb) End() error { return nil }
|
||||||
func (n *nullDb) Close() error { return nil }
|
func (n *nullDb) Close() error { return nil }
|
||||||
func (n *nullDb) Abort() error { return nil }
|
func (n *nullDb) Abort() error { return nil }
|
||||||
func (n *nullDb) InsertPoint(element.OSMElem, interface{}) {}
|
func (n *nullDb) InsertPoint(element.OSMElem, interface{}) error { return nil }
|
||||||
func (n *nullDb) InsertLineString(element.OSMElem, interface{}) {}
|
func (n *nullDb) InsertLineString(element.OSMElem, interface{}) error { return nil }
|
||||||
func (n *nullDb) InsertPolygon(element.OSMElem, interface{}) {}
|
func (n *nullDb) InsertPolygon(element.OSMElem, interface{}) error { return nil }
|
||||||
func (n *nullDb) ProbePoint(element.OSMElem) (bool, interface{}) { return true, nil }
|
func (n *nullDb) ProbePoint(element.OSMElem) (bool, interface{}) { return true, nil }
|
||||||
func (n *nullDb) ProbeLineString(element.OSMElem) (bool, interface{}) { return true, nil }
|
func (n *nullDb) ProbeLineString(element.OSMElem) (bool, interface{}) { return true, nil }
|
||||||
func (n *nullDb) ProbePolygon(element.OSMElem) (bool, interface{}) { return true, nil }
|
func (n *nullDb) ProbePolygon(element.OSMElem) (bool, interface{}) { return true, nil }
|
||||||
|
|
|
@ -416,20 +416,25 @@ func (pg *PostGIS) Open() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pg *PostGIS) InsertPoint(elem element.OSMElem, matches interface{}) {
|
func (pg *PostGIS) InsertPoint(elem element.OSMElem, matches interface{}) error {
|
||||||
if matches, ok := matches.([]mapping.Match); ok {
|
if matches, ok := matches.([]mapping.Match); ok {
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
row := match.Row(&elem)
|
row := match.Row(&elem)
|
||||||
pg.txRouter.Insert(match.Table.Name, row)
|
if err := pg.txRouter.Insert(match.Table.Name, row); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pg *PostGIS) InsertLineString(elem element.OSMElem, matches interface{}) {
|
func (pg *PostGIS) InsertLineString(elem element.OSMElem, matches interface{}) error {
|
||||||
if matches, ok := matches.([]mapping.Match); ok {
|
if matches, ok := matches.([]mapping.Match); ok {
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
row := match.Row(&elem)
|
row := match.Row(&elem)
|
||||||
pg.txRouter.Insert(match.Table.Name, row)
|
if err := pg.txRouter.Insert(match.Table.Name, row); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if pg.updateGeneralizedTables {
|
if pg.updateGeneralizedTables {
|
||||||
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
||||||
|
@ -438,13 +443,16 @@ func (pg *PostGIS) InsertLineString(elem element.OSMElem, matches interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pg *PostGIS) InsertPolygon(elem element.OSMElem, matches interface{}) {
|
func (pg *PostGIS) InsertPolygon(elem element.OSMElem, matches interface{}) error {
|
||||||
if matches, ok := matches.([]mapping.Match); ok {
|
if matches, ok := matches.([]mapping.Match); ok {
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
row := match.Row(&elem)
|
row := match.Row(&elem)
|
||||||
pg.txRouter.Insert(match.Table.Name, row)
|
if err := pg.txRouter.Insert(match.Table.Name, row); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if pg.updateGeneralizedTables {
|
if pg.updateGeneralizedTables {
|
||||||
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
for _, generalizedTable := range pg.generalizedFromMatches(matches) {
|
||||||
|
@ -453,6 +461,7 @@ func (pg *PostGIS) InsertPolygon(elem element.OSMElem, matches interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pg *PostGIS) ProbePoint(elem element.OSMElem) (bool, interface{}) {
|
func (pg *PostGIS) ProbePoint(elem element.OSMElem) (bool, interface{}) {
|
||||||
|
|
|
@ -80,18 +80,18 @@ func (txr *TxRouter) Abort() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (txr *TxRouter) Insert(table string, row []interface{}) {
|
func (txr *TxRouter) Insert(table string, row []interface{}) error {
|
||||||
tt, ok := txr.Tables[table]
|
tt, ok := txr.Tables[table]
|
||||||
if !ok {
|
if !ok {
|
||||||
panic("unknown table " + table)
|
panic("unknown table " + table)
|
||||||
}
|
}
|
||||||
tt.Insert(row)
|
return tt.Insert(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (txr *TxRouter) Delete(table string, id int64) {
|
func (txr *TxRouter) Delete(table string, id int64) error {
|
||||||
tt, ok := txr.Tables[table]
|
tt, ok := txr.Tables[table]
|
||||||
if !ok {
|
if !ok {
|
||||||
panic("unknown table " + table)
|
panic("unknown table " + table)
|
||||||
}
|
}
|
||||||
tt.Delete(id)
|
return tt.Delete(id)
|
||||||
}
|
}
|
||||||
|
|
103
diff/deleter.go
103
diff/deleter.go
|
@ -50,35 +50,39 @@ func (d *Deleter) DeletedMemberWays() map[int64]struct{} {
|
||||||
return d.deletedMembers
|
return d.deletedMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool) {
|
func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool) error {
|
||||||
d.deletedRelations[id] = struct{}{}
|
d.deletedRelations[id] = struct{}{}
|
||||||
|
|
||||||
elem, err := d.osmCache.Relations.GetRelation(id)
|
elem, err := d.osmCache.Relations.GetRelation(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == cache.NotFound {
|
if err == cache.NotFound {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
// TODO
|
return err
|
||||||
log.Print("rel", id, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
if elem.Tags == nil {
|
if elem.Tags == nil {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
|
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
|
||||||
d.delDb.Delete(-elem.Id, matches)
|
if err := d.delDb.Delete(-elem.Id, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// handle relations with tags from members by deleting
|
// handle relations with tags from members by deleting
|
||||||
// from all tables
|
// from all tables
|
||||||
e := element.OSMElem(elem.OSMElem)
|
e := element.OSMElem(elem.OSMElem)
|
||||||
e.Id = -e.Id
|
e.Id = -e.Id
|
||||||
d.delDb.DeleteElem(e)
|
if err := d.delDb.DeleteElem(e); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if deleteRefs {
|
if deleteRefs {
|
||||||
for _, m := range elem.Members {
|
for _, m := range elem.Members {
|
||||||
if m.Type == element.WAY {
|
if m.Type == element.WAY {
|
||||||
d.diffCache.Ways.DeleteRef(m.Id, id)
|
if err := d.diffCache.Ways.DeleteRef(m.Id, id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,12 +96,16 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
if _, ok := d.deletedWays[member.Id]; ok {
|
if _, ok := d.deletedWays[member.Id]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
d.deleteWay(member.Id, false)
|
if err := d.deleteWay(member.Id, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
d.osmCache.InsertedWays.DeleteMembers(elem.Members)
|
if err := d.osmCache.InsertedWays.DeleteMembers(elem.Members); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if d.expireor != nil {
|
if d.expireor != nil {
|
||||||
for _, m := range elem.Members {
|
for _, m := range elem.Members {
|
||||||
if m.Way == nil {
|
if m.Way == nil {
|
||||||
|
@ -111,81 +119,91 @@ func (d *Deleter) deleteRelation(id int64, deleteRefs bool, deleteMembers bool)
|
||||||
expire.ExpireNodes(d.expireor, m.Way.Nodes)
|
expire.ExpireNodes(d.expireor, m.Way.Nodes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Deleter) deleteWay(id int64, deleteRefs bool) {
|
func (d *Deleter) deleteWay(id int64, deleteRefs bool) error {
|
||||||
d.deletedWays[id] = struct{}{}
|
d.deletedWays[id] = struct{}{}
|
||||||
|
|
||||||
elem, err := d.osmCache.Ways.GetWay(id)
|
elem, err := d.osmCache.Ways.GetWay(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == cache.NotFound {
|
if err == cache.NotFound {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
// TODO
|
return err
|
||||||
log.Print("way", id, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
if elem.Tags == nil {
|
if elem.Tags == nil {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
deleted := false
|
deleted := false
|
||||||
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
|
if ok, matches := d.delDb.ProbePolygon(elem.OSMElem); ok {
|
||||||
d.delDb.Delete(elem.Id, matches)
|
if err := d.delDb.Delete(elem.Id, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
deleted = true
|
deleted = true
|
||||||
}
|
}
|
||||||
if ok, matches := d.delDb.ProbeLineString(elem.OSMElem); ok {
|
if ok, matches := d.delDb.ProbeLineString(elem.OSMElem); ok {
|
||||||
d.delDb.Delete(elem.Id, matches)
|
if err := d.delDb.Delete(elem.Id, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
deleted = true
|
deleted = true
|
||||||
}
|
}
|
||||||
if deleted && deleteRefs {
|
if deleted && deleteRefs {
|
||||||
for _, n := range elem.Refs {
|
for _, n := range elem.Refs {
|
||||||
d.diffCache.Coords.DeleteRef(n, id)
|
if err := d.diffCache.Coords.DeleteRef(n, id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if deleted && d.expireor != nil {
|
if deleted && d.expireor != nil {
|
||||||
err := d.osmCache.Coords.FillWay(elem)
|
err := d.osmCache.Coords.FillWay(elem)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return err
|
||||||
}
|
}
|
||||||
expire.ExpireNodes(d.expireor, elem.Nodes)
|
expire.ExpireNodes(d.expireor, elem.Nodes)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Deleter) deleteNode(id int64) {
|
func (d *Deleter) deleteNode(id int64) error {
|
||||||
elem, err := d.osmCache.Nodes.GetNode(id)
|
elem, err := d.osmCache.Nodes.GetNode(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == cache.NotFound {
|
if err == cache.NotFound {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
// TODO
|
return err
|
||||||
log.Print("node", id, err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
if elem.Tags == nil {
|
if elem.Tags == nil {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
deleted := false
|
deleted := false
|
||||||
|
|
||||||
if ok, matches := d.delDb.ProbePoint(elem.OSMElem); ok {
|
if ok, matches := d.delDb.ProbePoint(elem.OSMElem); ok {
|
||||||
d.delDb.Delete(elem.Id, matches)
|
if err := d.delDb.Delete(elem.Id, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
deleted = true
|
deleted = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if deleted && d.expireor != nil {
|
if deleted && d.expireor != nil {
|
||||||
d.expireor.Expire(elem.Long, elem.Lat)
|
d.expireor.Expire(elem.Long, elem.Lat)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Deleter) Delete(delElem parser.DiffElem) {
|
func (d *Deleter) Delete(delElem parser.DiffElem) error {
|
||||||
if !delElem.Del {
|
if !delElem.Del {
|
||||||
panic("del=false")
|
panic("del=false")
|
||||||
}
|
}
|
||||||
|
|
||||||
if delElem.Rel != nil {
|
if delElem.Rel != nil {
|
||||||
d.deleteRelation(delElem.Rel.Id, true, true)
|
if err := d.deleteRelation(delElem.Rel.Id, true, true); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else if delElem.Way != nil {
|
} else if delElem.Way != nil {
|
||||||
d.deleteWay(delElem.Way.Id, true)
|
if err := d.deleteWay(delElem.Way.Id, true); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if delElem.Mod {
|
if delElem.Mod {
|
||||||
dependers := d.diffCache.Ways.Get(delElem.Way.Id)
|
dependers := d.diffCache.Ways.Get(delElem.Way.Id)
|
||||||
|
@ -193,18 +211,24 @@ func (d *Deleter) Delete(delElem parser.DiffElem) {
|
||||||
if _, ok := d.deletedRelations[rel]; ok {
|
if _, ok := d.deletedRelations[rel]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
d.deleteRelation(rel, false, false)
|
if err := d.deleteRelation(rel, false, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if delElem.Node != nil {
|
} else if delElem.Node != nil {
|
||||||
d.deleteNode(delElem.Node.Id)
|
if err := d.deleteNode(delElem.Node.Id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if delElem.Mod {
|
if delElem.Mod {
|
||||||
dependers := d.diffCache.Coords.Get(delElem.Node.Id)
|
dependers := d.diffCache.Coords.Get(delElem.Node.Id)
|
||||||
for _, way := range dependers {
|
for _, way := range dependers {
|
||||||
if _, ok := d.deletedWays[way]; ok {
|
if _, ok := d.deletedWays[way]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
d.deleteWay(way, false)
|
if err := d.deleteWay(way, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
dependers := d.diffCache.Ways.Get(way)
|
dependers := d.diffCache.Ways.Get(way)
|
||||||
if len(dependers) >= 1 {
|
if len(dependers) >= 1 {
|
||||||
// mark member ways from deleted relations for re-insert
|
// mark member ways from deleted relations for re-insert
|
||||||
|
@ -214,12 +238,17 @@ func (d *Deleter) Delete(delElem parser.DiffElem) {
|
||||||
if _, ok := d.deletedRelations[rel]; ok {
|
if _, ok := d.deletedRelations[rel]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
d.deleteRelation(rel, false, false)
|
if err := d.deleteRelation(rel, false, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !delElem.Add {
|
if !delElem.Add {
|
||||||
d.diffCache.Coords.Delete(delElem.Node.Id)
|
if err := d.diffCache.Coords.Delete(delElem.Node.Id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,9 @@ For:
|
||||||
progress.AddCoords(1)
|
progress.AddCoords(1)
|
||||||
}
|
}
|
||||||
if elem.Del {
|
if elem.Del {
|
||||||
deleter.Delete(elem)
|
if err := deleter.Delete(elem); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if !elem.Add {
|
if !elem.Add {
|
||||||
if elem.Rel != nil {
|
if elem.Rel != nil {
|
||||||
if err := osmCache.Relations.DeleteRelation(elem.Rel.Id); err != nil {
|
if err := osmCache.Relations.DeleteRelation(elem.Rel.Id); err != nil {
|
||||||
|
|
|
@ -47,12 +47,9 @@ func (nw *NodeWriter) loop() {
|
||||||
}
|
}
|
||||||
point, err := geom.Point(geos, *n)
|
point, err := geom.Point(geos, *n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(ErrorLevel); ok {
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
if err.Level() <= 0 {
|
log.Warn(err)
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.Warn(err)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,10 +66,16 @@ func (nw *NodeWriter) loop() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if len(parts) >= 1 {
|
if len(parts) >= 1 {
|
||||||
nw.inserter.InsertPoint(n.OSMElem, matches)
|
if err := nw.inserter.InsertPoint(n.OSMElem, matches); err != nil {
|
||||||
|
log.Warn(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nw.inserter.InsertPoint(n.OSMElem, matches)
|
if err := nw.inserter.InsertPoint(n.OSMElem, matches); err != nil {
|
||||||
|
log.Warn(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,12 +73,9 @@ NextRel:
|
||||||
// relation tags)
|
// relation tags)
|
||||||
prepedRel, err := geom.PrepareRelation(r, rw.srid)
|
prepedRel, err := geom.PrepareRelation(r, rw.srid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(ErrorLevel); ok {
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
if err.Level() <= 0 {
|
log.Warn(err)
|
||||||
continue NextRel
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.Warn(err)
|
|
||||||
continue NextRel
|
continue NextRel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,13 +91,9 @@ NextRel:
|
||||||
if r.Geom != nil && r.Geom.Geom != nil {
|
if r.Geom != nil && r.Geom.Geom != nil {
|
||||||
geos.Destroy(r.Geom.Geom)
|
geos.Destroy(r.Geom.Geom)
|
||||||
}
|
}
|
||||||
if err, ok := err.(ErrorLevel); ok {
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
if err.Level() <= 0 {
|
log.Warn(err)
|
||||||
continue NextRel
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.Warn(err)
|
|
||||||
continue NextRel
|
continue NextRel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,12 +111,24 @@ NextRel:
|
||||||
rel := element.Relation(*r)
|
rel := element.Relation(*r)
|
||||||
rel.Id = -r.Id
|
rel.Id = -r.Id
|
||||||
rel.Geom = &element.Geometry{Geom: g, Wkb: geos.AsEwkbHex(g)}
|
rel.Geom = &element.Geometry{Geom: g, Wkb: geos.AsEwkbHex(g)}
|
||||||
rw.inserter.InsertPolygon(rel.OSMElem, matches)
|
err := rw.inserter.InsertPolygon(rel.OSMElem, matches)
|
||||||
|
if err != nil {
|
||||||
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rel := element.Relation(*r)
|
rel := element.Relation(*r)
|
||||||
rel.Id = -r.Id
|
rel.Id = -r.Id
|
||||||
rw.inserter.InsertPolygon(rel.OSMElem, matches)
|
err := rw.inserter.InsertPolygon(rel.OSMElem, matches)
|
||||||
|
if err != nil {
|
||||||
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range rw.inserter.SelectRelationPolygons(r.Tags, r.Members) {
|
for _, m := range rw.inserter.SelectRelationPolygons(r.Tags, r.Members) {
|
||||||
|
|
|
@ -58,13 +58,25 @@ func (ww *WayWriter) loop() {
|
||||||
|
|
||||||
inserted := false
|
inserted := false
|
||||||
if ok, matches := ww.inserter.ProbeLineString(w.OSMElem); ok {
|
if ok, matches := ww.inserter.ProbeLineString(w.OSMElem); ok {
|
||||||
ww.buildAndInsert(geos, w, matches, false)
|
err := ww.buildAndInsert(geos, w, matches, false)
|
||||||
|
if err != nil {
|
||||||
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
inserted = true
|
inserted = true
|
||||||
}
|
}
|
||||||
if w.IsClosed() && !insertedAsRelation {
|
if w.IsClosed() && !insertedAsRelation {
|
||||||
// only add polygons that were not inserted as a MultiPolygon relation
|
// only add polygons that were not inserted as a MultiPolygon relation
|
||||||
if ok, matches := ww.inserter.ProbePolygon(w.OSMElem); ok {
|
if ok, matches := ww.inserter.ProbePolygon(w.OSMElem); ok {
|
||||||
ww.buildAndInsert(geos, w, matches, true)
|
err := ww.buildAndInsert(geos, w, matches, true)
|
||||||
|
if err != nil {
|
||||||
|
if errl, ok := err.(ErrorLevel); !ok || errl.Level() > 0 {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
inserted = true
|
inserted = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +91,7 @@ func (ww *WayWriter) loop() {
|
||||||
ww.wg.Done()
|
ww.wg.Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches interface{}, isPolygon bool) {
|
func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches interface{}, isPolygon bool) error {
|
||||||
var err error
|
var err error
|
||||||
var geosgeom *geos.Geom
|
var geosgeom *geos.Geom
|
||||||
// make copy to avoid interference with polygon/linestring matches
|
// make copy to avoid interference with polygon/linestring matches
|
||||||
|
@ -91,41 +103,42 @@ func (ww *WayWriter) buildAndInsert(g *geos.Geos, w *element.Way, matches interf
|
||||||
geosgeom, err = geom.LineString(g, way.Nodes)
|
geosgeom, err = geom.LineString(g, way.Nodes)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(ErrorLevel); ok {
|
return err
|
||||||
if err.Level() <= 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Warn(err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
way.Geom, err = geom.AsGeomElement(g, geosgeom)
|
way.Geom, err = geom.AsGeomElement(g, geosgeom)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn(err)
|
return err
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ww.limiter != nil {
|
if ww.limiter != nil {
|
||||||
parts, err := ww.limiter.Clip(way.Geom.Geom)
|
parts, err := ww.limiter.Clip(way.Geom.Geom)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn(err)
|
return err
|
||||||
return
|
|
||||||
}
|
}
|
||||||
for _, p := range parts {
|
for _, p := range parts {
|
||||||
way := element.Way(*w)
|
way := element.Way(*w)
|
||||||
way.Geom = &element.Geometry{Geom: p, Wkb: g.AsEwkbHex(p)}
|
way.Geom = &element.Geometry{Geom: p, Wkb: g.AsEwkbHex(p)}
|
||||||
if isPolygon {
|
if isPolygon {
|
||||||
ww.inserter.InsertPolygon(way.OSMElem, matches)
|
if err := ww.inserter.InsertPolygon(way.OSMElem, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ww.inserter.InsertLineString(way.OSMElem, matches)
|
if err := ww.inserter.InsertLineString(way.OSMElem, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if isPolygon {
|
if isPolygon {
|
||||||
ww.inserter.InsertPolygon(way.OSMElem, matches)
|
if err := ww.inserter.InsertPolygon(way.OSMElem, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ww.inserter.InsertLineString(way.OSMElem, matches)
|
if err := ww.inserter.InsertLineString(way.OSMElem, matches); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue