I am creating an ArcGIS map from a collection of EncLayers containing charts that cover the world. While the map loads all the charts correctly inside a MapView, I am unable to move the Viewpoint outside the vertical bounds of the first layer loaded.
How should I load the charts into a map so that I can freely pan the map across all of them?
I am loading S-57 charts (I've tried loading them both using a catalog and individually) and ArcGIS Runtime 100.3.0.
I am loading the charts as follows:
map <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">ArcGISMap</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Basemap</SPAN><SPAN class="punctuation token">(</SPAN>EncLayerManager<SPAN class="punctuation token">.</SPAN><SPAN class="token function">getLayers</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> null<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
where EncLayerManager.getLayers() returns a List of EncLayers that is created in the function below.
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">static</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">loadLayers</SPAN><SPAN class="punctuation token">(</SPAN>Iterable<SPAN class="operator token"><</SPAN>String<SPAN class="operator token">></SPAN> paths<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
EncExchangeSet encExchangeSet <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">EncExchangeSet</SPAN><SPAN class="punctuation token">(</SPAN>paths<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
encExchangeSet<SPAN class="punctuation token">.</SPAN><SPAN class="token function">addDoneLoadingListener</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">synchronized</SPAN> <SPAN class="punctuation token">(</SPAN>layers<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">{</SPAN>
<SPAN class="comment token">//loop through the datasets and add to the map</SPAN>
<SPAN class="keyword token">for</SPAN> <SPAN class="punctuation token">(</SPAN>EncDataset encDataset <SPAN class="operator token">:</SPAN> encExchangeSet<SPAN class="punctuation token">.</SPAN><SPAN class="token function">getDatasets</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
EncCell encCell <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">EncCell</SPAN><SPAN class="punctuation token">(</SPAN>encDataset<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
EncLayer encLayer <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">EncLayer</SPAN><SPAN class="punctuation token">(</SPAN>encCell<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
layers<SPAN class="punctuation token">.</SPAN><SPAN class="token function">addLast</SPAN><SPAN class="punctuation token">(</SPAN>encLayer<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
System<SPAN class="punctuation token">.</SPAN>out<SPAN class="punctuation token">.</SPAN><SPAN class="token function">println</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Loaded "</SPAN> <SPAN class="operator token">+</SPAN> layers<SPAN class="punctuation token">.</SPAN><SPAN class="token function">size</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">" ENC Charts"</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
encExchangeSet<SPAN class="punctuation token">.</SPAN><SPAN class="token function">loadAsync</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
The MapView is being created using FXML and has its map set with:
map<SPAN class="punctuation token">.</SPAN><SPAN class="token function">setView</SPAN><SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN></SPAN>
For example, if the chart contained in the first layer in the list covers latitudes from 60N to 85N I am unable to pan the view so its centre is below 60N, even though there are other charts loaded that cover this area.
However, when I first load a web-based base map before adding the EncLayers, the problem does not present itself and I can pan freely. This, unfortunately, doesn't solve my problem as the application is required to work without an internet connection. In this case, I load the charts like so:
map <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">ArcGISMap</SPAN><SPAN class="punctuation token">(</SPAN>Basemap<SPAN class="punctuation token">.</SPAN><SPAN class="token function">createOceans</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
map<SPAN class="punctuation token">.</SPAN><SPAN class="token function">getBasemap</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">getBaseLayers</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">addAll</SPAN><SPAN class="punctuation token">(</SPAN>EncLayerManager<SPAN class="punctuation token">.</SPAN><SPAN class="token function">getLayers</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN></SPAN>
I have tried using a tiled layer loaded from a file to create the basemap and while this did allow me to scroll between charts, it also caused significant rendering errors while displaying those charts, as shown below: