public void composeElevations(Sector sector, List <T> latlons, int tileWidth, double[] buffer) where T : LatLon
        {
            if (sector == null)
            {
                String msg = Logging.getMessage("nullValue.SectorIsNull");
                Logging.logger().severe(msg);
                throw new ArgumentException(msg);
            }

            if (latlons == null)
            {
                String msg = Logging.getMessage("nullValue.LatLonListIsNull");
                Logging.logger().severe(msg);
                throw new ArgumentException(msg);
            }

            if (buffer == null)
            {
                String msg = Logging.getMessage("nullValue.ElevationsBufferIsNull");
                Logging.logger().severe(msg);
                throw new ArgumentException(msg);
            }

            if (buffer.Length < latlons.Count || tileWidth > latlons.Count)
            {
                String msg = Logging.getMessage("ElevationModel.ElevationsBufferTooSmall", latlons.Count);
                Logging.logger().severe(msg);
                throw new ArgumentException(msg);
            }

            WMSBasicElevationModel.ElevationCompositionTile tile = new WMSBasicElevationModel.ElevationCompositionTile(
                sector, this.getLevels().getLastLevel(),
                tileWidth, latlons.Count / tileWidth);

            this.downloadElevations(tile);
            tile.setElevations(this.readElevations(tile.getFile().toURI().toURL()), this);

            for (int i = 0; i < latlons.Count; i++)
            {
                LatLon ll = latlons[i];
                if (ll == null)
                {
                    continue;
                }

                double value = this.lookupElevation(ll.getLatitude(), ll.getLongitude(), tile);

                // If an elevation at the given location is available, then write that elevation to the destination buffer.
                // Otherwise do nothing.
                if (value != this.getMissingDataSignal())
                {
                    buffer[i] = value;
                }
            }
        }
        protected void downloadElevations(WMSBasicElevationModel.ElevationCompositionTile tile)
        {
            URL url = tile.getResourceURL();

            Retriever retriever = new HTTPRetriever(url,
                                                    new WMSBasicElevationModel.CompositionRetrievalPostProcessor(tile.getFile()));

            retriever.setConnectTimeout(10000);
            retriever.setReadTimeout(60000);
            retriever.call();
        }