在Java中使用latlong坐标将WFS绘制到画布

在Java中使用latlong坐标将WFS绘制到画布,java,swing,processing,gis,geotools,Java,Swing,Processing,Gis,Geotools,我对Java编程非常陌生,希望能得到任何帮助。 因此,我想在基于Java的画布(例如JFrame、Processing)中显示来自WFS服务器的一组lat-long坐标(超过50个坐标)。我已经设法解析了lat long值并将其打印到控制台。现在我陷入了如何将lat-long坐标转换为屏幕坐标(我想在1000x500大小上绘制)。我试图寻找参考资料,但对于像我这样的初学者来说,找不到最简单的参考资料。以下是我的代码的当前部分: String[] splitc = coord.split(",")

我对Java编程非常陌生,希望能得到任何帮助。 因此,我想在基于Java的画布(例如JFrame、Processing)中显示来自WFS服务器的一组lat-long坐标(超过50个坐标)。我已经设法解析了lat long值并将其打印到控制台。现在我陷入了如何将lat-long坐标转换为屏幕坐标(我想在1000x500大小上绘制)。我试图寻找参考资料,但对于像我这样的初学者来说,找不到最简单的参考资料。以下是我的代码的当前部分:

String[] splitc = coord.split(",");
                    String lon = splitc[0];
                    String lat = splitc[1];
                    //parse string to float
                    float loncoord=Float.parseFloat(lon);
                    float latcoord=Float.parseFloat(lat);
  • 我是否可以使用Geotools库的world2screen.translate将WFS中的坐标转换为屏幕坐标,如中所示
  • 在处理过程中,有一个map()函数()可以从一个范围转移到另一个范围。我试过了,但在我的IDE上不起作用
  • 一个超级noob问题,我试图将WFS连接存储在一个函数中,以便在另一个类中调用它,我应该将其存储在staticvoid中还是使用“return”
  • 如果有人能提供一个类似任务的例子,那将非常有帮助。谢谢(莎拉)

  • 您可以使用以下公式:

    float x = ((WIDTH/360.0) * (180 + loncoord));
    float y = ((HEIGHT/180.0) * (90 - latcoord));
    
  • 它应该有用。。。请注意,它返回一个
    float
    ,并采用以下形式的5个参数:
    map(输入、输入最小、输入最大、输出最小、输出最大)

  • 您只需要创建一次连接,因此剩下两个可行的选项:将连接定义为静态类的静态变量,或将连接定义为遵循该模式的类的实例变量

    假设您选择了前一种方法,那么返回连接变量的方法应该是
    static
    ,而不是
    void

    public static connectionType getConnection() {
        return connectionObject;
    }
    
    。。。其中,
    connectionType
    是连接的数据类型


  • 最简单的方法是创建一个GeoTools
    WFSDataStore
    ,如果用户只向服务端点提供了一个URL,则此代码将构建getCapabilities字符串,并在需要时处理身份验证。数据存储存储在类的字段中:

      public FetchWFS(String url, String user, String passwd) throws IOException, URISyntaxException {
        if (!user.isEmpty()) {
          auth = true;
        }
        baseURL = new URL(url);
        List<NameValuePair> nvp = URLEncodedUtils.parse(baseURL.toURI(), "UTF-8");
        NameValuePair service = new BasicNameValuePair("service", "wfs");
        NameValuePair request = new BasicNameValuePair("request", "getCapabilities");
        NameValuePair version = new BasicNameValuePair("version", "2.0.0");
        HashMap<String, NameValuePair> parts = new HashMap<>();
        parts.put(service.getName(), service);
        parts.put(request.getName(), request);
        parts.put(version.getName(), version);
        for (NameValuePair part : nvp) {
    
          if (part.getName().equalsIgnoreCase("SERVICE")) {
            // We don't care what they think this should be
          } else if (part.getName().equalsIgnoreCase("REQUEST")) {
            // This must be getCapabuilities so we ignore them
          } else if (part.getName().equalsIgnoreCase("VERSION")) {
            System.out.println("Changing version to " + part.getValue());
            parts.put(version.getName(), part);
          } else {
            parts.put(part.getName(), part);
          }
        }
    
        URIBuilder builder = new URIBuilder();
        builder.setScheme(baseURL.getProtocol());
        builder.setHost(baseURL.getHost());
        builder.setPort(baseURL.getPort());
        builder.setPath(baseURL.getPath());
        List<NameValuePair> p = new ArrayList<>();
        p.addAll(parts.values());
        builder.setParameters(p);
        // builder.addParameter("viewparams", "q:\"mySolrQuery\"");
        URI uri = builder.build();
        System.out.println(uri);
        baseURL = uri.toURL();
        // fetch the DataStore
        Map<String, Object> params = new HashMap<>();
        params.put(WFSDataStoreFactory.URL.key, baseURL);
        // params.put(WFSDataStoreFactory.WFS_STRATEGY.key, "mapserver");
        if (auth) {
          params.put(WFSDataStoreFactory.USERNAME.key, user);
          params.put(WFSDataStoreFactory.PASSWORD.key, passwd);
        }
        // params.put(WFSDataStoreFactory.WFS_STRATEGY.key, "mapserver");
        datastore = DataStoreFinder.getDataStore(params);
      }
    

    将帮助您开始简单的映射,并且将允许您在需要比简单的黑白默认映射更多的映射时生成更漂亮的映射

    谢谢,但是我们能用JMapframe制作一张交互式地图吗?例如,如果用户单击该点,则会显示属性。JMapFrame工具栏包含一个默认情况下执行此操作的“标识”工具。你当然可以在任何需要的地方重复使用这个动作。你能详细说明你的公式吗?我对latlong与屏幕坐标中的轴有点困惑
            JMapFrame frame = new JMapFrame();
            MapContent map = new MapContent();
            String[] names = datastore.getNames();
            featureSource = store.getFeatureSource(names[0]); //fetch first featureType
            schema = featureSource.getSchema();
    
            Style style = SLD.createSimpleStyle(schema);
            this.layer = new FeatureLayer(featureSource, style);
    
            map.addLayer(layer);
            frame.enableToolBar(true);
            frame.setMinimumSize(new Dimension(800, 400));
            frame.setVisible(true);