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

GIS的学习(十六)Osmdroid中文件title文件上传

阅读更多

        android中osmdroid OSM的上传方式:

采用Httpconnection上传的方式:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import org.osmdroid.contributor.util.RecordedGeoPoint;
import org.osmdroid.contributor.util.RecordedRouteGPXFormatter;
import org.osmdroid.contributor.util.Util;
import org.osmdroid.contributor.util.constants.OpenStreetMapContributorConstants;

/**
 * Small java class that allows to upload gpx files to www.openstreetmap.org via its api call.
 * 
 * @author cdaller
 * @author Nicolas Gramlich
 */
public class OSMUploader implements OpenStreetMapContributorConstants {

	// ===========================================================
	// Constants
	// ===========================================================

	public static final String API_VERSION = "0.5";
	private static final int BUFFER_SIZE = 65535;
	private static final String BASE64_ENC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	private static final String BOUNDARY = "----------------------------d10f7aa230e8";
	private static final String LINE_END = "\r\n";

	private static final String DEFAULT_DESCRIPTION = "AndNav - automatically created route.";
	private static final String DEFAULT_TAGS = "AndNav";

	public static final SimpleDateFormat pseudoFileNameFormat = new SimpleDateFormat(
			"yyyyMMdd'_'HHmmss'_'SSS");
	private static final SimpleDateFormat autoTagFormat = new SimpleDateFormat("MMMM yyyy");

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

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

	/**
	 * This is a utility class with only static members.
	 */
	private OSMUploader() {
	}

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

	/**
	 * Uses OSMConstants.OSM_USERNAME and OSMConstants.OSM_PASSWORD as username/password.
	 * Description will be <code>DEFAULT_DESCRIPTION</code>, tags will be automatically generated
	 * (i.e. "<code>October 2008</code>") NOTE: This method is not blocking!
	 * 
	 * @param gpxInputStream
	 *            the InputStream containing the gpx-data.
	 * @throws IOException
	 */
	public static void uploadAsync(final ArrayList<RecordedGeoPoint> recordedGeoPoints) {
		uploadAsync(DEFAULT_DESCRIPTION, DEFAULT_TAGS, true, recordedGeoPoints);
	}

	/**
	 * Uses OSMConstants.OSM_USERNAME and OSMConstants.OSM_PASSWORD as username/password. The
	 * 'filename' will be the current <code>timestamp.gpx</code> (i.e. "20081231_234815_912.gpx")
	 * NOTE: This method is not blocking!
	 * 
	 * @param description
	 *            <code>not null</code>
	 * @param tags
	 *            <code>not null</code>
	 * @param addDateTags
	 *            adds Date Tags to the existing Tags (i.e. "October 2008")
	 * @param gpxInputStreaman
	 *            the InputStream containing the gpx-data.
	 * @throws IOException
	 */
	public static void uploadAsync(final String description, final String tags,
			final boolean addDateTags, final ArrayList<RecordedGeoPoint> recordedGeoPoints) {
		uploadAsync(OSM_USERNAME, OSM_PASSWORD, description, tags, addDateTags, recordedGeoPoints,
				pseudoFileNameFormat.format(new GregorianCalendar().getTime()) + "_" + OSM_USERNAME
						+ ".gpx");
	}

	/**
	 * NOTE: This method is not blocking! (Code runs in thread)
	 * 
	 * @param username
	 *            <code>not null</code> and <code>not empty</code>. Valid OSM-username
	 * @param password
	 *            <code>not null</code> and <code>not empty</code>. Valid password to the
	 *            OSM-username.
	 * @param description
	 *            <code>not null</code>
	 * @param tags
	 *            if <code>null</code> addDateTags is treated as <code>true</code>
	 * @param addDateTags
	 *            adds Date Tags to the existing Tags (i.e. "<code>October 2008</code>")
	 * @param gpxInputStream
	 *            the InputStream containing the gpx-data.
	 * @param pseudoFileName
	 *            ending with "<code>.gpx</code>"
	 * @throws IOException
	 */
	public static void uploadAsync(final String username, final String password,
			final String description, final String tags, final boolean addDateTags,
			final ArrayList<RecordedGeoPoint> recordedGeoPoints, final String pseudoFileName) {
		if (username == null || username.length() == 0)
			return;
		if (password == null || password.length() == 0)
			return;
		if (description == null || description.length() == 0)
			return;
		if (tags == null || tags.length() == 0)
			return;
		if (pseudoFileName == null || pseudoFileName.endsWith(".gpx"))
			return;

		new Thread(new Runnable() {
			@Override
			public void run() {
				if (!Util.isSufficienDataForUpload(recordedGeoPoints))
					return;

				final InputStream gpxInputStream = new ByteArrayInputStream(
						RecordedRouteGPXFormatter.create(recordedGeoPoints).getBytes());

				String tagsToUse = tags;
				if (addDateTags || tagsToUse == null)
					if (tagsToUse == null)
						tagsToUse = autoTagFormat.format(new GregorianCalendar().getTime());
					else
						tagsToUse = tagsToUse + " "
								+ autoTagFormat.format(new GregorianCalendar().getTime());

				// logger.debug("Uploading " + pseudoFileName + " to openstreetmap.org");
				try {
					// String urlGpxName = URLEncoder.encode(gpxName.replaceAll("\\.;&?,/","_"),
					// "UTF-8");
					final String urlDesc = (description == null) ? DEFAULT_DESCRIPTION
							: description.replaceAll("\\.;&?,/", "_");
					final String urlTags = (tagsToUse == null) ? DEFAULT_TAGS
							: tagsToUse.replaceAll("\\\\.;&?,/", "_");
					final URL url = new URL("http://www.openstreetmap.org/api/" + API_VERSION
							+ "/gpx/create");
					// logger.debug("Destination Url: " + url);
					final HttpURLConnection con = (HttpURLConnection) url.openConnection();
					con.setConnectTimeout(15000);
					con.setRequestMethod("POST");
					con.setDoOutput(true);
					con.addRequestProperty("Authorization", "Basic "
							+ encodeBase64(username + ":" + password));
					con.addRequestProperty("Content-Type", "multipart/form-data; boundary="
							+ BOUNDARY);
					con.addRequestProperty("Connection", "close"); // counterpart of keep-alive
					con.addRequestProperty("Expect", "");

					con.connect();
					final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(
							con.getOutputStream()));
					// DataOutputStream out = new DataOutputStream(System.out);

					writeContentDispositionFile(out, "file", gpxInputStream, pseudoFileName);
					writeContentDisposition(out, "description", urlDesc);
					writeContentDisposition(out, "tags", urlTags);

					writeContentDisposition(out, "public", "1");

					out.writeBytes("--" + BOUNDARY + "--" + LINE_END);
					out.flush();

					final int retCode = con.getResponseCode();
					String retMsg = con.getResponseMessage();
					// logger.debug("\nreturn code: "+retCode + " " + retMsg);
					if (retCode != 200) {
						// Look for a detailed error message from the server
						if (con.getHeaderField("Error") != null)
							retMsg += "\n" + con.getHeaderField("Error");
						con.disconnect();
						throw new RuntimeException(retCode + " " + retMsg);
					}
					out.close();
					con.disconnect();
				} catch (final Exception e) {
					// logger.error("OSMUpload Error", e);
				}
			}

		}, "OSMUpload-Thread").start();
	}

	public static void upload(final String username, final String password,
			final String description, final String tags, final boolean addDateTags,
			final ArrayList<RecordedGeoPoint> recordedGeoPoints, final String pseudoFileName)
			throws IOException {
		uploadAsync(username, password, description, tags, addDateTags, recordedGeoPoints,
				pseudoFileName);
	}

	/**
	 * @param out
	 * @param string
	 * @param gpxFile
	 * @throws IOException
	 */
	private static void writeContentDispositionFile(final DataOutputStream out, final String name,
			final InputStream gpxInputStream, final String pseudoFileName) throws IOException {
		out.writeBytes("--" + BOUNDARY + LINE_END);
		out.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"; filename=\""
				+ pseudoFileName + "\"" + LINE_END);
		out.writeBytes("Content-Type: application/octet-stream" + LINE_END);
		out.writeBytes(LINE_END);

		final byte[] buffer = new byte[BUFFER_SIZE];
		// int fileLen = (int)gpxFile.length();
		int read;
		int sumread = 0;
		final InputStream in = new BufferedInputStream(gpxInputStream);
		// logger.debug("Transferring data to server");
		while ((read = in.read(buffer)) >= 0) {
			out.write(buffer, 0, read);
			out.flush();
			sumread += read;
		}
		in.close();
		out.writeBytes(LINE_END);
	}

	/**
	 * @param string
	 * @param urlDesc
	 * @throws IOException
	 */
	private static void writeContentDisposition(final DataOutputStream out, final String name,
			final String value) throws IOException {
		out.writeBytes("--" + BOUNDARY + LINE_END);
		out.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + LINE_END);
		out.writeBytes(LINE_END);
		out.writeBytes(value + LINE_END);
	}

	private static String encodeBase64(final String s) {
		final StringBuilder out = new StringBuilder();
		for (int i = 0; i < (s.length() + 2) / 3; ++i) {
			final int l = Math.min(3, s.length() - i * 3);
			final String buf = s.substring(i * 3, i * 3 + l);
			out.append(BASE64_ENC.charAt(buf.charAt(0) >> 2));
			out.append(BASE64_ENC.charAt((buf.charAt(0) & 0x03) << 4
					| (l == 1 ? 0 : (buf.charAt(1) & 0xf0) >> 4)));
			out.append(l > 1 ? BASE64_ENC.charAt((buf.charAt(1) & 0x0f) << 2
					| (l == 2 ? 0 : (buf.charAt(2) & 0xc0) >> 6)) : '=');
			out.append(l > 2 ? BASE64_ENC.charAt(buf.charAt(2) & 0x3f) : '=');
		}
		return out.toString();
	}
}

 

 

其中包含httpclient的使用的类:

package org.osmdroid.contributor;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.osmdroid.contributor.util.RecordedGeoPoint;
import org.osmdroid.contributor.util.RecordedRouteGPXFormatter;
import org.osmdroid.contributor.util.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GpxToPHPUploader {

	private static final Logger logger = LoggerFactory.getLogger(GpxToPHPUploader.class);

	protected static final String UPLOADSCRIPT_URL = "http://www.PLACEYOURDOMAINHERE.com/anyfolder/gpxuploader/upload.php";

	/**
	 * This is a utility class with only static members.
	 */
	private GpxToPHPUploader() {
	}

	public static void uploadAsync(final ArrayList<RecordedGeoPoint> recordedGeoPoints) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					if (!Util.isSufficienDataForUpload(recordedGeoPoints))
						return;

					final InputStream gpxInputStream = new ByteArrayInputStream(
							RecordedRouteGPXFormatter.create(recordedGeoPoints).getBytes());
					final HttpClient httpClient = new DefaultHttpClient();

					final HttpPost request = new HttpPost(UPLOADSCRIPT_URL);

					// create the multipart request and add the parts to it
					final MultipartEntity requestEntity = new MultipartEntity();
					requestEntity.addPart("gpxfile", new InputStreamBody(gpxInputStream, ""
							+ System.currentTimeMillis() + ".gpx"));

					httpClient.getParams().setBooleanParameter("http.protocol.expect-continue",
							false);

					request.setEntity(requestEntity);

					final HttpResponse response = httpClient.execute(request);
					final int status = response.getStatusLine().getStatusCode();

					if (status != HttpStatus.SC_OK) {
						logger.error("GPXUploader", "status != HttpStatus.SC_OK");
					} else {
						final Reader r = new InputStreamReader(new BufferedInputStream(response
								.getEntity().getContent()));
						// see above
						final char[] buf = new char[8 * 1024];
						int read;
						final StringBuilder sb = new StringBuilder();
						while ((read = r.read(buf)) != -1)
							sb.append(buf, 0, read);

						logger.debug("GPXUploader", "Response: " + sb.toString());
					}
				} catch (final Exception e) {
					// logger.error("OSMUpload Error", e);
				}
			}
		}).start();
	}
}

 

 

 

分享到:
评论

相关推荐

    MIF 文件读取,简单的GIS系统,附带MIF文件

    MIF(MapInfo Interchange Format)文件是MapInfo公司的一种数据交换格式,常用于地理信息系统(GIS)中的地图数据存储。这种文件格式包括两个部分:MIF(MapInfo Interchange Format)文件,用于描述几何形状;MIFF...

    Flex文件上传(某GIS系统,我负责的文件上传部分)

    Flex文件上传技术是基于Adobe Flex框架实现的一种交互式文件上传方式,常用于GIS(Geographic Information System,地理信息系统)这样的应用中,以便用户能够方便地上传地理数据、地图图像等文件。在我负责的GIS...

    GIS 读SHAPE文件

    在GIS中,SHAPE文件格式是一种广泛用于存储矢量地理数据的标准格式,由Esri公司开发。SHAPE文件通常包括三个主要组成部分:`.shp`、`.shx`和`.dbf`。 1. `.shp` 文件: `.shp`文件是SHAPE文件的核心部分,它包含了...

    gis学习文档gis学习文档gis学习文档

    压缩包中的“book”可能是一个包含GIS教程、案例分析或者参考书籍的文件,读者可以通过阅读这些资料深入学习GIS知识,提升专业技能。在学习过程中,应结合实际案例和练习,理论联系实际,才能更好地掌握GIS并将其...

    CAD文件转入GIS中投影坐标设置方法.pdf

    在水土保持工作中,常常需要处理CAD和GIS两种不同类型的文件。CAD(计算机辅助设计)文件主要用于制图和设计工作,而GIS(地理信息系统)文件则用于存储和分析地理信息。随着信息化的发展,GIS软件在地理信息处理中...

    GIS 演示,对SHP文件,操作,浏览、放大、缩小、查询-GIS .rar

    在这个“GIS演示,对SHP文件,操作,浏览、放大、缩小、查询-GIS.rar”压缩包中,包含了一个关于如何使用GIS进行SHP文件操作的演示。 SHP文件是ESRI(Environmental Systems Research Institute)公司开发的一种...

    四川地图shp文件 shp格式,gis添加使用

    对于GIS新手来说,这样的文档尤其有价值,因为他们可以通过阅读这份文档来学习如何将这些SHP文件整合到自己的GIS项目中。 总的来说,这个压缩包提供了一个全面的四川省地理空间数据集,适用于各种GIS应用,如城市...

    GIS各种文件说明

    在GIS领域中,数据通常以特定的文件格式存在,以便于处理和交流。以下是对给定文件中涉及的一些GIS文件格式的详细说明: 1. **ARC_E00.RTF** - 这个文件可能是关于ARC/E00格式的说明。ARC/E00是由Esri开发的一种二...

    GIS(icon)图标文件

    标题中的“GIS(icon)图标文件”可能包含一系列专为GIS应用程序设计的图标资源,这些图标覆盖了不同领域的功能,如: 1. **标准图标**:这类图标通常包括基础的地图操作,如放大、缩小、全图显示、定位等,以及...

    vc++读取MIF格式文件(GIS开发)

    在GIS(地理信息系统)开发中,MIF(MapInfo Interchange Format)文件是一种常见的矢量数据格式,由MapInfo公司创建并广泛用于数据交换。MIF文件与Mid(MIF的对应文字描述文件)文件一起使用,存储地理空间数据,如...

    全国省市县gis地图shp,xml,shx,dbf文件

    在标题和描述中提到的“全国省市县gis地图shp,xml,shx,dbf文件”是GIS数据的一种常见表示形式,它们构成了GIS数据的基础要素。 1. **SHP文件**:SHP(Shapefile)是ESRI公司开发的一种矢量地理数据格式,用于...

    osmdroid 加载geopackage离线底图

    通常,这可以通过在build.gradle文件中添加osmdroid依赖来实现。例如: ```groovy dependencies { implementation 'org.osmdroid:osmdroid-android:6.2.0' } ``` 接下来,你需要创建一个`TileSourceFactory`实例...

    流行GIS系统资料交换说明文件

    流行GIS系统资料交换说明文件,说明国外主流GIS软件间的资料交换规则。

    GIS中shp文件修复工具

    在GIS中,shp文件是一种常见的矢量数据格式,用于存储地理特征,如点、线、多边形等。然而,由于各种原因,如不当操作、磁盘错误或软件故障,shp文件可能会损坏,导致数据丢失或无法正常读取。在这种情况下,"GIS中...

    全国主要公路铁路gis地图shp,xml,shx,dbf文件

    在这个压缩包中,我们有全国主要公路铁路的GIS地图数据,分别以shp、xml、shx和dbf四种文件格式提供。 1. **shp文件**:这是GIS领域中最常见的矢量数据格式,它包含了地图对象的几何形状和属性信息。公路和铁路的...

    北京shp地图文件(cpg/dbf)包含铁路河流大厦gis

    标题中的“北京shp地图文件(cpg/dbf)包含铁路河流大厦gis”指的是一个地理信息系统(GIS)数据集,该数据集专用于北京市。SHP文件是Esri公司的ArcGIS软件广泛使用的空间数据格式,它包含了地理空间的几何信息(如点...

    GIS平台需求招标文件

    GIS平台需求招标文件的核心关注点在于BIM(建筑信息模型)与GIS(地理信息系统)的集成,特别是对于ArcGIS平台的兼容性和扩展性。招标文件强调了以下关键知识点: 1. **BIM集成**:BIM技术需支持直接读取Revit文件...

    上海市行政区划gis地图文件

    用于gis空间分析,上海市行政区划shp文件,主要包括行政区,街道,河流

    gis加载天地图后,显示shp文件

    在本场景中,“gis加载天地图后,显示shp文件”指的是通过GIS软件将天地图与Shapefile(shp文件)结合,以在地图上呈现特定的地理数据。 Shapefile是Esri公司开发的一种广泛使用的矢量地理数据格式,它包含了点、线...

    gis shp文件浏览工具

    在GIS中,SHP文件(Shapefile)是一种广泛使用的矢量数据格式,用于存储地理空间特征,如点、线、多边形等几何对象。SHP文件通常包含多个关联文件,如SHX(索引文件)、DBF(属性数据文件)和PRJ(投影信息文件)等...

Global site tag (gtag.js) - Google Analytics