]>
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 String vectorSourceStyle
;
46 private List
<String
> geoJsonSources
= new ArrayList
<>();
47 private Map
<String
, String
> vectorSources
= new HashMap
<>();
48 private Map
<String
, String
> layerStyles
= new HashMap
<>();
50 private CmsView cmsView
;
52 public OpenLayersMap(Composite parent
, int style
, URL mapHtml
) {
54 cmsView
= CmsView
.getCmsView(parent
);
55 setLayout(new GridLayout());
57 browser
= new Browser(this, SWT
.BORDER
);
58 browser
.setLayoutData(CmsUiUtils
.fillAll());
60 try (InputStream in
= mapHtml
.openStream()) {
61 html
= IOUtils
.toString(in
, StandardCharsets
.UTF_8
);
62 } catch (IOException e
) {
63 throw new RuntimeException(e
);
65 new RenderCompleted(browser
, "renderCompleted");
66 new OnFeatureSelect(browser
, "onFeatureSelect");
67 new OnFeatureUnselect(browser
, "onFeatureUnselect");
68 new OnFeatureClick(browser
, "onFeatureClick");
69 browser
.setText(html
);
72 public void setCenter(Double lng
, Double lat
) {
73 if (isRenderCompleted())
74 browser
.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "]))");
79 public synchronized void setRenderCompleted(boolean renderCompleted
) {
80 this.renderCompleted
= renderCompleted
;
84 public synchronized boolean isRenderCompleted() {
85 return renderCompleted
;
89 public synchronized void dispose() {
91 long begin
= System
.currentTimeMillis();
92 while (!isRenderCompleted() && ((System
.currentTimeMillis() - begin
) < timeout
)) {
95 } catch (InterruptedException e
) {
102 public void setZoom(int zoom
) {
103 if (isRenderCompleted())
104 browser
.evaluate("map.getView().setZoom(" + zoom
+ ")");
108 protected String
asVectorSource(List
<Node
> geoPoints
) throws RepositoryException
{
109 boolean first
= true;
110 StringBuffer sb
= new StringBuffer("new ol.source.Vector({ features: [");
111 for (int i
= 0; i
< geoPoints
.size(); i
++) {
112 Node node
= geoPoints
.get(i
);
113 if (node
.isNodeType(EntityType
.geopoint
.get())) {
118 Double lng
= node
.getProperty(EntityNames
.GEO_LONG
).getDouble();
119 Double lat
= node
.getProperty(EntityNames
.GEO_LAT
).getDouble();
120 sb
.append("new ol.Feature({ geometry:");
121 sb
.append("new ol.geom.Point(ol.proj.fromLonLat([");
122 sb
.append(lng
).append(',').append(lat
);
124 sb
.append(",path:'").append(node
.getPath()).append("'");
125 sb
.append(",name:'").append(node
.getName()).append("'");
126 String entityType
= null;
127 if (node
.isNodeType(EntityType
.local
.get())) {
128 entityType
= node
.getProperty(EntityNames
.ENTITY_TYPE
).getString();
129 sb
.append(", type:'").append(entityType
).append("'");
136 return sb
.toString();
139 public void addPoints(List
<Node
> geoPoints
) throws RepositoryException
{
140 this.vectorSource
= asVectorSource(geoPoints
);
141 if (log
.isTraceEnabled())
142 log
.trace("Vector source: " + vectorSource
);
143 renderVectorSource();
146 public void addPoints(String layerName
, List
<Node
> geoPoints
, String style
) throws RepositoryException
{
147 this.vectorSources
.put(layerName
, asVectorSource(geoPoints
));
149 layerStyles
.put(layerName
, style
);
151 renderVectorSources();
154 protected void renderVectorSource() {
155 if (vectorSource
== null)
157 if (isRenderCompleted()) {
158 // String style = ", style: new ol.style.Style({ image: new ol.style.Icon({ src: '/pkg/org.djapps.on.openheritage.ui/map_oc.png' }) })";
159 String style
= vectorSourceStyle
!= null ?
", style: " + vectorSourceStyle
: "";
160 // String style = "";
161 String toEvaluate
= "map.addLayer(new ol.layer.Vector({ source: " + vectorSource
+ style
+ "}));";
162 // System.out.println(toEvaluate);
163 browser
.execute(toEvaluate
);
167 protected void renderVectorSources() {
168 if (vectorSources
.isEmpty())
170 if (isRenderCompleted()) {
171 StringBuilder toExecute
= new StringBuilder();
172 for (String name
: vectorSources
.keySet()) {
173 String style
= layerStyles
.containsKey(name
) ?
", style: " + layerStyles
.get(name
) : "";
174 String toEvaluate
= "map.addLayer(new ol.layer.Vector({ source: " + vectorSources
.get(name
) + style
175 + ",name: '" + name
+ "'}));";
176 toExecute
.append(toEvaluate
);
178 browser
.execute(toExecute
.toString());
182 public void addPoint(Double lng
, Double lat
) {
183 this.vectorSource
= "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
184 + " new ol.geom.Point(ol.proj.fromLonLat([" + lng
+ ", " + lat
+ "])) }) ] })";
185 // if (renderCompleted) {
187 // "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
188 // + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
190 renderVectorSource();
193 public void addGpx(String path
) {
194 this.gpxSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GPX() })";
198 protected void renderGpxSource() {
199 if (gpxSource
== null)
201 if (isRenderCompleted())
202 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource
+ "}));");
205 public void addGeoJson(String path
) {
206 String geoJsonSource
= "new ol.source.Vector({ url: '" + path
+ "', format: new ol.format.GeoJSON() })";
207 geoJsonSources
.add(geoJsonSource
);
208 renderGeoJsonSources();
211 protected void renderGeoJsonSources() {
212 if (geoJsonSources
.isEmpty())
214 if (isRenderCompleted()) {
215 for (String geoJson
: geoJsonSources
) {
216 browser
.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson
+ "}));");
221 public void setVectorSourceStyle(String vectorSourceStyle
) {
222 this.vectorSourceStyle
= vectorSourceStyle
;
225 private class RenderCompleted
extends BrowserFunction
{
227 RenderCompleted(Browser browser
, String name
) {
228 super(browser
, name
);
232 public Object
function(Object
[] arguments
) {
234 if (!isRenderCompleted()) {
235 setRenderCompleted(true);
238 if (centerLat
!= null && centerLng
!= null) {
239 setCenter(centerLng
, centerLat
);
241 if (!geoJsonSources
.isEmpty())
242 renderGeoJsonSources();
243 if (gpxSource
!= null)
245 if (vectorSource
!= null)
246 renderVectorSource();
247 if (!vectorSources
.isEmpty())
248 renderVectorSources();
251 } catch (Exception e
) {
252 log
.error("Cannot render map", e
);
258 private class OnFeatureSelect
extends BrowserFunction
{
260 OnFeatureSelect(Browser browser
, String name
) {
261 super(browser
, name
);
265 public Object
function(Object
[] arguments
) {
266 if (arguments
.length
== 0)
268 String path
= arguments
[0].toString();
269 Map
<String
, Object
> properties
= new HashMap
<>();
270 properties
.put(SuiteEvent
.NODE_PATH
, path
);
271 properties
.put(SuiteEvent
.WORKSPACE
, NodeConstants
.SYS_WORKSPACE
);
272 cmsView
.sendEvent(SuiteEvent
.refreshPart
.topic(), properties
);
277 private class OnFeatureUnselect
extends BrowserFunction
{
279 OnFeatureUnselect(Browser browser
, String name
) {
280 super(browser
, name
);
284 public Object
function(Object
[] arguments
) {
289 private class OnFeatureClick
extends BrowserFunction
{
291 OnFeatureClick(Browser browser
, String name
) {
292 super(browser
, name
);
296 public Object
function(Object
[] arguments
) {