`
longgangbai
  • 浏览: 7338916 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GIS的学习(五十)应用程序中使用osmdroid-packager下载生成地图碎片

阅读更多

 

package com.etrip.osmdroid.tiles;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.osmdroid.mtp.adt.OSMTileInfo;
import org.osmdroid.mtp.download.DownloadManager;
import org.osmdroid.mtp.util.DbCreator;
import org.osmdroid.mtp.util.FolderDeleter;
import org.osmdroid.mtp.util.FolderFileCounter;
import org.osmdroid.mtp.util.FolderZipper;
import org.osmdroid.mtp.util.Util;
import org.osmdroid.util.GEMFFile;
/**
 * 
 *源代码出处来自  OSMMapTilePackage.jar中OSMMapTilePackageLoader的类
 *
 *官方地址:
 *  http://code.google.com/p/osmdroid/
 *
 *OSMMapTilePackage的使用
 *  http://code.google.com/p/osmdroid/wiki/HowToUsePackager
 *
 * 
 *
 * @author longgangbai
 */
public class OSMMapTilePackageLoader {
	// ===========================================================
	// Constants
	// ===========================================================

	private static final int THREADCOUNT_DEFAULT = 2;
	private static boolean FORCE = false;

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	public static void main(final String[] args) {
		final String pServerURL="http://tile.openstreetmap.org/%d/%d/%d.png";
		final String pDestinationFile="Mapnik";
		final String pTempFolder="D://haarlem.zip";
		final int pThreadCount=18;
		final String pFileAppendix="/";
		final int pMinZoom=10;
		final int pMaxZoom=15;
		final double pNorth=52.4244d;
		final double pSouth=52.3388d;
		final double pEast=4.6746d;
		final double pWest=4.5949;
		run(  pServerURL,
				  pDestinationFile,   pTempFolder,
				 pThreadCount,   pFileAppendix,
				  pMinZoom,   pMaxZoom,   pNorth,
				  pSouth,   pEast,  pWest);
	}
	
	private static void run(final String pServerURL,
			final String pDestinationFile, final String pTempFolder,
			final int pThreadCount, final String pFileAppendix,
			final int pMinZoom, final int pMaxZoom, final double pNorth,
			final double pSouth, final double pEast, final double pWest) {

		if (pServerURL != null) {
			System.out.println("---------------------------");
			final int expectedFileCount = runFileExpecter(pMinZoom, pMaxZoom,
					pNorth, pSouth, pEast, pWest);

			System.out.println("---------------------------");
			runDownloading(pServerURL, pTempFolder, pThreadCount,
					pFileAppendix, pMinZoom, pMaxZoom, pNorth, pSouth, pEast,
					pWest);

			System.out.println("---------------------------");
			runFileExistenceChecker(expectedFileCount, pTempFolder, pMinZoom,
					pMaxZoom, pNorth, pSouth, pEast, pWest);
		}

		if (pDestinationFile != null) {
			System.out.println("---------------------------");
			if (pDestinationFile.endsWith(".zip")) {
				runZipToFile(pTempFolder, pDestinationFile);
			} else if (pDestinationFile.endsWith(".gemf")) {
				runCreateGEMFFile(pTempFolder, pDestinationFile);
			} else {
				runCreateDb(pTempFolder, pDestinationFile);
			}

			System.out.println("---------------------------");

			if (pServerURL != null) {
				runCleanup(pTempFolder);
			}
		}

		System.out.println("---------------------------");
	}

	private static void runFileExistenceChecker(final int pExpectedFileCount,
			final String pTempFolder, final int pMinZoom, final int pMaxZoom,
			final double pNorth, final double pSouth, final double pEast,
			final double pWest) {

		abortIfUserIsNotSure("This will check if the actual filecount is the same as the expected ("
				+ pExpectedFileCount + ").");

		/* Quickly count files in the tempFolder. */
		System.out.print("Counting existing files ...");
		final int actualFileCount = FolderFileCounter
				.getTotalRecursiveFileCount(new File(pTempFolder));
		if (pExpectedFileCount == actualFileCount) {
			System.out.println(" done.");
		} else {
			System.out.println(" FAIL!");
			abortIfUserIsNotSure("Reason: Actual files:" + actualFileCount
					+ "    Expected: " + pExpectedFileCount + ". Proceed?");
		}
	}

	private static void printUsageAndExit() {
		System.out.println("Usage:\n"
				+ "-u\t[OSM-style tile URL: http://_URL_/%d/%d/%d.png]\n"
				+ "-t\t[Temporary Folder]\n"
				+ "-d\t[Destination-file: C:\\mappack.zip]\n"
				+ "-zmin\t[Minimum zoomLevel to download. Default: 0]\n"
				+ "-zmax\t[Maximum zoomLevel to download]\n"
				+ "-fa\t[Filename-Appendix. Default: \"\"]\n"
				+ "-n\t[North Latitude]\n" + "-s\t[South Latitude]\n"
				+ "-e\t[East Longitude]\n" + "-w\t[West Longitude]\n"
				+ "-nthreads\t[Number of Download-Threads. Default: 2]\n");
		System.exit(0);
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	private static void runCreateGEMFFile(final String pTempFolder,
			final String pDestinationFile) {
		try {
			System.out.println("Creating GEMF archive from " + pTempFolder
					+ " to " + pDestinationFile + " ...");
			final List<File> sourceFolders = new ArrayList<File>();
			sourceFolders.add(new File(pTempFolder));
			final GEMFFile file = new GEMFFile(pDestinationFile, sourceFolders);
			System.out.println(" done.");
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	private static void runZipToFile(final String pTempFolder,
			final String pDestinationFile) {
		try {
			System.out.print("Zipping files to " + pDestinationFile + " ...");
			FolderZipper.zipFolderToFile(new File(pDestinationFile), new File(
					pTempFolder));
			System.out.println(" done.");
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	private static void runCreateDb(final String pTempFolder,
			final String pDestinationFile) {
		try {
			System.out.print("Putting files into db : " + pDestinationFile
					+ " ...");
			DbCreator.putFolderToDb(new File(pDestinationFile), new File(
					pTempFolder));
			System.out.println(" done.");
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	private static void runCleanup(final String pTempFolder) {
		abortIfUserIsNotSure("This will delete the temp folder: " + pTempFolder
				+ " !");

		/* deleteDirecto */
		System.out.print("Deleting temp folder ...");
		FolderDeleter.deleteFolder(new File(pTempFolder));
		System.out.println(" done.");
	}

	private static void runDownloading(final String pBaseURL,
			final String pTempFolder, final int pThreadCount,
			final String pFileAppendix, final int pMinZoom, final int pMaxZoom,
			final double pNorth, final double pSouth, final double pEast,
			final double pWest) {
		final String pTempBaseURL = pTempFolder
				+ File.separator
				+ "%d"
				+ File.separator
				+ "%d"
				+ File.separator
				+ "%d"
				+ pBaseURL.substring(pBaseURL.lastIndexOf('.'))
				+ pFileAppendix.replace(File.separator + File.separator,
						File.separator);

		final DownloadManager dm = new DownloadManager(pBaseURL, pTempBaseURL,
				pThreadCount);

		/* For each zoomLevel. */
		for (int z = pMinZoom; z <= pMaxZoom; z++) {
			final OSMTileInfo upperLeft = Util.getMapTileFromCoordinates(
					pNorth, pWest, z);
			final OSMTileInfo lowerRight = Util.getMapTileFromCoordinates(
					pSouth, pEast, z);

			System.out.print("ZoomLevel: " + z + " ");
			for (int x = upperLeft.x; x <= lowerRight.x; x++) {
				for (int y = upperLeft.y; y <= lowerRight.y; y++) {
					dm.add(new OSMTileInfo(x, y, z));
				}
			}
			try {
				dm.waitEmpty();
				System.out.println(" done.");
			} catch (final InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			System.out.print("Awaiting termination of all threads ...");
			dm.waitFinished();
			System.out.println(" done.");
		} catch (final InterruptedException e) {
			e.printStackTrace();
		}
	}

	private static int runFileExpecter(final int pMinZoom, final int pMaxZoom,
			final double pNorth, final double pSouth, final double pEast,
			final double pWest) {
		/* Calculate file-count. */
		int fileCnt = 0;
		for (int z = pMinZoom; z <= pMaxZoom; z++) {
			final OSMTileInfo upperLeft = Util.getMapTileFromCoordinates(
					pNorth, pWest, z);
			final OSMTileInfo lowerRight = Util.getMapTileFromCoordinates(
					pSouth, pEast, z);

			final int dx = lowerRight.x - upperLeft.x + 1;
			final int dy = lowerRight.y - upperLeft.y + 1;
			fileCnt += dx * dy;
		}

		abortIfUserIsNotSure("This will download: " + fileCnt + " Maptiles!");

		return fileCnt;
	}

	private static void abortIfUserIsNotSure(final String message) {
		if (FORCE) {
			return;
		}

		System.out.println(message);
		System.out.print("Are you sure? [Y/N] ?: ");
		try {
			java.awt.Toolkit.getDefaultToolkit().beep();
		} catch (final Throwable t) { /* Ignore */
		}

		final String line = new Scanner(System.in).nextLine().toUpperCase()
				.trim();

		if (!line.equals("Y") && !line.equals("YES")) {
			System.err.println("User aborted.");
			System.exit(0);
		}
	}

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    osmdroid 加载geopackage离线底图

    osmdroid是一个开源的Android库,它允许开发者在应用程序中集成OpenStreetMap(OSM)地图。这个库提供了丰富的功能,包括地图显示、缩放、平移以及各种地图源的支持。在本文中,我们将详细探讨如何使用osmdroid加载...

    osmdroid-android-5.6.4.aar

    设计用于完全替换 Android 内部的 MapView 类,包含一个模块化的地图拼图,支持在线和离线地图以及覆盖地图,支持标注图标、位置跟踪和绘制形状。地图引擎使用 OpenStreetMap

    GIS应用开发教学实务-ArcGIS-应用程序框架.ppt

    GIS应用开发教学实务-ArcGIS-应用程序框架.ppt

    第九章-GIS应用模型.ppt

    可视化制图建模工具是GIS软件提供的一种工具,用户可以使用该工具在窗口中绘出模型的流程图,指定流程图的意义、所用的参数、矩阵等,即可完成制图模型的设计,而无需书写复杂的命令程序。 遥感图像处理软件 ------...

    GIS程序设计与开发实验指导1-6

    GIS程序设计与开发实验指导主要针对初学者,涉及使用ArcGIS Engine和C#进行Windows应用程序的创建。实验内容包括熟悉开发环境、控件的使用、属性设置以及控件之间的绑定,最终构建一个基础的桌面GIS应用程序框架。 ...

    用VC++开发基于MapX的GIS应用程序-实现地图的各种功能

    在GIS(地理信息系统)开发领域,MapX是一个广泛使用的组件,尤其在早期的Windows应用程序中。MapX由Bentley Systems公司开发,它提供了一种简单的方法来集成地图功能到C++应用程序中。本篇文章将深入探讨如何使用...

    GIS程序设计与开发实验指导1-6.PDF

    【GIS程序设计与开发】是本实验指导的主题,主要针对初学者,旨在介绍如何使用ArcGIS Engine和C#进行GIS应用程序的开发。首先,我们从基础的开发环境开始。 **实验一:初识ArcGIS Engine开发环境** 1. **创建...

    microsoft-windows-netfx3-ondemand-package.cab

    win10解决安装.NET Framework 3.5安装不上,错误代码:0x800F081F,解决办法:超级管用。

    gis数据地图模块.rar_Delphi GIS_delphi-gis_gis_gis 地图_地图

    在Delphi中开发GIS应用程序,可以利用其强大的面向对象特性及丰富的库资源,实现高效的地图处理功能。 Delphi GIS指的是在Delphi编程环境中构建GIS应用的框架和技术。Delphi是一种基于Object Pascal的集成开发环境...

    GIS地图开发室内外地图应用案例

    ### GIS地图开发室内外地图应用案例 #### 一、企业简介 上海为卓信息科技有限公司作为国内领先的企业级GIS(Geographic Information System,地理信息系统)平台提供商,自2003年成立以来一直专注于地理信息系统的...

    spatialite-gis-win-x86-ALPHA-1

    这个特定的版本——"spatialite-gis-win-x86-ALPHA-1" 是针对Windows平台的32位版本,且标记为ALPHA阶段,意味着这是一个测试版,可能包含未解决的问题或不稳定性。 **SQLite与Spatialite**: SQLite是一款轻量级的...

    基于C#的GIS应用程序开发

    ### 基于C#的GIS应用程序开发 #### 引言 随着信息技术的快速发展,地理信息系统(GIS)作为一项重要的工具和技术,在多个行业中扮演着越来越重要的角色。在.NET框架下,使用C#语言进行GIS应用开发已成为一种流行的...

    GIS.rar_gis_gis管网_百度地图_管网图形_管网地图

    在"GIS.rar_gis_gis管网_百度地图_管网图形_管网地图"这个压缩包中,我们可以推测它包含了与GIS应用相关的文件,特别是关于管网地图的创建和编辑。 首先,"GIS.html"可能是该压缩包的核心文件,它可能是一个基于Web...

    GIS地图下载器,下载高德地图、百度地图、行政边界、乡镇边界

    GIS(Geographic Information System,地理信息系统)是一种集成了...总之,掌握"GIS地图下载器"的使用,将极大地拓展我们在地理信息领域的应用能力,无论是对地图数据的获取、处理还是分析,都能带来极大的便利。

    企业级GIS框架_通用插件式GIS应用框架_Z-GIS框架

     在Z-GIS框架安装程序中,暂时只提供Z-GIS框架在国土行业的应用范例及C#(.NET)开发范例源码,如需要其他语言的开发范例源码请联系作者!基于Z-GIS框架进行产品开发需要符合COM规范,但也并非必须完全符合COM规范。

    第五届全国大学生GIS应用技能大赛试题及数据(完整版)

    第五届全国大学生GIS应用技能大赛旨在提升大学生在这一领域的实践能力和创新能力,涵盖了空间数据采集、集成处理以及空间分析技术等多个核心模块。 1. **空间数据采集与集成处理**: - 数据采集:这是GIS工作流程...

    基于预生成技术的三维在线地图源码 gis

    通过深入研究这个开源项目,开发者不仅可以掌握预生成技术在三维地图服务中的应用,还可以学习到WebGIS的基本架构和实现,以及WebGL的编程技巧,这对于想要从事地理信息系统开发或增强现有地图应用的人来说是非常有...

    pygis-bukun_地图_pythongis_Python与开源GIS_python开源gis应用_python地图_

    《Python与开源GIS——数据处理、空间分析...通过这个压缩包中的“pygis-bukun.pdf”,读者将全面掌握Python在GIS领域的应用,从而能够运用Python进行高效的数据处理、空间分析和地图制作,解决现实世界中的地理问题。

    基于Java的gis地图应用 .zip

    本项目“基于Java的GIS地图应用 .zip”提供了一个源码参考,旨在帮助开发者理解和构建自己的Java GIS应用程序。Java作为一种广泛使用的编程语言,具有跨平台性和强大的库支持,是开发GIS应用的理想选择。 在Java中...

Global site tag (gtag.js) - Google Analytics