Для всех, у кого такой же сценарий, я нашел библиотеку с открытым исходным кодом под названием JTS Topology Suite. , который может анализировать строки WKT в Java. Базовый пример из моего приложения выглядит так:
WKTReader wktReader = new WKTReader();
Geometry geometry = wktReader.read(routeResponse.get(yourWKTMultilineString);
Затем вы можете перебирать отдельные строки следующим образом:
for(int lineIndex = 0; lineIndex < geometry.getNumGeometries(); lineIndex++){
Geometry lineGeometry = geometry.getGeometryN(lineIndex);
//... other stuff
}
При необходимости вы можете получить индивидуальные координаты каждой линии следующим образом:
Coordinate[] lineCoordinates = lineGeometry.getCoordinates();
Обратите внимание, что приведенное выше является очень общим примером, который следует за кодом OP.
В конечном счете, это может избавить других от необходимости создавать собственный синтаксический анализатор WKT.
Специфический код Nutiteq:
В моем случае мне нужно было нарисовать многострочную строку в виде векторного слоя на карта Nutiteq. Я понимаю, что ОП спрашивал об API-интерфейсе карты Google для Android, однако, если какой-либо читатель также использует Nutiteq (или если этот алгоритм актуален для других API-интерфейсов карт), это код, специфичный для nutiteq:
geomLayer.clear(); // clear the old vector data
Projection projection = geomLayer.getProjection(); // Map's projection type
// Iterate through the individual lines of our multi-line geometry
for(int lineIndex = 0; lineIndex < geometry.getNumGeometries(); lineIndex++){
Geometry lineGeometry = geometry.getGeometryN(lineIndex);
ArrayList<MapPos> linePositions = new ArrayList<MapPos>(lineGeometry.getCoordinates().length);
// Iterate through this line's coordinates
for(Coordinate coordinate : lineGeometry.getCoordinates()){
// My server returns coordinates in WGS84/EPSG:4326 projection while the map
// uses EPSG3857, so it is necessary to convert before adding to the
// array list.
MapPos linePosition = new MapPos(projection.fromWgs84(coordinate.x, coordinate.y));
linePositions.add(linePosition);
}
// Finally, add the line data to the vector layer
Line line = new Line(linePositions, new DefaultLabel("some label"), lineStyle), null);
geomLayer.add(line);
}
Обратите внимание, что lineStyleSet
и geomLayer
созданы ранее в onCreate
активности и могут быть исследованы здесь. geomLayer
прост; вот мой lineStyleSet
:
Обратите внимание на lineStyle, он был создан ранее и сохраняется как переменная экземпляра, например:
Bitmap lineMarker = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.line);
this.lineStyleSet = new StyleSet<LineStyle>();
LineStyle lineStyle = LineStyle.builder().setLineJoinMode(LineStyle.NO_LINEJOIN).setWidth(0.2f).setColor(Color.RED).setBitmap(lineMarker).build();
lineStyleSet.setZoomStyle(minZoom, lineStyle);
person
Paul Richter
schedule
13.02.2014