package org.androad.sys.ors.lus.openrouteservice;
import java.util.Formatter;
import java.util.Locale;
import junit.framework.Assert;
import org.osmdroid.util.GeoPoint;
import org.androad.sys.ors.adt.lus.Country;
import org.androad.sys.ors.adt.lus.ICountrySubdivision;
import org.androad.sys.ors.adt.lus.ReverseGeocodePreferenceType;
import org.androad.sys.ors.util.Util;
import org.androad.sys.ors.util.constants.ORSXMLConstants;
import android.content.Context;
public class OpenRouteServiceLUSRequestComposer implements ORSXMLConstants {
/**
* <pre><?xml version="1.0" encoding="UTF-8"?>
* <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1">
* <xls:RequestHeader/>
* <xls:Request methodName="ReverseGeocodeRequest" requestID="123456789" version="1.1">
* <xls:ReverseGeocodeRequest>
* <xls:Position>
* <gml:Point srsName="4326">
* <gml:pos>8.7520131 49.4515134</gml:pos>
* </gml:Point>
* </xls:Position>
* <xls:ReverseGeocodePreference>StreetAddress</xls:ReverseGeocodePreference>
* </xls:ReverseGeocodeRequest>
* </xls:Request>
* </xls:XLS></pre>
*/
public static String reverseGeocode(final Context ctx, final GeoPoint aGeoPoint, final ReverseGeocodePreferenceType aPreferenceType){
Assert.assertNotNull(aGeoPoint);
Assert.assertNotNull(aPreferenceType);
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
sb.append(XML_BASE_TAG_UTF8)
.append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_OPEN);
f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx));
sb.append(XLS_REQUESTMETHOD_REVERSEGEOCODE_TAG_OPEN)
.append(XLS_REVERSEGEOCODEREQUEST_TAG_OPEN);
sb.append(XLS_POSITION_TAG_OPEN)
.append(GML_POINT_TAG_OPEN);
f.format(GML_POS_TAG, aGeoPoint.getLongitudeE6() / 1E6, aGeoPoint.getLatitudeE6() / 1E6);
sb.append(GML_POINT_TAG_CLOSE)
.append(XLS_POSITION_TAG_CLOSE);
f.format(XLS_REVERSEGEOCODEPREFERENCE_TAG, aPreferenceType.mDefinedName);
sb.append(XLS_REVERSEGEOCODEREQUEST_TAG_CLOSE)
.append(XLS_REQUESTMETHOD_REVERSEGEOCODE_TAG_CLOSE)
.append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_CLOSE);
return sb.toString();
}
/**
* <pre><?xml version="1.0" encoding="UTF-8"?>
* <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron"
* xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1">
* <xls:RequestHeader/>
* <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1">
* <xls:GeocodeRequest>
* <xls:Address countryCode="DE">
* <xls:StreetAddress>
* <xls:Street>Mannheimer Strasse</xls:Street>
* </xls:StreetAddress>
* <xls:Place type="Municipality">Schriesheim</xls:Place>
* </xls:Address>
* </xls:GeocodeRequest>
* </xls:Request>
* </xls:XLS></pre>
* @param nat
* @param pCity
* @param pStreetName
* @param pStreetNumber
* @return
*/
public static String createStreetaddressCityRequest(final Context ctx, final Country nat, final ICountrySubdivision pCountrySubdivision, final String pCity, String pStreetName, final String pStreetNumber){
if(pStreetName == null) {
pStreetName = ""; // empty streetname is like searching for the town only.
}
Assert.assertNotNull(nat);
Assert.assertTrue(pStreetNumber == null || (pStreetNumber != null && pStreetNumber.length() > 0)); // null or at least 1 char
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
appendBaseRequestStart(ctx, nat, sb, f);
sb.append(XLS_STREETADDRESS_TAG_OPEN);
if(pStreetNumber != null){
f.format(XLS_BUILDING_TAG, pStreetNumber);
}
f.format(XLS_STREET_TAG, pStreetName);
sb.append(XLS_STREETADDRESS_TAG_CLOSE);
if(pCountrySubdivision != null){
f.format(XLS_PLACE_COUNTRYSUBDIVISION_TAG, pCountrySubdivision.getAbbreviation());
}
f.format(XLS_PLACE_MUNICIPALITY_TAG, pCity);
appendBaseRequestEnd(sb, f);
return sb.toString();
}
/**
* <pre><xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron"
* xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1">
* <xls:RequestHeader/>
* <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1">
* <xls:GeocodeRequest>
* <xls:Address countryCode="DE">
* <xls:StreetAddress>
* <xls:Street>Mannheimer strasse</xls:Street>
* </xls:StreetAddress>
* <xls:PostalCode>69198</xls:PostalCode>
* </xls:Address>
* </xls:GeocodeRequest>
* </xls:Request>
* </xls:XLS></pre>
* @param nat
* @param pCountrySubdivision
* @param pCity
* @param pStreetName
* @param pStreetNumber
* @return
*/
public static String createStreetaddressPostalcodeRequest(final Context ctx, final Country nat, final ICountrySubdivision pCountrySubdivision, final String pPostalCode, String pStreetName, final String pStreetNumber){
if(pStreetName == null) {
pStreetName = ""; // empty streetname is like searching for the town only.
}
Assert.assertNotNull(nat);
Assert.assertTrue(pStreetNumber == null || (pStreetNumber != null && pStreetNumber.length() > 0)); // null or at least 1 char
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
appendBaseRequestStart(ctx, nat, sb, f);
sb.append(XLS_STREETADDRESS_TAG_OPEN);
if(pStreetNumber != null){
f.format(XLS_BUILDING_TAG, pStreetNumber);
}
f.format(XLS_STREET_TAG, pStreetName);
sb.append(XLS_STREETADDRESS_TAG_CLOSE);
if(pCountrySubdivision != null){
f.format(XLS_PLACE_COUNTRYSUBDIVISION_TAG, pCountrySubdivision);
}
f.format(XLS_POSTALCODE_TAG, pPostalCode);
appendBaseRequestEnd(sb, f);
return sb.toString();
}
/**
* @return xml-request String. i.e.:
* <pre><?xml version="1.0" encoding="UTF-8"?>
* <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron"
* xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1">
* <xls:RequestHeader/>
* <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1">
* <xls:GeocodeRequest>
* <xls:Address countryCode="DE">
* <xls:freeFormAddress>bonn maximilianstrasse</xls:freeFormAddress>
* </xls:Address>
* </xls:GeocodeRequest>
* </xls:Request>
* </xls:XLS></pre>
*/
public static String createFreeformAddressRequest(final Context ctx, final Country nat, final String freeFormAddress){
Assert.assertNotNull(freeFormAddress);
Assert.assertTrue(freeFormAddress.length() > 0);
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
appendBaseRequestStart(ctx, nat, sb, f);
f.format(XLS_FREEFORMADDRESS_TAG, freeFormAddress);
appendBaseRequestEnd(sb, f);
return sb.toString();
}
private static void appendBaseRequestStart(final Context ctx, final Country nat, final StringBuilder sb, final Formatter f){
sb.append(XML_BASE_TAG_UTF8)
.append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_OPEN);
f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx));
sb.append(XLS_REQUESTMETHOD_GEOCODE_TAG_OPEN)
.append(XLS_GEOCODEREQUEST_TAG_OPEN);
if(nat == null) {
f.format(XLS_ADDRESS_TAG_OPEN, Country.UNKNOWN);
} else {
f.format(XLS_ADDRESS_TAG_OPEN, nat.COUNTRYCODE);
}
}
private static void appendBaseRequestEnd(final StringBuilder sb, final Formatter f){
sb.append(XLS_ADDRESS_TAG_CLOSE)
.append(XLS_GEOCODEREQUEST_TAG_CLOSE)
.append(XLS_REQUESTMETHOD_GEOCODE_TAG_CLOSE)
.append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_CLOSE);
}
}