DE:Batch Upload

From OpenStreetMap Wiki
Jump to navigation Jump to search

Die Grundidee ist es, GPX-Dateien mittels Skripten, — ohne dafür das Web-Interface zu benutzen, an den Server zu übertragen.

(Das ist eine Übersetzung des Artikels Batch_Upload)

Tools

Tar oder Zip

Am einfachsten ist es, die GPX-Datei zu komprimieren (.zip oder .tar.gz) und diese dann mittels des normalen upload-Formulares an den Server zu übergeben. Nachteilig an dieser Methode ist, daß lediglich eine Beschreibung für den gesamten Dateisatz möglich ist und dann deshalb nur als einzelner trace im upload log erscheint.

Perl

via des API laden

Mit folgendem Code kann eine GPX-Datei an das API übergeben werden:

use HTTP::Request::Common;
use LWP::UserAgent;

$ua=LWP::UserAgent->new;
$ua->credentials('www.openstreetmap.org:80','Web Password',$yourusername, $yourpassword);

$response=$ua->request(POST 'http://www.openstreetmap.org/api/0.5/gpx/create',
        Content_Type => 'form-data',
	Content	     => [ file        => [$filename],
			  description => $description,
			  tags        => $tags,
			  public      => "1" ] );

if ($response->code==200) {
	# yay, success
} else {
	# boo, failure
}

Daraus kann man ein einfaches Stapelverarbeitungsprogramm erstellen.

ohne dem API laden

The old Perl batch uploaders mentioned below used to upload using the standard web form because there was, at the time, no API method.

Das Perl-Skript demonstriert, wie eine GPX-Datei automatisch zu OpenStreetMap übertragen werden kann. Das ist nützlich, weil die aktuelle OSM API keine andere Möglichkeit bietet, dies zu tun.

Ich verwende das Skript, um aus den Daten meiner PostgreSQL Datenbank eine GPX-Datei zu extrahieren und diese an OSM zu übertragen. Ich hoffe, daß die Kommentare im Skript aureichend sind, damit du es an deine Gegebenheiten anpassen kannst.

Beachte: Anpassungen im Skript an deine OSM Zugangsdaten (login und password) sind erforderlich. Ferner können mit der GPX-Datei die Felder tags und public übertragen werden.

Im Skript wird das Perl-Modul LWP::UserAgent benützt. Es vereinfacht die HTTP-Interaktion beispielsweise hinsichtlich Formularverarbeitung, empfangen und speichern von Cookies, Dateiversand an Server, wesentlich.

Niccolo

verschoben nach svn /applications/utils/gps-tracks/gpx-batch-upload/ --Deelkar (talk) 19:17, 16 April 2007 (BST)

Eine neue Version des Skript habe ich auf der Seite talk page zur verfügung gestellt. In dieser Version ist die neue Seite berücksichtigt und das Skript ist nun unter die GPL-Lizenz gestellt. Deelkar, please move it to svn if you like. --Niccolo 20:59, 5 October 2007 (BST)

Java

It is only one java class (needs compiling) and it allows to pass all uploaded files to other command line apps (using xargs).

Feedback is welcome: Christof Dallermassl

Usage

java GpxUpload <description> <tags> <files*>

Osm username and password can be defined as system properties by -Dusername=<username> and -Dpassword=<password> or if not given, josm's preference file is read. Any messages are printed to stderror, only the filename that was sent successfully is printed to stdout, so you may use the output of this program in a pipe for other calls.

Beispiele

java GpxUpload "taking a ride in Graz, Austria" "graz austria" gpxfile.gpx
java GpxUpload "taking a ride in Graz, Austria" "graz austria" gpxfiles*.gpx | xargs -i mv '{}' /home/cdaller/targetdir

Download

http://svn.openstreetmap.org/applications/utils/gps-tracks/jgpxupload/

C/libcurl

Der folgende Quellcode funktionert mit den Bibliotheken glib und libcurl.

void osm_traces_upload_file(const char *user, const char *password,
        const char *file, const char *filename, const char *description,
        const char *tags, gboolean public)
{
    CURL *curl;
    CURLcode res;
    char curl_error_buffer[CURL_ERROR_SIZE];
    struct curl_slist *headers = NULL;
    struct curl_httppost *post=NULL;
    struct curl_httppost *last=NULL;
    gchar *public_string;
    char *base_url = "http://www.openstreetmap.org/api/0.5/gpx/create";
    gchar *user_pass = get_login();

    /* Init CURL */
    curl = curl_easy_init();

    /* Filling the form */
    curl_formadd(&post, &last,
            CURLFORM_COPYNAME, "description",
            CURLFORM_COPYCONTENTS, description, CURLFORM_END);
    curl_formadd(&post, &last,
            CURLFORM_COPYNAME, "tags",
            CURLFORM_COPYCONTENTS, tags, CURLFORM_END);
    if (public)
        public_string = "1";
    else
        public_string = "0";
    curl_formadd(&post, &last,
            CURLFORM_COPYNAME, "public",
            CURLFORM_COPYCONTENTS, public_string, CURLFORM_END);
    curl_formadd(&post, &last,
            CURLFORM_COPYNAME, "file",
            CURLFORM_FILE, file,
            CURLFORM_FILENAME, filename,
            CURLFORM_CONTENTTYPE, "text/xml", CURLFORM_END);

    /* Prepare request */
    /* As explained in http://wiki.openstreetmap.org/index.php/User:LA2 */
    /* Expect: header seems to produce incompatibilites between curl and httpd */
    headers = curl_slist_append(headers, "Expect: ");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
    curl_easy_setopt(curl, CURLOPT_URL, base_url);
    curl_easy_setopt(curl, CURLOPT_USERPWD, user_pass);
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &curl_error_buffer);

    /* Execute request */
    res = curl_easy_perform(curl);
    if (res == CURLE_OK)
    {
        long code;
        res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
        if (res == CURLE_OK)
        {
            g_debug("received valid curl response: %ld", code);
            if (code != 200)
                g_warning("failed to upload data: HTTP response is %ld", code);
        }
        else
            g_error("curl_easy_getinfo failed: %d", res);
    }
    else
        g_warning("curl request failed: %s", curl_error_buffer);

    /* Memory */
    g_free(user_pass); user_pass = NULL;
    curl_formfree(post);
    curl_easy_cleanup(curl); 
}

CURL

curl -u user:password \
     -H "Expect: " \
     -F "file=@"file.gpx \
     -F description=description \
     -F tags=tags \
     -F public=1 \
     -F visibility=public http://www.openstreetmap.org/api/0.6/gpx/create

file.gpx ist dein Dateibezeichner; description, tags, public als auch user und password mußt du entsprechend deiner Daten anpassen.

Wenn die Traces bereits tags und Beschreibung enthalten, kann man folgendes Bash-Skript benutzen (man benötigt zusätzlich xmlstarlet):

#!/bin/bash
FILE=$1
getval() {
	xmlstarlet sel -N gpx=http://www.topografix.com/GPX/1/1 -t -v "//gpx:$1/text()" $FILE
}

curl -u $USER:$PASSWORD \
     -H "Expect: " \
     -F "file=@$FILE" \
     -F "description=$(getval desc)" \
     -F "tags=$(getval keywords)" \
     -F public=1 \
     -F visibility=public http://www.openstreetmap.org/api/0.6/gpx/create

Aufruf dann, z.B.: USER=xyz PASSWORD=xyz bash upload.sh file.gpx

Technics

Cf. API documentation and precisely how to create gpx file.