imposm3/goposm.go

199 lines
4.7 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"
"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-04-16 23:14:19 +04:00
"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
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-06 13:10:37 +04:00
)
2012-12-26 17:07:30 +04:00
func main() {
log.SetFlags(log.LstdFlags | log.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 {
log.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 {
log.Fatal(err)
}
}
go stats.MemProfiler(parts[0], interval)
}
osmCache := cache.NewOSMCache(*cachedir)
if *read != "" && osmCache.Exists() {
if *overwritecache {
log.Println("removing existing cache", *cachedir)
err := osmCache.Remove()
if err != nil {
log.Fatal("unable to remove cache:", err)
}
} else if !*appendcache {
log.Fatal("cache already exists use -appendcache or -overwritecache")
}
}
err := osmCache.Open()
if err != nil {
log.Fatal(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 {
log.Fatal(err)
}
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 {
log.Fatal(err)
}
}
if *read != "" {
osmCache.Coords.SetLinearImport(true)
reader.ReadPbf(osmCache, progress, tagmapping, *read)
osmCache.Coords.SetLinearImport(false)
2013-05-10 15:55:14 +04:00
progress.Reset()
2013-05-14 11:26:28 +04:00
osmCache.Coords.Flush()
}
if *write {
progress.Reset()
err = db.Init()
if err != nil {
log.Fatal(err)
}
diffCache := cache.NewDiffCache(*cachedir)
if err = diffCache.Remove(); err != nil {
log.Fatal(err)
}
if err = diffCache.Open(); err != nil {
log.Fatal(err)
}
2013-05-06 12:21:03 +04:00
2013-05-21 09:52:03 +04:00
insertBuffer := writer.NewInsertBuffer()
2013-05-21 11:50:55 +04:00
dbWriter := writer.NewDbWriter(db, insertBuffer.Out)
2013-05-14 18:15:35 +04:00
pointsTagMatcher := tagmapping.PointMatcher()
lineStringsTagMatcher := tagmapping.LineStringMatcher()
polygonsTagMatcher := tagmapping.PolygonMatcher()
2013-05-08 18:45:14 +04:00
relations := osmCache.Relations.Iter()
relWriter := writer.NewRelationWriter(osmCache, relations,
insertBuffer, polygonsTagMatcher, progress)
// blocks till the Relations.Iter() finishes
relWriter.Close()
ways := osmCache.Ways.Iter()
wayWriter := writer.NewWayWriter(osmCache, ways, insertBuffer,
lineStringsTagMatcher, polygonsTagMatcher, progress)
2013-05-14 18:15:35 +04:00
nodes := osmCache.Nodes.Iter()
nodeWriter := writer.NewNodeWriter(osmCache, nodes, insertBuffer,
pointsTagMatcher, progress)
2013-05-08 18:45:14 +04:00
2013-05-15 15:21:31 +04:00
diffCache.Coords.Close()
wayWriter.Close()
nodeWriter.Close()
2013-05-21 09:52:03 +04:00
insertBuffer.Close()
dbWriter.Close()
}
2013-05-15 15:21:31 +04:00
if *deployProduction {
if db, ok := db.(database.Deployer); ok {
2013-05-22 10:46:39 +04:00
db.Deploy()
} else {
log.Fatal("database not deployable")
}
}
if *revertDeploy {
if db, ok := db.(database.Deployer); ok {
db.RevertDeploy()
} else {
log.Fatal("database not deployable")
}
}
2013-05-22 10:46:39 +04:00
if *removeBackup {
if db, ok := db.(database.Deployer); ok {
db.RemoveBackup()
} else {
log.Fatal("database not deployable")
}
}
2013-05-10 15:55:14 +04:00
progress.Stop()
2012-12-26 17:07:30 +04:00
}