Select to view content in your preferred language

ArcPy Scalebar Implementation Issue

265
5
Jump to solution
02-07-2025 09:24 AM
YahyaMasri
Emerging Contributor

I am working on a standalone ArcPy script running FULLY out of the ArcGIS Pro application and I am running into an issue regarding the implementation of a scalebar. Currently, my script can add a scalebar however the scalebar says 0 KM and is a very small sliver shown below. I think the issue lies in the scalebar element not recognizing the map it's supposed to access. Previously this was not an issue when running the arcpy script in the ArcGIS Pro application since I used a line which include ("CURRENT") which helped the tools identify the map. If someone could help that would be great!

YahyaMasri_0-1738949041742.png

 

 

0 Kudos
1 Solution

Accepted Solutions
TonyAlmeida
MVP Regular Contributor

Try this,

 

scalebars = layout.listElements("MAPSURROUND_ELEMENT")
    sb = None
    for s in scalebars:
        if s.name == "Scale Bar":
            sb = s
            break

    if sb:
        print(f"Scalebar Found: {sb.name}")

        # Scalebar linked to the map frame
        if sb.mapFrame.name != mf.name:
            sb.mapFrame = mf  # map frame
            print(f"Scalebar linked to map frame: {mf.name}")

 

View solution in original post

5 Replies
DanPatterson
MVP Esteemed Contributor

you script wasn't posted


... sort of retired...
0 Kudos
YahyaMasri
Emerging Contributor
def mapLayout(map_title):
                            def MakeRec_LL(llx, lly, w, h):
                                xyRecList = [
                                    [llx, lly],
                                    [llx, lly + h],
                                    [llx + w, lly + h],
                                    [llx + w, lly],
                                    [llx, lly]
                                ]
                                array = arcpy.Array([arcpy.Point(*coords) for coords in xyRecList])
                                rec = arcpy.Polygon(array)
                                return rec

                            p = arcpy.mp.ArcGISProject(new_aprx_path)
                            lyt = p.createLayout(17, 11, 'INCH')
                            m = p.listMaps("Map")[0]

                            # Adjust the map frame to be larger
                            map_frame_width, map_frame_height = 14, 8  # Adjusted to make the map larger
                            map_frame_x = (17 - map_frame_width) / 2
                            map_frame_y = (11 - map_frame_height) / 2   # Adjusted for the larger map size

                            mf = lyt.createMapFrame(
                                MakeRec_LL(map_frame_x, map_frame_y, map_frame_width, map_frame_height),
                                m,
                                "New Map Frame"
                            )

                            #SCALEBAR
                            scale_bar_width = 2.5
                            scale_bar_height = 0.3
                            scale_bar_x = map_frame_x + 0.2
                            scale_bar_y = map_frame_y - 0.6
                            sbEnv = MakeRec_LL(scale_bar_x, scale_bar_y, scale_bar_width, scale_bar_height)

                            sbName = 'Scale Line 1 Metric'
                            sbStyle = p.listStyleItems('ArcGIS 2D', 'Scale_bar', sbName)[0]
                            sb = lyt.createMapSurroundElement(sbEnv, 'Scale_bar', mf, sbStyle, 'My Scale Bar')
                            sb.elementWidth = 3.5
0 Kudos
YahyaMasri
Emerging Contributor

I am working on a standalone ArcPy script running FULLY out of the ArcGIS Pro application and I am running into an issue regarding the implementation of a scalebar. Currently, my script can add a scalebar however the scalebar says 0 KM and is a very small sliver shown below. I think the issue lies in the scalebar element not recognizing the map it's supposed to access. Previously this was not an issue when running the arcpy script in the ArcGIS Pro application since I used a line which include ("CURRENT") which helped the tools identify the map. If someone could help that would be great!

Screenshot 2025-02-07 at 12.19.28 PM.png

0 Kudos
TonyAlmeida
MVP Regular Contributor

Try this,

 

scalebars = layout.listElements("MAPSURROUND_ELEMENT")
    sb = None
    for s in scalebars:
        if s.name == "Scale Bar":
            sb = s
            break

    if sb:
        print(f"Scalebar Found: {sb.name}")

        # Scalebar linked to the map frame
        if sb.mapFrame.name != mf.name:
            sb.mapFrame = mf  # map frame
            print(f"Scalebar linked to map frame: {mf.name}")

 

YahyaMasri
Emerging Contributor

Awesome, worked great! Thank you.

0 Kudos