gpt4 book ai didi

java - 在 map 上显示线串的方向 - 在 map 上自动缩放

转载 作者:行者123 更新时间:2023-11-30 10:27:39 26 4
gpt4 key购买 nike

我有这段代码,它在 map 上绘制了一个线串,它是用户提供的 2 个坐标点的轨迹。

public class Quickstart {

public static void main(String[] args) throws Exception {
// display a data store file chooser dialog for shapefiles
File file = JFileDataStoreChooser.showOpenFile("shp", null);
if (file == null) {
return;
}

FileDataStore store = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource featureSource = store.getFeatureSource();

GeometryFactory gf = JTSFactoryFinder.getGeometryFactory();

double latitude, longitude, latitudeDest, longitudeDest;
Scanner reader = new Scanner(System.in);
reader.useLocale(Locale.US);
System.out.println("Enter reference longitude and latitude:\n");
longitude = reader.nextDouble();
latitude = reader.nextDouble();
System.out.println("Enter destination longitude and latitude:\n");
longitudeDest = reader.nextDouble();
latitudeDest = reader.nextDouble();
reader.close();

final String EPSG4326 = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\"," +
"\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\", " +
"0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
CoordinateReferenceSystem crs = CRS.parseWKT(EPSG4326);


Point start = gf.createPoint(new Coordinate(longitude, latitude));
Point end = gf.createPoint(new Coordinate(longitudeDest, latitudeDest));

GeodeticCalculator gc = new GeodeticCalculator(crs);
gc.setStartingPosition(JTS.toDirectPosition(start.getCoordinate(), crs));
gc.setDestinationPosition(JTS.toDirectPosition(end.getCoordinate(), crs));

// Calculate distance between points
double distance = gc.getOrthodromicDistance();

int totalmeters = (int) distance;
int km = totalmeters / 1000;
int meters = totalmeters - (km * 1000);
float remaining_cm = (float) (distance - totalmeters) * 10000;
remaining_cm = Math.round(remaining_cm);
float cm = remaining_cm / 100;

System.out.println("Distance = " + km + "km " + meters + "m " + cm + "cm");

Coordinate[] coordinates = {start.getCoordinate(), end.getCoordinate()};
LineString line = gf.createLineString(coordinates);

SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("TwoDistancesType");
builder.setCRS(DefaultGeographicCRS.WGS84);
//builder.add("start", Point.class);
//builder.add("end", Point.class);
builder.add("line", LineString.class);
// build the type
final SimpleFeatureType TYPE = builder.buildFeatureType();

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
featureBuilder.add(line);

SimpleFeature feature = featureBuilder.buildFeature(null);
DefaultFeatureCollection featureCollection = new DefaultFeatureCollection("internal", TYPE);
featureCollection.add(feature);

// Create style for the line
//Style style = SLD.createSimpleStyle(TYPE, Color.red);
Style style = SLD.createLineStyle(Color.red, 2.0f);
Layer layer = new FeatureLayer(featureCollection, style);

// Create style for the file
Style shpStyle = SLD.createSimpleStyle(TYPE, Color.blue);
Layer shpLayer = new FeatureLayer(featureSource, shpStyle);

// Create a map content and add our shapefile to it
MapContent map = new MapContent();
map.setTitle("TEST");
map.addLayer(layer);
map.addLayer(shpLayer);

// Now display the map
JMapFrame.showMap(map);


}

我有两个问题:

1) 如何显示线的方向?从起点到终点?

2)当你运行程序看到 map 时,你必须手动搜索线串(红线)然后缩放到 map 才能找到它。有没有办法自动缩放到线(坐标) map 何时出现?

最佳答案

对于样式,您需要类似 SLD 描述的东西 here ,代码变成:

    // Create style for the line
// Style style = SLD.createSimpleStyle(TYPE, Color.red);
org.geotools.styling.Style style = SLD.createLineStyle(Color.red, 2.0f);
StyleBuilder sb = new StyleBuilder();
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
PointSymbolizer point = sb.createPointSymbolizer();
Mark mark = sb.createMark("shape://oarrow");
mark.setFill(sb.createFill(Color.RED));
mark.setStroke(sb.createStroke(Color.red));

Graphic graphic = sb.createGraphic(null, mark, null);
graphic.setRotation(ff.function("endAngle", ff.property("line")));
point.setGraphic(graphic);

point.setGeometry(ff.function("endpoint", ff.property("line")));

Rule rule = sb.createRule(point);
style.getFeatureTypeStyles()[0].addRule(rule );
Layer layer = new FeatureLayer(featureCollection, style);

放大线只是将 map 视口(viewport)设置为线的边界的情况:

    MapViewport viewport = new MapViewport(featureCollection.getBounds());
map.setViewport(viewport );

如果您愿意,您可能希望将这些范围扩大一点(10%?),以便您也能看到周围的环境。

enter image description here

编辑

要避免 StyleBuilder 中弃用的方法,您可以使用:

style.featureTypeStyles().get(0).rules().add(rule);

扩展边界框只是向信封添加一些距离的情况:

    ReferencedEnvelope bounds = featureCollection.getBounds();
double delta = bounds.getWidth()/20.0; //5% on each side
bounds.expandBy(delta );
MapViewport viewport = new MapViewport(bounds);
map.setViewport(viewport );

关于java - 在 map 上显示线串的方向 - 在 map 上自动缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45235244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com