在地图上显示线串的方向-在地图上自动缩放 [英] Show direction of linestring on map - auto zoom on map

查看:72
本文介绍了在地图上显示线串的方向-在地图上自动缩放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have this code, which plots on a map a linestring which is the track of 2 coordinate points that the user supplies.

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);


}

我有2个问题:

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

1) How can I show the direction of the line?From start point to end?

2)运行程序并查看地图时,必须手动搜索线串(红线),然后缩放到地图才能找到它.有没有一种方法可以自动缩放到该线(坐标)何时显示地图?

2) When you run the program and see the map , you must manually search for the linestring(red line) and then zoom to map in order to find it.Is there a way to automatically zoom to the line (the coordinates) when the map appears?

推荐答案

对于样式,您需要类似SLD所述的内容

For the style you need something like the SLD described here, in code that becomes:

    // 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);

放大到线中只是将地图视口设置为线的边界的一种情况:

Zooming into the line is just a case of setting the map viewport to the bounds of the line:

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

如果您愿意,可以将边界扩大一点(10%?),以便您也可以看到周围的环境.

If you want you might want to grow those bounds by a little (10%?) so that you can see the surroundings too.

编辑

要避免使用StyleBuilder中不推荐使用的方法,可以使用:

To avoid the deprecated methods in StyleBuilder you can use:

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

扩展边界框只是在信封上增加一些距离的一种情况:

Expanding the bounding box is just a case of adding some distance to the envelope:

    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 );

这篇关于在地图上显示线串的方向-在地图上自动缩放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆