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