OffRoad Wiki
Offline vector map display ported from OsmAnd
Brought to you by:
christianfoltin,
someone-guy
Hi,
the question: is there a way to connect to a GPS to have a moving map that shows me where I am?
the answer: yes, OffRoad opens a (random) port and I used that with the following script to show the locations inside of a german ICE on my OffRoad instance.
Take the latest version of OffRoad!
The java code to read the port settings and to send the coordinates to OffRoad (pack into bahn.jar):
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.net.InetAddress;
import java.net.Socket;
public class Contact {
public static void main(String[] args) {
new Contact().sendGeoLocation(args);
}
private void sendGeoLocation(String[] pArgs) {
if(pArgs.length != 3) {
System.err.println("Usage: <location_of_port.txt_file> <latitude> <longitude>");
System.exit(1);
}
String portFile = pArgs[0];
if (portFile == null) {
return;
}
// {{{ Try connecting to another running OffRoad instance
if (portFile != null && new File(portFile).exists()) {
try {
BufferedReader in = new BufferedReader(new FileReader(portFile));
String check = in.readLine();
if (!check.equals("b"))
throw new Exception("Wrong port file format");
int port = Integer.parseInt(in.readLine());
int key = Integer.parseInt(in.readLine());
System.out.println("Connecting to port " + port);
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),
port);
DataOutputStream out = new DataOutputStream(
socket.getOutputStream());
System.out.println("Sending key...");
out.writeInt(key);
System.out.println("Connecting to port " + port + ". Done.");
String position = pArgs[1]+":"+pArgs[2]+"\n";
System.out.println("Sending position " + position);
out.writeUTF(position);
// block until its closed
try {
socket.getInputStream().read();
} catch (Exception e) {
}
in.close();
out.close();
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
The go-tool to read the geo location from the ICE and to call the jar file:
package main
import "encoding/json"
import "net/http"
import "fmt"
import "io/ioutil"
import "os/exec"
type Bahn struct {
Connection bool `json:"connection"`
Servicelevel string `json:"servicelevel"`
Internet string `json:"internet"`
Speed int `json:"speed"`
GpsStatus string `json:"gpsStatus"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
ServerTime int64 `json:"serverTime"`
WagonClass string `json:"wagonClass"`
NavigationChange string `json:"navigationChange"`
}
func main() {
// Generated by curl-to-Go: https://mholt.github.io/curl-to-go
resp, err := http.Get("https://iceportal.de/api1/rs/status")
if err != nil {
// handle err
fmt.Println(err)
return
}
body, err := ioutil.ReadAll(resp.Body)
//fmt.Println(body)
var bahn Bahn
json.Unmarshal([]byte(body), &bahn)
fmt.Printf("Latitude: %f, Longitude: %f\n", bahn.Latitude, bahn.Longitude)
cmd := exec.Command("java", "-jar", "bahn.jar", "/home/foltin/.OffRoad/port.txt", fmt.Sprintf("%f", bahn.Latitude), fmt.Sprintf("%f", bahn.Longitude))
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
fmt.Print(err)
}
fmt.Printf("%s\n", stdoutStderr)
defer resp.Body.Close()
}