在地图上显示连接点的线 - 接收空地图

Posted

技术标签:

【中文标题】在地图上显示连接点的线 - 接收空地图【英文标题】:Show line on map which connects points - receiving an empty map 【发布时间】:2017-12-26 03:23:33 【问题描述】:

我想在地图上绘制一条连接 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();

      // ask for current and destination positions
      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");

        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("TwoDistancesType");
        builder.setCRS(DefaultGeographicCRS.WGS84);
        builder.add("location", Point.class);

        // build the type
        final SimpleFeatureType TYPE = builder.buildFeatureType();

        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
        featureBuilder.add(start);
        //featureBuilder.add(end);

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

        Style style = SLD.createSimpleStyle(TYPE, Color.red);
        Layer layer = new FeatureLayer(featureCollection, style);

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

        map.addLayer(layer);

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


    


我有两个问题:

1) 我无法向featureBuilder 添加第二个功能。它不允许。它显示Can handle 1 attributes only, index is 1

那么,我该如何画一条线呢?

2) 使用上面的代码,我收到:

org.geotools.renderer.lite.StreamingRenderer fireErrorEvent SEVERE: The scale denominator must be positive
java.lang.IllegalArgumentException: The scale denominator must be positive

------- 更新 ------------

在@Michael 为第一个问题提供的解决方案之后,现在我不再收到关于分母的错误,但我收到了一个空地图(空白)。

----- 根据@iant 建议更新----------------

所以,我尝试了这个。创建了一个保存点坐标(开始和结束)的坐标,然后用这些坐标创建了一个线串并将其添加到特征构建器。

        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("TwoDistancesType");
        builder.setCRS(DefaultGeographicCRS.WGS84);

        builder.add("line", LineString.class); //added a linestring class


        final SimpleFeatureType TYPE = builder.buildFeatureType();

        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);

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

即使我正在加载地图 (countries.shp),它也会向我显示一个带有红线的空白区域。

------解决方案-------------

好的,所以解决方案是(感谢@iants cmets):

样式样式 = SLD.createLineStyle(Color.red, 2.0f); 图层 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);

现在你在蓝色地图上有一条红线!

【问题讨论】:

【参考方案1】:

您需要从您的点创建一个 LineString,然后将其存储在您的要素中。

然后您应该获得正确的比例,但您可能需要先向地图添加一些其他数据,例如海岸线。快速入门教程可以向您展示如何做到这一点。

【讨论】:

:嗯,对!我这样做了,但我收到了一张空白地图(白色),上面有一条红线(我更新了关于代码的帖子)。谢谢! 我看不到您在地图中添加国家/地区图层的位置。 :File file = JFileDataStoreChooser.showOpenFile("shp", null);.Herem 我在运行应用程序时打开了countries.shp。就像快速入门一样。然后`Layer layer = new FeatureLayer(featureCollection, style);, and map。 addLayer(layer);`. 你需要一个国家图层和一个线路图层,然后你可以给它们不同的样式来区分它们 好的,你能给我举个例子吗?如何创建国家图层?什么样的样式?createSimpleStylecreateLineStyle?以及如何将两者都添加到地图中?谢谢。【参考方案2】:

免责声明:我从未使用过地理工具。

查看the source code of SimpleFeatureBuilderadd 调用set 在以下情况下会引发该错误:

if(index >= values.length)
    throw new ArrayIndexOutOfBoundsException("Can handle "
    + values.length + " attributes only, index is " + index);

values 在此处填充:

values = new Object[featureType.getAttributeCount()];

所以很明显,这个问题是因为你的 Type 只有一个属性。将其更改为有两个:

SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("TwoDistancesType");
builder.setCRS(DefaultGeographicCRS.WGS84);
builder.add("start", Point.class);
builder.add("end",   Point.class);

【讨论】:

关于您的第二个问题,您需要告诉我们发生在哪一行。发布完整的堆栈跟踪。 好的,谢谢!我错过了。现在,我已经向构建器添加了 2 个类,它不再给我第二条消息。但是,它只显示了一个空地图(空白)。请注意,我想绘制一条连接 2 个点的线。 (赞成) 问题出在渲染器上。我想知道您是否需要设置视口...尝试将您的地图替换为 MapContext map = new DefaultMapContext(); 它已被弃用,但最好看看这是否会改变任何东西 DefaultMapContext(); 已弃用。在 geotools 快速入门中,它使用 new MapContent(); 并且运行良好(它显示了地图)。但它并没有改变任何东西.. 是的,我知道。嗯,我阅读的快速入门使用 Context 但足够公平。我调试的方法是删除尽可能多的代码并逐渐重新引入它,直到出现错误。从没有图层的地图开始,然后逐渐将其余的添加回去。

以上是关于在地图上显示连接点的线 - 接收空地图的主要内容,如果未能解决你的问题,请参考以下文章

百度地图多点有向连接

百度地图在点击到哪去下方显示网络连接失败啥意思?

Java后台如何获取百度地图上标注的区域范围

如何利用百度地图JSAPI画带箭头的线

本地数据库经纬度 调用百度地图API 在百度地图上显示 用啥方案实现的问题。。

百度地图手机下载离线地图的时候总是提示网络异常