]>
git.argeo.org Git - gpl/argeo-suite.git/blob - environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java
1 package org
.argeo
.support
.openlayers
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
6 import java
.nio
.charset
.StandardCharsets
;
7 import java
.util
.ArrayList
;
8 import java
.util
.HashMap
;
12 import javax
.jcr
.Node
;
13 import javax
.jcr
.RepositoryException
;
15 import org
.apache
.commons
.io
.IOUtils
;
16 import org
.apache
.commons
.logging
.Log
;
17 import org
.apache
.commons
.logging
.LogFactory
;
18 import org
.argeo
.api
.NodeConstants
;
19 import org
.argeo
.cms
.ui
.CmsView
;
20 import org
.argeo
.cms
.ui
.util
.CmsUiUtils
;
21 import org
.argeo
.entity
.EntityNames
;
22 import org
.argeo
.entity
.EntityType
;
23 import org
.argeo
.suite
.ui
.SuiteEvent
;
24 import org
.eclipse
.swt
.SWT
;
25 import org
.eclipse
.swt
.browser
.Browser
;
26 import org
.eclipse
.swt
.browser
.BrowserFunction
;
27 import org
.eclipse
.swt
.layout
.GridLayout
;
28 import org
.eclipse
.swt
.widgets
.Composite
;
31 public class OpenLayersMap
extends Composite
{
32 private static final long serialVersionUID
= 1055893020490283622L;
34 private final static Log log
= LogFactory
.getLog(OpenLayersMap
.class);
36 private Browser browser
;
37 private boolean renderCompleted
= false;
39 private Double centerLng
= null, centerLat
= null;
40 private Integer zoom
= null;
41 private String vectorSource
= null;
42 private String gpxSource
= null;
44 private List
<String
> geoJsonSources
= new ArrayList
<>();
46 private CmsView cmsView
;
48 public OpenLayersMap(Composite parent
, int style
, URL mapHtml
) {
50 cmsView
= CmsView
.getCmsView(parent
);
51 setLayout(new GridLayout());
53 browser
= new Browser(this, SWT
.BORDER
);
54 browser
.setLayoutData(CmsUiUtils
.fillAll());
56 try (InputStream in
= mapHtml
.openStream()) {
57 html
= IOUtils
.toString(in
, StandardCharsets
.UTF_8
);
58 } catch (IOException e
) {
59 throw new RuntimeException(e
);
61 new RenderCompleted(browser
, "renderCompleted");
62 new OnFeatureSelect(browser
, "onFeatureSelect");
63 new OnFeatureUnselect(browser
, "onFeatureUnselect");
64 new OnFeatureClick(browser
, "onFeatureClick");
65 browser
.setText(html
);
68 public void setCenter(Double lng
, Double lat
) {
69 if (isRenderCompleted())
70 browser
.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "]))");
75 public synchronized void setRenderCompleted(boolean renderCompleted
) {
76 this.renderCompleted
= renderCompleted
;
80 public synchronized boolean isRenderCompleted() {
81 return renderCompleted
;
85 public synchronized void dispose() {
87 long begin
= System
.currentTimeMillis();
88 while (!isRenderCompleted() && ((System
.currentTimeMillis() - begin
) < timeout
)) {
91 } catch (InterruptedException e
) {
98 public void setZoom(int zoom
) {
99 if (isRenderCompleted())
100 browser
.evaluate("map.getView().setZoom(" + zoom
+ ")");
104 public void addPoints(List
<Node
> geoPoints
) throws RepositoryException
{
105 boolean first
= true;
106 StringBuffer sb
= new StringBuffer("new ol.source.Vector({ features: [");
107 for (int i
= 0; i
< geoPoints
.size(); i
++) {
108 Node node
= geoPoints
.get(i
);
109 if (node
.isNodeType(EntityType
.geopoint
.get())) {
114 Double lng
= node
.getProperty(EntityNames
.GEO_LONG
).getDouble();
115 Double lat
= node
.getProperty(EntityNames
.GEO_LAT
).getDouble();
116 sb
.append("new ol.Feature({ geometry:");
117 sb
.append("new ol.geom.Point(ol.proj.fromLonLat([");
118 sb
.append(lng
).append(',').append(lat
);
120 sb
.append(",path:'").append(node
.getPath()).append("'");
125 this.vectorSource
= sb
.toString();
126 if (log
.isTraceEnabled())
127 log
.trace("Vector source: " + vectorSource
);
128 renderVectorSource();
131 protected void renderVectorSource() {
132 if (vectorSource
== null)
134 if (isRenderCompleted())
135 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + vectorSource
+ "}));");
138 public void addPoint(Double lng
, Double lat
) {
139 this.vectorSource
= "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
140 + " new ol.geom.Point(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "])) }) ] })";
141 // if (renderCompleted) {
143 // "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
144 // + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
146 renderVectorSource();
149 public void addGpx(String path
) {
150 this.gpxSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GPX() })";
154 protected void renderGpxSource() {
155 if (gpxSource
== null)
157 if (isRenderCompleted())
158 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource
+ "}));");
161 public void addGeoJson(String path
) {
162 String geoJsonSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GeoJSON() })";
163 geoJsonSources
.add(geoJsonSource
);
164 renderGeoJsonSources();
167 protected void renderGeoJsonSources() {
168 if (geoJsonSources
.isEmpty())
170 if (isRenderCompleted()) {
171 for (String geoJson
: geoJsonSources
) {
172 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson
+ "}));");
177 private class RenderCompleted
extends BrowserFunction
{
179 RenderCompleted(Browser browser
, String name
) {
180 super(browser
, name
);
184 public Object
function(Object
[] arguments
) {
186 if (!isRenderCompleted()) {
187 setRenderCompleted(true);
190 if (centerLat
!= null && centerLng
!= null) {
191 setCenter(centerLng
, centerLat
);
193 if (vectorSource
!= null)
194 renderVectorSource();
195 if (gpxSource
!= null)
197 if (!geoJsonSources
.isEmpty())
198 renderGeoJsonSources();
201 } catch (Exception e
) {
202 log
.error("Cannot render map", e
);
208 private class OnFeatureSelect
extends BrowserFunction
{
210 OnFeatureSelect(Browser browser
, String name
) {
211 super(browser
, name
);
215 public Object
function(Object
[] arguments
) {
216 if (arguments
.length
== 0)
218 String path
= arguments
[0].toString();
219 Map
<String
, Object
> properties
= new HashMap
<>();
220 properties
.put(SuiteEvent
.NODE_PATH
, path
);
221 properties
.put(SuiteEvent
.WORKSPACE
, NodeConstants
.SYS_WORKSPACE
);
222 cmsView
.sendEvent(SuiteEvent
.refreshPart
.topic(), properties
);
227 private class OnFeatureUnselect
extends BrowserFunction
{
229 OnFeatureUnselect(Browser browser
, String name
) {
230 super(browser
, name
);
234 public Object
function(Object
[] arguments
) {
239 private class OnFeatureClick
extends BrowserFunction
{
241 OnFeatureClick(Browser browser
, String name
) {
242 super(browser
, name
);
246 public Object
function(Object
[] arguments
) {