def get_layer_names(map='Map'):
    doc = ArcGISProject('current')
    m = doc.listMaps(map)[0]

    return [
        layer.name for layer in map.listLayers()
        if layer.visible and layer.isFeatureLayer
    ]
Esempio n. 2
0
def clear_map_layers():
    """Removes layers from maps within the ArcGIS Pro project template.
    Does not remove the layers if they are group layers or basemaps.
    """
    aprx = ArcGISProject(config.aprx)
    for map_ in aprx.listMaps():
        del_layers = [x for x in map_.listLayers(
        ) if not x.isGroupLayer and not x.isBasemapLayer]
        if del_layers:
            for d in del_layers:
                map_.removeLayer(d)
    aprx.save()
def main(project_path='traffic-map.aprx',
         service_name="Traveler_Info",
         folder_name="Traveler_Info"):
    """Publishes a project map to a service
    """
    project_path = abspath(project_path)
    if not exists(project_path):
        raise FileNotFoundError("File not found: %s" % project_path)
    # Open the project
    AddMessage("Opening %s" % project_path)
    aprx = ArcGISProject(project_path)
    # Get the first map
    the_map = aprx.listMaps()[0]
    the_layers = the_map.listLayers()

    # Create the output path string by replacing the file extension.
    draft_path = re.sub(r"\.aprx$", ".sddraft", project_path)
    if exists(draft_path):
        AddMessage("Deleting preexisting file: %s" % draft_path)
        os.remove(draft_path)
    AddMessage("Creating %s from %s..." % (project_path, draft_path))
    # Create the web layer SDDraft file.
    try:
        # ArcGIS Pro < 2.0: Fails here with a RuntimeError that has no message
        # if ArcGIS Pro is not open and signed in to ArcGIS Online.
        CreateWebLayerSDDraft(the_layers,
                              draft_path,
                              service_name,
                              "MY_HOSTED_SERVICES",
                              "FEATURE_ACCESS",
                              folder_name=folder_name,
                              copy_data_to_server=True,
                              summary="Test service",
                              tags="test,traffic,traveler",
                              description="Test Service",
                              use_limitations="For testing only")
    except RuntimeError as ex:
        if ex.args:
            AddError("Error creating %s. %s" % (draft_path, ex.args))
        else:
            AddError("Error creating %s. No further info provided." %
                     draft_path)
    else:
        sd_path = re.sub(r"draft$", "", draft_path)
        if exists(sd_path):
            AddMessage("Deleting preexisting file: %s" % sd_path)
            os.remove(sd_path)
        service_definition = arcpy.server.StageService(draft_path)
        arcpy.server.UploadServiceDefinition(service_definition,
                                             "My Hosted Services")
Esempio n. 4
0
def save_layer_file(user: str, lyr_file_name: str):
    """Saves a layer file based on the user and version name.

    Parameters
    ----------
    user : str
        The user whose map contains the specified layer file
    lyr_file_name : str
        The name of the layer file that needs to be saved
    """

    aprx = ArcGISProject(config.aprx)
    user_map = aprx.listMaps(user)[0]
    lyr = user_map.listLayers(lyr_file_name)[0]
    lyr.saveACopy(f".\\.esri\\{lyr_file_name}.lyrx")
class MapLayoutHelper(object):
    """
    A helper object to initialize a project, layout, and a map for easy access.
    Usage:
        MapLayoutHelper('CURRENT')
    Constructor:
        project - (optional) The path to the ArcGIS Pro project or the text "CURRENT"
            if you are using an open proejct. The default is 'CURRENT'.
        layout - (optional) The name of the layout to initialize. The default
            is 'Template'
        map - (optional) The name of the map element inside the layout provided.
            The default is 'Map'
    """
    def __init__(self, project='CURRENT', layout='Template', map='Map'):
        from arcpy.mp import ArcGISProject
        self.project = ArcGISProject(project)
        self.layout = self.project.listLayouts(layout)[0]
        self.map = self.layout.listElements('MAPFRAME_ELEMENT', map)[0]
class MapLayoutHelper(object):
    """
    A helper object to initialize a project, layout, and a map for easy access.
    Usage:
        MapLayoutHelper('CURRENT')
    Constructor:
        project - (optional) The path to the ArcGIS Pro project or the text "CURRENT"
            if you are using an open proejct. The default is 'CURRENT'.
        layout - (optional) The name of the layout to initialize. The default
            is 'Template'
        map - (optional) The name of the map element inside the layout provided.
            The default is 'Map'
    """
    def __init__(self, project='CURRENT', layout='Template', map='Map'):
        from arcpy.mp import ArcGISProject
        self.project = ArcGISProject(project)
        self.layout = self.project.listLayouts(layout)[0]
        self.map = self.layout.listElements('MAPFRAME_ELEMENT', map)[0]
Esempio n. 7
0
    def add_to_aprx(self):
        """Adds the input layer to a .aprx Map based on the owner of the
        data. For example, the UTIL.wFitting feature would be added to the
        "UTIL" map of the designated .aprx file. The file path to the Pro
        project is set in the config file.
        """

        log.debug("Adding the layer to its edit aprx...")
        aprx = ArcGISProject(config.aprx)
        user_map = aprx.listMaps(f"{self.owner}")[0]
        user_map.addDataFromPath(self.aprx_connection)
        for map_lyr in user_map.listLayers():
            if self.feature_name in map_lyr.dataSource:
                layer = map_lyr
                break
        aprx.save()

        # Create group layer if it does not exist
        lyr_realpath = os.path.realpath(config.lyr)
        lyr_basename = os.path.basename(config.lyr)
        if self.version_name not in [x.name for x in user_map.listLayers()]:
            # Add to the map
            user_map.addLayer(LayerFile(lyr_realpath))
            aprx.save()
            # Rename the group layer to match the version name
            layer_name = lyr_basename.strip('.lyrx')
            for lyr in user_map.listLayers():
                if lyr.name == layer_name:
                    lyr.name = self.version_name
                    break

        # Move the data layer into the group layer
        group_layer = user_map.listLayers(self.version_name)[0]
        user_map.addLayerToGroup(group_layer, layer)
        user_map.removeLayer(layer)
        aprx.save()
Esempio n. 8
0
def publish(map_name,
            server,
            service_name=None,
            folder=None,
            schema_locks=False,
            overwrite=False,
            feature_access=False,
            feature_capabilities='Map,Query,Data',
            instance_count=1,
            project='CURRENT',
            server_type='STANDALONE_SERVER',
            service_type='MAP_SERVICE'):
    if not service_name:
        service_name = map_name

    # get the map
    sddraft_filename = f'{service_name}.sddraft'
    sddraft_output_filename = join(output, sddraft_filename)
    if type(project) == str:
        pro = ArcGISProject(project)
    else:
        pro = project
    mp = pro.listMaps(map_name)

    if not len(mp):
        AddError(f'could not locate map {map_name} in project {project}')
        return
    mp = mp[0]

    # create service draft and export to draft file
    AddMessage('Creating service draft...')
    service_draft = CreateSharingDraft(server_type, service_type, service_name,
                                       mp)
    service_draft.targetServer = server

    # set folder if necessary
    if folder:
        service_draft.serverFolder = folder

    service_draft.exportToSDDraft(sddraft_output_filename)

    # xml schema modifications
    # open the xml for potential modifications
    doc = read_draft(sddraft_output_filename)

    # set instance count
    set_instance_count(doc, instance_count)

    # enable feature service?
    if feature_access:
        enable_feature_access(doc, feature_capabilities)

    if not schema_locks:
        disable_locking(doc)

        if overwrite:
            enable_overwrite(doc)

    # save the modified xml
    write_draft(sddraft_output_filename, doc)

    # stage service
    AddMessage('Staging service...')
    sd_filename = f"{service_name}.sd"
    sd_output_filename = join(output, sd_filename)
    StageService_server(sddraft_output_filename, sd_output_filename)

    # share to server
    AddMessage('Uploading to server...')
    UploadServiceDefinition_server(sd_output_filename, server)
    AddMessage(f'Successfully published service {service_name} to {server}')
def get_layer_names(map="Map"):
    doc = ArcGISProject("current")
    m = doc.listMaps(map)[0]

    return [layer.name for layer in map.listLayers() if layer.visible and layer.isFeatureLayer]
def updateNonHostedServices(prj_path, map_list, sd_draft_path, conn_file,
                            server_folder):

    # set ArcGIS Project
    aprx = ArcGISProject(prj_path)

    # set up for reporting
    successList = []
    failList = []

    # loop through maps in the list
    for map_name in map_list:
        m = aprx.listMaps(map_name)[0]

        out_sddraft = join(sd_draft_path, map_name + ".sddraft")

        # remove sd draft if it exists already
        if exists(out_sddraft):
            Delete_management(out_sddraft)

        # Create MapServiceDraft and set service properties
        service_draft = CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE",
                                           map_name, m)
        service_draft.targetServer = conn_file
        service_draft.serverFolder = server_folder
        service_draft.overwriteExistingService = True  # toggle based on publishing/republishing

        try:

            # Create Service Definition Draft file
            service_draft.exportToSDDraft(out_sddraft)

            # Stage Service
            sd_filename = map_name + ".sd"
            sd_output_filename = join(sd_draft_path, sd_filename)

            # remove staged service if it exists
            if exists(sd_output_filename):
                Delete_management(sd_output_filename)

            # stage the serve
            StageService(out_sddraft, sd_output_filename)

            # Share to ArcGIS Server
            print("Uploading %s Service Definition..." % map_name)
            UploadServiceDefinition(sd_output_filename, conn_file, map_name,
                                    '', "FROM_SERVICE_DEFINITION",
                                    server_folder, "STARTED", "USE_DEFINITION",
                                    "NO_SHARE_ONLINE", "PRIVATE",
                                    "NO_SHARE_ORGANIZATION", None)

            successList.append(map_name)

            print("Successfully Uploaded service %s." % map_name)

        except Exception as e:
            # if there was an error, add what service failed and the error to the fail list
            failList.append(map_name + ": " + str(e))
            print("Failed publishing %s." % map_name)

    return [successList, failList]
 def __init__(self, project='CURRENT', layout='Template', map='Map'):
     from arcpy.mp import ArcGISProject
     self.project = ArcGISProject(project)
     self.layout = self.project.listLayouts(layout)[0]
     self.map = self.layout.listElements('MAPFRAME_ELEMENT', map)[0]
 def __init__(self, project='CURRENT', layout='Template', map='Map'):
     from arcpy.mp import ArcGISProject
     self.project = ArcGISProject(project)
     self.layout = self.project.listLayouts(layout)[0]
     self.map = self.layout.listElements('MAPFRAME_ELEMENT', map)[0]