func build(mmlStr string, baseDir string, options C.Opts) (output, error *C.char) { conf := config.Magnacarto{} locator := conf.Locator() builderType := C.GoString(options.builderType) if builderType == "" { builderType = "mapnik2" } sqliteDir := C.GoString(options.sqliteDir) if sqliteDir != "" { conf.Datasources.SQLiteDirs = []string{sqliteDir} } fontDir := C.GoString(options.fontDir) if fontDir != "" { conf.Mapnik.FontDirs = []string{fontDir} } shapeDir := C.GoString(options.shapeDir) if shapeDir != "" { conf.Datasources.ShapefileDirs = []string{shapeDir} } imageDir := C.GoString(options.imageDir) if imageDir != "" { conf.Datasources.ImageDirs = []string{imageDir} } relPaths := bool(options.relPaths) if relPaths { locator.UseRelPaths(relPaths) } msNoMapBlock := bool(options.msNoMapBlock) locator.SetBaseDir(baseDir) var m builder.MapWriter switch builderType { case "mapserver": mm := mapserver.New(locator) mm.SetNoMapBlock(msNoMapBlock) m = mm case "mapnik2": mm := mapnik.New(locator) mm.SetMapnik2(true) m = mm case "mapnik3": m = mapnik.New(locator) default: return nil, C.CString(fmt.Sprint("unknown builder ", builderType)) } r := strings.NewReader(mmlStr) mmlData, err := mml.Parse(r) if err != nil { return nil, C.CString(fmt.Sprint(err)) } var style bytes.Buffer for _, s := range mmlData.Stylesheets { if strings.HasSuffix(s, ".mss") { r, err := os.Open(filepath.Join(baseDir, s)) if err != nil { return nil, C.CString(fmt.Sprint(err)) } content, err := ioutil.ReadAll(r) if err != nil { return nil, C.CString(fmt.Sprint(err)) } r.Close() style.Write(content) } else { style.WriteString(s) } } builder.BuildMapFromString(m, mmlData, style.String()) var buf bytes.Buffer if err := m.Write(&buf); err != nil { return nil, C.CString(fmt.Sprint(err)) } return C.CString(buf.String()), nil }
func main() { mmlFilename := flag.String("mml", "", "mml file") var mssFilenames files flag.Var(&mssFilenames, "mss", "mss file") confFile := flag.String("config", "", "config") sqliteDir := flag.String("sqlite-dir", "", "sqlite directory") shapeDir := flag.String("shape-dir", "", "shapefile directory") imageDir := flag.String("image-dir", "", "image/marker directory") fontDir := flag.String("font-dir", "", "fonts directory") dumpRules := flag.Bool("dumprules", false, "print calculated rules to stderr") builderType := flag.String("builder", "mapnik2", "builder type {mapnik2,mapnik3,mapserver}") outFile := flag.String("out", "", "out file") deferEval := flag.Bool("deferred-eval", false, "defer variable/expression evaluation to the end") version := flag.Bool("version", false, "print version and exit") noCheckFiles := flag.Bool("no-check-files", false, "do not check if images/shps/etc exists") cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file") flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if *version { fmt.Println(magnacarto.Version) os.Exit(0) } conf := config.Magnacarto{} if *confFile != "" { if err := conf.Load(*confFile); err != nil { log.Fatal(err) } } // overwrite config with command line args if *sqliteDir != "" { conf.Datasources.SQLiteDirs = []string{*sqliteDir} } if *fontDir != "" { conf.Mapnik.FontDirs = []string{*fontDir} } if *shapeDir != "" { conf.Datasources.ShapefileDirs = []string{*shapeDir} } if *imageDir != "" { conf.Datasources.ImageDirs = []string{*imageDir} } if *noCheckFiles { conf.Datasources.NoCheckFiles = true } locator := conf.Locator() var m builder.MapWriter switch *builderType { case "mapserver": m = mapserver.New(locator) case "mapnik2": m = mapnik.New(locator) m.(*mapnik.Map).SetMapnik2(true) case "mapnik3": m = mapnik.New(locator) default: log.Fatal("unknown -builder ", *builderType) } b := builder.New(m) if *deferEval || conf.DeferEval { b.EnableDeferredEval() } b.SetMML(*mmlFilename) for _, mss := range mssFilenames { b.AddMSS(mss) } if *dumpRules { b.SetDumpRulesDest(os.Stderr) } if err := b.Build(); err != nil { log.Fatal("error building map: ", err) } if *outFile == "" || *outFile == "-" { if err := m.Write(os.Stdout); err != nil { log.Fatal("error writing map to stdout: ", err) } } else { if err := m.WriteFiles(*outFile); err != nil { log.Fatal("error writing map: ", err) } } }
func main() { mmlFile := flag.String("mml", "", "mml file") var mssFilenames files flag.Var(&mssFilenames, "mss", "mss file") confFile := flag.String("config", "", "config") sqliteDir := flag.String("sqlite-dir", "", "sqlite directory") shapeDir := flag.String("shape-dir", "", "shapefile directory") imageDir := flag.String("image-dir", "", "image/marker directory") fontDir := flag.String("font-dir", "", "fonts directory") dumpRules := flag.Bool("dumprules", false, "print calculated rules to stderr") builderType := flag.String("builder", "mapnik2", "builder type {mapnik2,mapnik3,mapserver}") outFile := flag.String("out", "", "out file") relPaths := flag.Bool("relpaths", false, "use relative paths in output style") version := flag.Bool("version", false, "print version and exit") cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file") msNoMapBlock := flag.Bool("ms-no-map-block", false, "hide MAP block, only output layers/symbols for INCLUDE") flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if *version { fmt.Println(magnacarto.Version) os.Exit(0) } conf := config.Magnacarto{} if *confFile != "" { if err := conf.Load(*confFile); err != nil { log.Fatal(err) } } // overwrite config with command line args if *sqliteDir != "" { conf.Datasources.SQLiteDirs = []string{*sqliteDir} } if *fontDir != "" { conf.Mapnik.FontDirs = []string{*fontDir} } if *shapeDir != "" { conf.Datasources.ShapefileDirs = []string{*shapeDir} } if *imageDir != "" { conf.Datasources.ImageDirs = []string{*imageDir} } locator := conf.Locator() if *mmlFile != "" { locator.SetBaseDir(filepath.Dir(*mmlFile)) } if *outFile != "" { locator.SetOutDir(filepath.Dir(*outFile)) } else if *mmlFile != "" { locator.SetOutDir(filepath.Dir(*mmlFile)) } else { wd, _ := os.Getwd() locator.SetOutDir(wd) } if *relPaths { locator.UseRelPaths(*relPaths) } var m builder.MapWriter switch *builderType { case "mapserver": mm := mapserver.New(locator) mm.SetNoMapBlock(*msNoMapBlock) m = mm case "mapnik2": mm := mapnik.New(locator) mm.SetMapnik2(true) m = mm case "mapnik3": m = mapnik.New(locator) default: log.Fatal("unknown -builder ", *builderType) } b := builder.New(m) b.SetMML(*mmlFile) for _, mss := range mssFilenames { b.AddMSS(mss) } if *dumpRules { b.SetDumpRulesDest(os.Stderr) } if err := b.Build(); err != nil { log.Fatal("error building style: ", err) } if *outFile == "" || *outFile == "-" { if err := m.Write(os.Stdout); err != nil { log.Fatal("error writing style to stdout: ", err) } } else { if err := m.WriteFiles(*outFile); err != nil { log.Fatal("error writing style: ", err) } } if mf := locator.MissingFiles(); mf != nil { for _, f := range mf { log.Println("File not found:", f) } } }