Esri / arcgis-maps-sdk-java-samples

ArcGIS Maps SDK for Java samples
Apache License 2.0
112 stars 120 forks source link

how to and where Download the map area the whole world from #279

Closed aminabvaal closed 5 years ago

aminabvaal commented 5 years ago

i read this doc https://developers.arcgis.com/android/latest/guide/create-an-offline-map.htm and i reach this lines :: // create an offline map task OfflineMapTask offlineMapTask = new OfflineMapTask(map); // create the job DownloadPreplannedOfflineMapJob downloadJob = offlineMapTask.downloadPreplannedOfflineMap(mapArea, downloadPath);

in offlineMapTask.downloadPreplannedOfflineMap(mapArea, downloadPath) what is mapArea object and how to be initialized how to specify an particular area such as a continent or country in App I need all over the world how to specify thismapArea Object ?? thanks

mbcoder commented 5 years ago

@aminabvaal have you seen the section above in the document titled: Identify a map area to download

So have you already for a webmap set up with a pre-planned area?

To ensure I'm pointing you in the right direction it would be good to understand what you are trying to do.

If your data is stored in ArcGIS Online then have you decided to use pre-planned areas or on demand workflows?

If your data exists in files such as shapefile or geopackage then you should follow a different approach.

There are easy solutions but it would help if you clearly explained what you are trying to do:

It may help of you contact your local ESRI office, if you are totally stuck.

aminabvaal commented 5 years ago

@mbcoder idon't need your above comment ..i just need a few code line or link to download .mmpk file for load all map of world

aminabvaal commented 5 years ago

just like \arcgis-runtime-samples-java\samples-data\mmpk\SanFrancisco.mmpk i need all mmpk file for all world how to show all world in app when app is offline

aminabvaal commented 5 years ago

i read this doc::

A mobile map package is a file object (.mmpk) created in ArcGIS Pro. It is a transport mechanism for maps, their layers, data, networks, and locators. A mobile map package can be sideloaded onto a device by email, or by platform-specific transfer mechanism, or it can be downloaded from a portal to the device.

how can i be download this mmpk file from a portal to my device

mbcoder commented 5 years ago

mmpk files can be generated from 2 locations:

In the second approach (ArcGIS Online), your data will be in what is called a web map. You can extract this into an mmpk via the on-demand method (this sounds like what you should do), or pre-planned (which is well suited if you regularly want to download the same areas). The pre-planned areas need to be configured in ArcGIS Online.

In the on-demand method, you just get the SDK to ask for the offline map which once generated will be downloade as an mmpk.

The section titled "On-demand workflow" in this page (scroll down lots) explains how to download an mmpk: https://developers.arcgis.com/java/latest/guide/create-an-offline-map.htm

You mention that you are working with data for the entire world. Take great care that you don't ask the server to generate a mmpk with a basemap for all levels of detail. This will result in a massive dataset. Limit the levels of detail for your download in the basemap. I would also encourage you to set up your webmap so that it uses a vector basemap. Vector basemaps are much smaller when downloaded onto a device when you are working with a large area.

aminabvaal commented 5 years ago

it looks you put me in infinite loop ... https://developers.arcgis.com/java/latest/guide/create-an-offline-map.htm my first message is about this page ... in this line: ` // create an offline map task OfflineMapTask offlineMapTask = new OfflineMapTask(map);

// create the job DownloadPreplannedOfflineMapJob downloadJob = inofflineMapTask.downloadPreplannedOfflineMap(mapArea, downloadPath)`

what is mapArea object and how to be initialized how to specify an particular area such as a continent or country in App I need all over the world how to specify thismapArea Object ?? thanks

aminabvaal commented 5 years ago

@mbcoder

you put me in infinite loop :: my first above msg is about this page you told recently https://developers.arcgis.com/java/latest/guide/create-an-offline-map.htm

i read this doc https://developers.arcgis.com/android/latest/guide/create-an-offline-map.htm and i reach this lines :: // create an offline map task OfflineMapTask offlineMapTask = new OfflineMapTask(map); // create the job DownloadPreplannedOfflineMapJob downloadJob = offlineMapTask.downloadPreplannedOfflineMap(mapArea, downloadPath);

in offlineMapTask.downloadPreplannedOfflineMap(mapArea, downloadPath) what is mapArea object and how to be initialized how to specify an particular area such as a continent or country in App I need all over the world how to specify this mapArea Object ??

please put an code example of this mapArea initialized

aminabvaal commented 5 years ago

i want just a code exapme that implement downloading map area and use it in offline mode

aminabvaal commented 5 years ago

Take great care that you don't ask the server to generate a mmpk with a basemap for all levels of detail.

which server ...which server you are talking about

just change your talking to clarified code to use that i just want handle this issue not learn more

tschie commented 5 years ago

@aminabvaal Create a free account at https://www.arcgis.com/home/createaccount.html. You must do this to take maps offline.

Then use this code to download a map area for offline use. Change the file path to the directory you want to download to. Also play with the minScale and maxScale.

package com.esri.samples.map.generate_offline_map;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import com.esri.arcgisruntime.concurrent.Job;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.portal.Portal;
import com.esri.arcgisruntime.portal.PortalItem;
import com.esri.arcgisruntime.security.AuthenticationManager;
import com.esri.arcgisruntime.security.DefaultAuthenticationChallengeHandler;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.tasks.offlinemap.GenerateOfflineMapJob;
import com.esri.arcgisruntime.tasks.offlinemap.GenerateOfflineMapParameters;
import com.esri.arcgisruntime.tasks.offlinemap.GenerateOfflineMapResult;
import com.esri.arcgisruntime.tasks.offlinemap.OfflineMapTask;

public class GenerateOfflineMapSample extends Application {

  private MapView mapView;

  @Override
  public void start(Stage stage) {

    try {
      // create stack pane and application scene
      StackPane stackPane = new StackPane();
      Scene scene = new Scene(stackPane);

      // set title, size, and add scene to stage
      stage.setTitle("Generate Offline Map Sample");
      stage.setWidth(800);
      stage.setHeight(700);
      stage.setScene(scene);
      stage.show();

      // create a button to take the map offline
      Button offlineMapButton = new Button("Take Map Offline");
      offlineMapButton.setDisable(true);

      // handle authentication with the portal
      AuthenticationManager.setAuthenticationChallengeHandler(new DefaultAuthenticationChallengeHandler());

      // create a portal item with the itemId of the web map
      Portal portal = new Portal("https://www.arcgis.com", true);
      PortalItem portalItem = new PortalItem(portal, "86265e5a4bbb4187a59719cf134e0018");

      // create a map with the portal item
      ArcGISMap map = new ArcGISMap(portalItem);
      map.addDoneLoadingListener(() -> {
        // enable the button when the map is loaded
        if (map.getLoadStatus() == LoadStatus.LOADED) {
          offlineMapButton.setDisable(false);
        }
      });

      // set the map to the map view
      mapView = new MapView();
      mapView.setMap(map);

      // create a graphics overlay for the map view
      GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
      mapView.getGraphicsOverlays().add(graphicsOverlay);

      // create a graphic to show a box around the extent we want to download
      Graphic downloadArea = new Graphic();
      graphicsOverlay.getGraphics().add(downloadArea);
      SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, 0xFFFF0000, 2);
      downloadArea.setSymbol(simpleLineSymbol);

      // update the box whenever the viewpoint changes
      mapView.addViewpointChangedListener(viewpointChangedEvent -> {
        if (map.getLoadStatus() == LoadStatus.LOADED) {
          // upper left corner of the area to take offline
          Point2D minScreenPoint = new Point2D(50, 50);
          // lower right corner of the downloaded area
          Point2D maxScreenPoint = new Point2D(mapView.getWidth() - 50, mapView.getHeight() - 50);
          // convert screen points to map points
          Point minPoint = mapView.screenToLocation(minScreenPoint);
          Point maxPoint = mapView.screenToLocation(maxScreenPoint);
          // use the points to define and return an envelope
          if (minPoint != null && maxPoint != null) {
            Envelope envelope = new Envelope(minPoint, maxPoint);
            downloadArea.setGeometry(envelope);
          }
        }
      });

      // create progress bar to show download progress
      ProgressBar progressBar = new ProgressBar();
      progressBar.setProgress(0.0);
      progressBar.setVisible(false);

      // when the button is clicked, start the offline map task job
      offlineMapButton.setOnAction(e -> {
          // show the progress bar
          progressBar.setVisible(true);

          GenerateOfflineMapParameters params = new GenerateOfflineMapParameters(downloadArea.getGeometry(),
              mapView.getMapScale() + 10000, mapView.getMapScale());

          // create an offline map task with the map
          OfflineMapTask task = new OfflineMapTask(map);

          // create an offline map job with the download directory path and parameters and start the job
          GenerateOfflineMapJob job = task.generateOfflineMap(params, "C:/Users/tyle8552/Desktop/mmpk");
          job.start();
          job.addJobDoneListener(() -> {
            if (job.getStatus() == Job.Status.SUCCEEDED) {
              // replace the current map with the result offline map when the job finishes
              GenerateOfflineMapResult result = job.getResult();
              mapView.setMap(result.getOfflineMap());
              graphicsOverlay.getGraphics().clear();
              offlineMapButton.setDisable(true);
            } else {
              new Alert(Alert.AlertType.ERROR, job.getError().getAdditionalMessage()).show();
            }
            Platform.runLater(() -> progressBar.setVisible(false));
          });
          // show the job's progress with the progress bar
          job.addProgressChangedListener(() -> progressBar.setProgress(job.getProgress() / 100.0));
      });

      // add the map view, button, and progress bar to stack pane
      stackPane.getChildren().addAll(mapView, offlineMapButton, progressBar);
      StackPane.setAlignment(offlineMapButton, Pos.TOP_LEFT);
      StackPane.setAlignment(progressBar, Pos.TOP_RIGHT);
    } catch (Exception e) {
      // on any error, display the stack trace.
      e.printStackTrace();
    }
  }

  /**
   * Stops and releases all resources used in application.
   */
  @Override
  public void stop() {

    if (mapView != null) {
      mapView.dispose();
    }
  }

  /**
   * Opens and runs application.
   *
   * @param args arguments passed to this application
   */
  public static void main(String[] args) {

    Application.launch(args);
  }

}

Now that you have an offline map saved to your computer, you can use this app to read it back in for displaying offline:

package com.esri.samples.map.open_mobile_map_package;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.view.MapView;

public class OpenMobileMapPackageSample extends Application {

  private MapView mapView;

  @Override
  public void start(Stage stage) {

    try {
      // create stack pane and application scene
      StackPane stackPane = new StackPane();
      Scene scene = new Scene(stackPane);

      // set title, size, and add scene to stage
      stage.setTitle("Open Mobile Map Package Sample");
      stage.setWidth(800);
      stage.setHeight(700);
      stage.setScene(scene);
      stage.show();

      // create a map view
      mapView = new MapView();

      //load a mobile map package
      MobileMapPackage mobileMapPackage = new MobileMapPackage("C:/Users/tyle8552/Desktop/mmpk");

      mobileMapPackage.loadAsync();
      mobileMapPackage.addDoneLoadingListener(() -> {
        if (mobileMapPackage.getLoadStatus() == LoadStatus.LOADED && mobileMapPackage.getMaps().size() > 0) {
          //add the map from the mobile map package to the map view
          mapView.setMap(mobileMapPackage.getMaps().get(0));
        } else {
          Alert alert = new Alert(Alert.AlertType.ERROR, "Failed to load the mobile map package");
          alert.show();
        }
      });

      // add the map view to stack pane
      stackPane.getChildren().add(mapView);
    } catch (Exception e) {
      // on any error, display the stack trace.
      e.printStackTrace();
    }
  }

  /**
   * Stops and releases all resources used in application.
   */
  @Override
  public void stop() {

    if (mapView != null) {
      mapView.dispose();
    }
  }

  /**
   * Opens and runs application.
   *
   * @param args arguments passed to this application
   */
  public static void main(String[] args) {

    Application.launch(args);
  }

}

Hope that helps.

tschie commented 5 years ago

Closing due to inactivity.