在地图上显示线串的方向 - 自动缩放地图

2024-04-12

我有这段代码,它在地图上绘制一个线串,它是用户提供的 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)当你运行程序并看到地图时,你必须手动搜索线串(红线),然后缩放到地图才能找到它。有没有一种方法可以在搜索时自动缩放到线(坐标)地图出现?


对于样式,您需要类似 SLD 所描述的内容here https://gis.stackexchange.com/questions/116712/how-do-i-draw-the-arrow-on-the-line-using-sld-of-geoserver,代码变为:

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

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

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

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

EDIT

为了避免不推荐使用的方法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 );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在地图上显示线串的方向 - 自动缩放地图 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • neo4j cypher节点之间的多重关系

    例如 a r gt b 两个节点之间存在多个r 每个r userId都是唯一的 例如 a r R userId user1 gt b a r R userId user2 gt b 对于 a r gt c 也是如此 而情况是a r gt b
  • Mojolicious REST 调用中错误的 HTTP 响应

    我使用的mojolicious应用程序是基于JSON的 即客户端和服务器之间的交互更多的是JSON结构化数据的交换 我正在尝试实现一种标准方法 当在 REST 调用期间发生错误时 使用正确的 HTTP 响应代码来处理错误 实施此类标准的最佳
  • 插入符使用插入符训练对象返回的预测与使用提取的最终模型返回的预测不同

    在拟合模型时我更喜欢使用插入符号 因为它的相对速度和预处理功能 然而 我对它如何做出预测有点困惑 当比较直接从训练对象做出的预测和从提取的最终模型做出的预测时 我看到了非常不同的数字 来自火车对象的预测似乎更准确 library caret
  • 如何执行 CompletableFuture 数组并组合其结果

    我正在研究 Java 8CompletableFutures并阅读 并看到 我应该采用thenCompose代替thenApply 我已将我的代码转换为使用thenCompose但我有一种不正确的感觉 这是我的控制代码 final Comp
  • Spark 和 AWS S3 连接错误:无法通过 Spark-shell 从 S3 位置读取文件

    在下面的 Spark shell 中 我尝试连接到 S3 并加载文件以创建数据帧 spark shell packages com databricks spark csv 2 10 1 5 0 scala gt val sqlContex
  • 哪个 ORM 支持这个

    我有一个可选的查询部分 需要在特定条件下执行 这是示例代码 int cat 1 int UserID 12 string qry select from articles if cat gt 0 qry where categoryID c
  • 如何仅在特定 API 级别上执行代码

    例如 这段代码 if Build VERSION SDK INT gt Build VERSION CODES GINGERBREAD myCalendarView setOnDateChangeListener new OnDateCha
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • str在 data.frame 中按行分割并按列分配结果

    所以我有数据框 dat data frame x c Sir Lancelot the Brave King Arthur The Black Knight The Rabbit stringsAsFactors F gt dat x 1
  • Java 8 Streams:将对象列表转换为一组对象

    我正在尝试将对象列表转换为一组对象 以确保集合中是否不存在重复项 我正在尝试使用 Streams 我有一个类产品如下 class Product int id String name float price public Product i
  • 模拟通过实例使用的类方法

    我正在尝试使用模拟修补类方法 如所述在文档中 http www voidspace org uk python mock patch html patch Mock 对象本身工作正常 但它的方法却不能 例如 它们的属性如下call coun
  • 从 Delphi 将列表导出到 OpenOffice Calc

    我正在使用 Delphi 7 我想使用自动化而不是使用文件将列表内容从我的程序导出到 OpenOffice Calc 任务很简单 创建新文档 迭代行 列并更改单元格数据 我找到了一些代码 但它并不完整 我希望有人有一些示例代码可以完成这个非
  • 将 Python 安装到自托管 Windows 构建代理

    我已经安装了 Windows 代理 并且需要能够运行 Python 脚本 我知道我需要安装Python 但我不知道如何安装 我将标准安装中的 Python 文件添加到 AGENT TOOLSDIRECTORY Python 3 8 2 x6
  • Swift 的 Facebook 登录按钮

    在 Xcode 中 如果我创建一个UIView然后将自定义类添加为FBSDKLoginButton 当我单击时 它会引导我完成 Facebook 登录 然后返回到与FBSDKLoginButton但不是说登录按钮 而是说现在注销 当单击登录
  • 使用装饰器恢复生成器

    让我们有一个类 它的功能有时会失败 但经过一些操作后它就可以完美地工作 现实生活中的例子是 Mysql 查询 它会引发 mysql exceptions OperationalError 2006 MySQL server has gone
  • 终止递归调用

    据我所知 terminate 当异常处理出现问题时被调用 通常只是没有被捕获 我得到的只是一个错误行terminate called recursively 经过一段时间的谷歌搜索后 我发现了很多例子 terminate called af
  • 如何在 Visual Studio 中将 .NET Framework 更改为 .NET Standard/Core?

    我在 Visual Studio 中有一个 C 解决方案 它最初是在 NET Framework 中创建的 我想将项目转换为 NET Standard Core 如果我进入项目 gt 属性 我会看到附加的屏幕 其中目标框架是 NET Fra
  • 我应该如何解释 ghc 堆分析器的输出?

    我有一个在 haskell 中实现的服务器进程 它充当一个简单的内存数据库 客户端进程可以连接然后添加和检索数据 该服务使用的内存比我预期的要多 我正在尝试找出原因 我拥有的最粗略的指标是linux top 当我启动该过程时 我看到一个大小
  • SeekBar minHeight 和 maxHeight 通过代码

    有谁知道如何设置最小值和最大值SeekBar代码的高度 我想重现与以下 XML 摘录相同的行为
  • 在地图上显示线串的方向 - 自动缩放地图

    我有这段代码 它在地图上绘制一个线串 它是用户提供的 2 个坐标点的轨迹 public class Quickstart public static void main String args throws Exception displa