Нарисуйте WFS с длинными координатами на холсте в Java - PullRequest
0 голосов
/ 31 января 2020

Я очень новичок в Java программировании, я был бы признателен за любую помощь. Поэтому я хочу отобразить набор координат длиной в широту (более 50 координат) на основе Java (например, JFrame, Processing) с сервера WFS. Мне удалось разобрать значение 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);
  1. Можно ли перенести координаты из WFS в экранные координаты, используя world2screen.translate библиотеки Geotools, как в https://docs.geotools.org/latest/userguide/library/referencing/axis.html?
  2. При обработке имеется функция map () (https://processing.org/reference/map_.html) для передачи из диапазона в другой. Я пробовал это, но это не сработало на моей IDE.
  3. Один вопрос супер нуб, я пытаюсь сохранить соединение WFS в функции, чтобы я мог вызвать его в другом классе, если я сохраню он в состоянии c void или использует «return»?

Если кто-то может привести пример аналогичной задачи, это было бы очень полезно. Спасибо (Сара)

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Самый простой способ - создать GeoTools WFSDataStore, этот код создает строку getCapabilities, если пользователь дал только URL-адрес конечной точке службы и при необходимости обрабатывает аутентификацию. Хранилище данных хранится в поле класса:

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

GeoTools Краткое руководство по обучению поможет вам начать работу с простым отображением, а руководство по Стилизация карты позволит вам чтобы создать более красивую карту, когда вы хотите больше, чем простая черно-белая карта по умолчанию.

0 голосов
/ 31 января 2020
  1. Вместо этого можно использовать эту формулу:

    float x = ((WIDTH/360.0) * (180 + loncoord));
    float y = ((HEIGHT/180.0) * (90 - latcoord));
    
  2. Это должно работать ... Обратите внимание, что оно возвращает float и принимает 5 аргументов форма: map(input, inputMin, inputMax, outputMin, outputMax)

  3. Вы хотите создать соединение только один раз, поэтому у вас останется две жизнеспособные опции: определение соединения как stati c переменная состояния c class или определение соединения в качестве переменной экземпляра класса по шаблону singleton .

    Если вы выбрали предыдущий подход, метод, который возвращает переменную соединения, должен поэтому static но не void:

    public static connectionType getConnection() {
        return connectionObject;
    }
    

    ... где connectionType - тип данных соединения.

...