imposm3/goposm.go

274 lines
6.3 KiB
Go
Raw Normal View History

2012-12-26 17:07:30 +04:00
package main
import (
"flag"
2013-04-08 23:45:13 +04:00
"goposm/cache"
2013-05-15 15:00:42 +04:00
"goposm/database"
_ "goposm/database/postgis"
2013-05-28 10:59:59 +04:00
"goposm/geom/clipper"
2013-05-23 19:53:58 +04:00
"goposm/logging"
"goposm/mapping"
"goposm/reader"
2013-05-06 13:03:52 +04:00
"goposm/stats"
2013-05-14 18:15:35 +04:00
"goposm/writer"
2013-05-23 19:53:58 +04:00
golog "log"
"os"
2013-04-08 23:45:13 +04:00
"runtime"
"runtime/pprof"
"strconv"
2013-05-13 12:21:12 +04:00
"strings"
"time"
2012-12-26 17:07:30 +04:00
)
var dbImportBatchSize int64
2013-05-07 13:42:05 +04:00
2013-05-23 19:53:58 +04:00
var log = logging.NewLogger("")
2013-05-07 13:42:05 +04:00
func init() {
dbImportBatchSize, _ = strconv.ParseInt(
os.Getenv("GOPOSM_DBIMPORT_BATCHSIZE"), 10, 32)
if dbImportBatchSize == 0 {
dbImportBatchSize = 4096
}
2013-05-07 13:42:05 +04:00
}
2013-05-06 13:10:37 +04:00
var (
cpuprofile = flag.String("cpuprofile", "", "filename of cpu profile output")
memprofile = flag.String("memprofile", "", "dir name of mem profile output and interval (fname:interval)")
cachedir = flag.String("cachedir", "/tmp/goposm", "cache directory")
overwritecache = flag.Bool("overwritecache", false, "overwritecache")
appendcache = flag.Bool("appendcache", false, "append cache")
read = flag.String("read", "", "read")
write = flag.Bool("write", false, "write")
connection = flag.String("connection", "", "connection parameters")
diff = flag.Bool("diff", false, "enable diff support")
mappingFile = flag.String("mapping", "", "mapping file")
deployProduction = flag.Bool("deployproduction", false, "deploy production")
revertDeploy = flag.Bool("revertdeploy", false, "revert deploy to production")
2013-05-22 10:46:39 +04:00
removeBackup = flag.Bool("removebackup", false, "remove backups from deploy")
2013-05-28 10:59:59 +04:00
limitTo = flag.String("limitto", "", "limit to geometries")
2013-05-06 13:10:37 +04:00
)
2013-05-23 19:53:58 +04:00
func die(args ...interface{}) {
log.Fatal(args...)
logging.Shutdown()
os.Exit(1)
}
func dief(msg string, args ...interface{}) {
log.Fatalf(msg, args...)
logging.Shutdown()
os.Exit(1)
}
2012-12-26 17:07:30 +04:00
func main() {
2013-05-23 19:53:58 +04:00
golog.SetFlags(golog.LstdFlags | golog.Lshortfile)
2013-05-06 13:10:37 +04:00
runtime.GOMAXPROCS(runtime.NumCPU())
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
2013-05-23 19:53:58 +04:00
golog.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
2013-05-13 12:21:12 +04:00
if *memprofile != "" {
parts := strings.Split(*memprofile, string(os.PathListSeparator))
var interval time.Duration
if len(parts) < 2 {
interval, _ = time.ParseDuration("1m")
} else {
var err error
interval, err = time.ParseDuration(parts[1])
if err != nil {
2013-05-23 19:53:58 +04:00
golog.Fatal(err)
2013-05-13 12:21:12 +04:00
}
}
go stats.MemProfiler(parts[0], interval)
}
2013-05-22 11:49:03 +04:00
if (*write || *read != "") && (*revertDeploy || *removeBackup) {
2013-05-23 19:53:58 +04:00
die("-revertdeploy and -removebackup not compatible with -read/-write")
2013-05-22 11:49:03 +04:00
}
if *revertDeploy && (*removeBackup || *deployProduction) {
2013-05-23 19:53:58 +04:00
die("-revertdeploy not compatible with -deployproduction/-removebackup")
2013-05-22 11:49:03 +04:00
}
2013-05-28 10:59:59 +04:00
var geometryClipper *clipper.Clipper
if *write && *limitTo != "" {
var err error
geometryClipper, err = clipper.NewFromOgrSource(*limitTo)
if err != nil {
die(err)
}
}
osmCache := cache.NewOSMCache(*cachedir)
if *read != "" && osmCache.Exists() {
if *overwritecache {
2013-05-23 19:53:58 +04:00
log.Printf("removing existing cache %s", *cachedir)
err := osmCache.Remove()
if err != nil {
2013-05-23 19:53:58 +04:00
die("unable to remove cache:", err)
}
} else if !*appendcache {
2013-05-23 19:53:58 +04:00
die("cache already exists use -appendcache or -overwritecache")
}
}
err := osmCache.Open()
if err != nil {
2013-05-23 19:53:58 +04:00
die(err)
}
defer osmCache.Close()
2013-05-04 18:27:05 +04:00
2013-05-06 13:03:52 +04:00
progress := stats.StatsReporter()
tagmapping, err := mapping.NewMapping(*mappingFile)
2013-05-13 15:58:44 +04:00
if err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-13 15:58:44 +04:00
}
var db database.DB
2013-05-22 10:46:39 +04:00
if *write || *deployProduction || *revertDeploy || *removeBackup {
connType := database.ConnectionType(*connection)
conf := database.Config{
Type: connType,
ConnectionParams: *connection,
Srid: 3857,
}
db, err = database.Open(conf, tagmapping)
if err != nil {
2013-05-23 19:53:58 +04:00
die(err)
}
}
2013-05-28 16:42:14 +04:00
step := log.StartStep("Imposm")
if *read != "" {
2013-05-28 16:42:14 +04:00
step := log.StartStep("Reading OSM data")
2013-05-28 16:07:06 +04:00
progress.Start()
osmCache.Coords.SetLinearImport(true)
reader.ReadPbf(osmCache, progress, tagmapping, *read)
osmCache.Coords.SetLinearImport(false)
2013-05-28 16:07:06 +04:00
progress.Stop()
2013-05-14 11:26:28 +04:00
osmCache.Coords.Flush()
2013-05-28 16:42:14 +04:00
log.StopStep(step)
}
if *write {
2013-05-28 16:42:14 +04:00
stepImport := log.StartStep("Importing OSM data")
stepWrite := log.StartStep("Writing OSM data")
progress.Start()
err = db.Init()
if err != nil {
die(err)
}
2013-05-22 13:48:34 +04:00
2013-05-28 16:42:14 +04:00
diffCache := cache.NewDiffCache(*cachedir)
if err = diffCache.Remove(); err != nil {
die(err)
2013-05-22 13:48:34 +04:00
}
2013-05-28 16:42:14 +04:00
if err = diffCache.Open(); err != nil {
die(err)
}
insertBuffer := writer.NewInsertBuffer()
dbWriter := writer.NewDbWriter(db, insertBuffer.Out)
pointsTagMatcher := tagmapping.PointMatcher()
lineStringsTagMatcher := tagmapping.LineStringMatcher()
polygonsTagMatcher := tagmapping.PolygonMatcher()
relations := osmCache.Relations.Iter()
relWriter := writer.NewRelationWriter(osmCache, relations,
insertBuffer, polygonsTagMatcher, progress)
relWriter.SetClipper(geometryClipper)
relWriter.Start()
// blocks till the Relations.Iter() finishes
relWriter.Close()
ways := osmCache.Ways.Iter()
wayWriter := writer.NewWayWriter(osmCache, ways, insertBuffer,
lineStringsTagMatcher, polygonsTagMatcher, progress)
wayWriter.SetClipper(geometryClipper)
wayWriter.Start()
nodes := osmCache.Nodes.Iter()
nodeWriter := writer.NewNodeWriter(osmCache, nodes, insertBuffer,
pointsTagMatcher, progress)
nodeWriter.SetClipper(geometryClipper)
nodeWriter.Start()
diffCache.Coords.Close()
wayWriter.Close()
nodeWriter.Close()
insertBuffer.Close()
dbWriter.Close()
progress.Stop()
log.StopStep(stepWrite)
2013-05-15 15:21:31 +04:00
2013-05-22 13:48:34 +04:00
if db, ok := db.(database.Generalizer); ok {
if err := db.Generalize(); err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-22 13:48:34 +04:00
}
} else {
2013-05-23 19:53:58 +04:00
die("database not generalizeable")
2013-05-22 13:48:34 +04:00
}
2013-05-22 11:49:03 +04:00
if db, ok := db.(database.Finisher); ok {
if err := db.Finish(); err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-22 11:49:03 +04:00
}
} else {
2013-05-23 19:53:58 +04:00
die("database not finishable")
2013-05-22 11:49:03 +04:00
}
2013-05-28 16:42:14 +04:00
log.StopStep(stepImport)
}
2013-05-15 15:21:31 +04:00
if *deployProduction {
if db, ok := db.(database.Deployer); ok {
2013-05-22 11:49:03 +04:00
if err := db.Deploy(); err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-22 11:49:03 +04:00
}
} else {
2013-05-23 19:53:58 +04:00
die("database not deployable")
}
}
if *revertDeploy {
if db, ok := db.(database.Deployer); ok {
2013-05-22 11:49:03 +04:00
if err := db.RevertDeploy(); err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-22 11:49:03 +04:00
}
} else {
2013-05-23 19:53:58 +04:00
die("database not deployable")
}
}
2013-05-22 10:46:39 +04:00
if *removeBackup {
if db, ok := db.(database.Deployer); ok {
2013-05-22 11:49:03 +04:00
if err := db.RemoveBackup(); err != nil {
2013-05-23 19:53:58 +04:00
die(err)
2013-05-22 11:49:03 +04:00
}
2013-05-22 10:46:39 +04:00
} else {
2013-05-23 19:53:58 +04:00
die("database not deployable")
2013-05-22 10:46:39 +04:00
}
}
2013-05-28 16:42:14 +04:00
log.StopStep(step)
2012-12-26 17:07:30 +04:00
}