package org.androad.osm.util;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.osmdroid.util.GeoPoint;
/**
*
* @author Nicolas Gramlich
*
*/
public class CoordinatesExtractor {
// ===========================================================
// Constants
// ===========================================================
private static final Extractor[] EXTRACTORS = new Extractor[]{
new Extractor(
Pattern.compile("^\\s*\\-?[0-9]+\\.[0-9]+\\s*\\-?[0-9]+\\.[0-9]+\\s*$"),
new ExtractorMethod(){
@Override
public GeoPoint extract(final String in) {
final StringTokenizer st = new StringTokenizer(in, " ");
if(st.countTokens() != 2) {
throw new IllegalArgumentException();
}
final int latE6 = (int)(1E6 * Double.parseDouble(st.nextToken()));
final int lonE6 = (int)(1E6 * Double.parseDouble(st.nextToken()));
return new GeoPoint(latE6, lonE6);
}
}),
new Extractor(
Pattern.compile("^\\s*\\-?[0-9]+\\.[0-9]+\\s*,\\s*\\-?[0-9]+\\.[0-9]+\\s*$"),
new ExtractorMethod(){
@Override
public GeoPoint extract(final String in) {
final StringTokenizer st = new StringTokenizer(in, ", ");
if(st.countTokens() != 2) {
throw new IllegalArgumentException();
}
final int latE6 = (int)(1E6 * Double.parseDouble(st.nextToken()));
final int lonE6 = (int)(1E6 * Double.parseDouble(st.nextToken()));
return new GeoPoint(latE6, lonE6);
}
}),
new Extractor(
Pattern.compile("^\\s*\\-?[0-9]+,[0-9]+\\s*\\-?[0-9]+\\,[0-9]+\\s*$"),
new ExtractorMethod(){
@Override
public GeoPoint extract(final String in) {
final StringTokenizer st = new StringTokenizer(in, " ");
if(st.countTokens() != 2) {
throw new IllegalArgumentException();
}
final int latE6 = (int)(1E6 * Double.parseDouble(st.nextToken().replace(',', '.')));
final int lonE6 = (int)(1E6 * Double.parseDouble(st.nextToken().replace(',', '.')));
return new GeoPoint(latE6, lonE6);
}
})
};
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public static GeoPoint match(final String in){
for (final Extractor e : EXTRACTORS){
final Matcher m = e.mPattern.matcher(in);
if(m.find()){
try{
return e.mExtractorMethod.extract(m.group());
}catch(final Throwable t){ /* Nothing */ }
}
}
return null;
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
protected static interface ExtractorMethod {
public GeoPoint extract(final String in) throws IllegalArgumentException;
}
protected static class Extractor {
// ===========================================================
// Fields
// ===========================================================
private final Pattern mPattern;
private final ExtractorMethod mExtractorMethod;
// ===========================================================
// Constructors
// ===========================================================
public Extractor(final Pattern pattern, final ExtractorMethod extractorMethod) {
this.mPattern = pattern;
this.mExtractorMethod = extractorMethod;
}
}
}