SimpleGraph-Tutorial/Geo
Revision as of 18:57, 12 February 2019 by Wf (talk | contribs) (→First step: Loading data from Bundesnetzagentur)
OsProject | |
---|---|
id | com.bitplan.simplegraph-tutorial-geo |
state | |
owner | BITPlan |
title | SimpleGraph Geo Tutorial |
url | https://github.com/BITPlan/com.bitplan.simplegraph-tutorial-geo |
version | 0.0.1 |
description | |
date | |
since | |
until |
SimpleGraph Geo Showcase
Openly available Geographic data from different APIs seems to be a good basis for showcasing the SimpleGraph approach.
Charging Stations example
We'd like to gather data on Charging stations from different sources:
- Bundesnetzagentur (Excel File)
- Openstreetmap (API)
- OpenchargeMap (API)
First step: Loading data from Bundesnetzagentur
The ChargingStation Map of Bundesnetzagentur is based on the Date from the Excel file Download
Let's read it with our SimpleGraph-Excel Module.
package com.bitplan.simplegraph.geotutorial;
import static org.junit.Assert.assertEquals;
import java.io.File;
import org.junit.Test;
import com.bitplan.simplegraph.core.SimpleNode;
import com.bitplan.simplegraph.excel.ExcelSystem;
public class TestChargingStations {
boolean debug = true;
/**
* test reading the list of registered german charging stations from
* Bundesnetzagentur
*
* @throws Exception
*/
@Test
public void testBundesnetzagentur() throws Exception {
// The original file has some superfluous sheets and the title row is not
// in the first line so we downloaded and adapted it a bit to avoid to do this in software e.g.
// as outlined in https://stackoverflow.com/questions/1834971/removing-a-row-from-an-excel-sheet-with-apache-poi-hssf
// String url = "https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Energie/Unternehmen_Institutionen/HandelundVertrieb/Ladesaeulen/Ladesaeulenkarte_Datenbankauszug20.xlsx?__blob=publicationFile&v=2";
File excelFile = new File(
"src/test/data/Bundesnetzagentur/Ladesaeulenkarte_Datenbankauszug20.xlsx");
ExcelSystem es = new ExcelSystem();
es.connect();
es.moveTo(excelFile.toURI().toString());
long count = es.g().V().count().next().longValue();
assertEquals(7733, count);
if (debug)
SimpleNode.dumpGraph(es.graph());
//es.g().V().has("sheetname").out("rows").forEachRemaining(v -> {
// SimpleNode.printDebug.accept(v);
// });
}
}
Second step: check data agains OpenChargeMap API
Let's check the result comparing to the entries in the OpenchargeMap API.
http://api.openchargemap.io/v2/poi/?output=json&latitude=50.598&longitude=7.434&maxresults=10
<source lang='java'>
@Test public void testOpenChargeMapApi() throws Exception { ExcelSystem es=this.getBundesnetzAgenturChargingStations(); // number of stations to check int limit=20; // number of stations nearby to get from open chargemap api int maxresults = 3; es.g().V().has("row").limit(limit).forEachRemaining(v -> { if (debug) SimpleNode.printDebug.accept(v); String address = v.property("Adresse").value().toString(); String ziploc = v.property("Postleitzahl Ort").value().toString(); double lat = Double .parseDouble(v.property("Breitengrad [DG]").value().toString()); double lon = Double .parseDouble(v.property("Längengrad [DG]").value().toString()); System.out.println( String.format("%30s %30s %.4f %.4f", ziploc, address, lat, lon)); String apiUrl = String.format(Locale.ENGLISH, "http://api.openchargemap.io/v2/poi/?output=json&latitude=%.4f8&longitude=%.4f&maxresults=10", lat, lon, maxresults); JsonSystem js = new JsonSystem(); try { js.connect(); } catch (Exception e) { fail(e.getMessage()); } js.moveTo(apiUrl);
GraphTraversal<Vertex, Vertex> addressesByDistance = js.g().V() .hasLabel("AddressInfo").order().by("Distance"); assertTrue(addressesByDistance.hasNext()); Vertex av = addressesByDistance.next(); double maxDist = 1.0; Number adistance = (Number) av.property("Distance").value(); Number alat = (Number) av.property("Latitude").value(); Number alon = (Number) av.property("Longitude").value(); // assertTrue(adistance.doubleValue()<maxDist); String azip = av.property("Postcode").value().toString(); String acity = av.property("Town").value().toString(); String aadr = av.property("AddressLine1").value().toString();
System.out.println(String.format("%30s %30s %.4f %.4f: %.3f km", azip + " " + acity, aadr, alat.doubleValue(), alon.doubleValue(), adistance.doubleValue()));
if (debug) { SimpleNode.printDebug.accept(av); SimpleNode.dumpGraph(js.graph()); }
});
}
</source