/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jtstest.util.io; import org.locationtech.jts.geom.*; import org.locationtech.jts.io.*; /** * Reads a {@link Geometry} from a string which is in either WKT or WKBHex format * * @author Martin Davis * @version 1.7 */ public class WKTOrWKBReader { private static boolean isHex(String str, int maxCharsToTest) { for (int i = 0; i < maxCharsToTest && i < str.length(); i++) { char ch = str.charAt(i); if (! isHexDigit(ch)) return false; } return true; } private static boolean isHexDigit(char ch) { if (Character.isDigit(ch)) return true; char chLow = Character.toLowerCase(ch); if (ch >= 'a' && ch <= 'f') return true; return false; } private static final int MAX_CHARS_TO_CHECK = 6; private GeometryFactory geomFactory; private WKTReader wktReader; private WKBReader wkbReader; public WKTOrWKBReader() { this(new GeometryFactory()); } public WKTOrWKBReader(GeometryFactory geomFactory) { wktReader = new WKTReader(geomFactory); wkbReader = new WKBReader(geomFactory); } public Geometry read(String geomStr) throws ParseException { String trimStr = geomStr.trim(); if (isHex(trimStr, MAX_CHARS_TO_CHECK)) return wkbReader.read(WKBReader.hexToBytes(trimStr)); return wktReader.read(trimStr); } }