Select to view content in your preferred language

Tvorba webové mapy ze souboru JSON pomocí ArcGIS API for Python

657
0
11-23-2022 11:50 AM
DavidDaveNovak
Esri Contributor
0 0 657

JSON -> Web Map

Kromě klasického grafického prostředí pro vytváření obsahu v aplikacích, jako je ArcGIS Pro nebo MapViewer, může být pro určitý druh práce vhodné vytvořit webovou mapu pomocí skriptování. Hlavní roli při vytváření obsahu touto cestou hraje soubor JSON a funkce gis.content.add v samotném ArcGIS API for Python. Není tedy potřeba použít modul arcpy. 

 

Varianty tvorby webové mapy pomocí souboru JSON

Proces přidávání samotného JSON souboru lze rozdělit na dvě větve.

  • Prvním způsobem je použít již existující JSON soubor, který jsme si buď samostatně vytvořili a předem zvlášť upravili, nebo jsme ho získali jiným způsobem – například pomocí prostředí ArcGIS Online Assistant, nebo stažením z již existující mapy, což bude tématem druhého dílu této minisérie. 
  • Druhým způsobem je určování JSON datové struktury přímo v procesu samotného skriptu. Díky tomu můžeme v rámci skriptu snadněji měnit určité parametry a lépe tak ovlivňovat celkový vzhled výsledné mapy. Pro usnadnění doporučuji při definování vlastního JSON dokumentu využít některý z existujících JSON souborů a na jeho základě upravit nebo přidat požadované vlastnosti. Zde přidávám odkaz na ukázku specifikace mapového JSON souboru.

     

První způsob

V první ukázce si znázorníme jednoduchý postup, jak například v prostředí ArcGIS Notebooks načíst JSON soubor, na jehož základě se vytvoří samotná webová mapa.

 

  • První krok – Import potřebných modulů

 

from arcgis.gis import GIS
from arcgis.mapping import WebMap
import json

 

DavidDaveNovak_1-1669229629437.png

  • Druhý krok – Přihlášení do prostředí, v rámci kterého chceme obsah spravovat

Pomocí vyplnění údajů Portálu nebo ArcGIS Online se přihlásíme a vytvoříme potřebnou konektivitu pro správu obsahu.

 

gis = GIS("https://machine.domain.com/portal","adminuser")
print ("Úspěšné přihlášeno do GIS: ", gis)

 

DavidDaveNovak_4-1669230264946.png

  • Třetí krok – Načtení souboru JSON ze souborů v rámci ArcGIS Notebooks

V případě, že jsme soubor již vytvořili, stáhli nebo od někoho získali, z lokálního úložiště ArcGIS Notebooks načteme soubor do proměnné data.

 

with open('nova_mapa2.json') as json_data:
	data = json.load(json_data)

 

DavidDaveNovak_5-1669230502505.png

Zde je názorná ukázka lokální správy souborové hierarchie v ArcGIS Notebooks.

DavidDaveNovak_6-1669230600537.png

 

  • Čtvrtý krok – Vytvoření nové mapy

V posledním kroku vyplníme metadatové údaje pro novou mapu a jako parametr text vložíme proměnnou s daty z JSON souboru.

Nová mapa bude přidána pomocí funkce gis.content.add s parametrem vlastností nového prvku.

 

 

vlastnosti_noveho_prvku = {"type": "Web Map","title": "Zkouska_JSON_generovani","tags": ["JSON","MAPA","test"],"snippet":"Toto je zkouska", "text":data}
nova_mapa = gis.content.add(item_properties = vlastnosti_noveho_prvku)
nova_mapa

 

DavidDaveNovak_7-1669230713589.png

Tímto vznikne nová mapa v našem obsahu a můžeme s ní dále pracovat jako s běžným obsahem.

 

Druhý způsob

Pomocí prvního způsobu jsme si ukázali, jak využít existující JSON soubor pro vytvoření webové mapy. Nyní tento proces rozšíříme tak, že místo načítání dat z třetího kroku budeme definovat JSON soubor přímo v rámci Python skriptu. Ostatní kroky zůstanou nezměněny.

  • První krok – Import potřebných modulů

Stejný proces jako v prvním způsobu.

 

from arcgis.gis import GIS
from arcgis.mapping import WebMap
import json

 

  • Druhý krok – Přihlášení do prostředí, v rámci kterého chceme obsah spravovat

Stejný proces jako v prvním způsobu.

 

gis = GIS("https://machine.domain.com/portal","adminuser")
print ("Úspěšné přihlášeno do GIS: ", gis)

 

  • Třetí krok – Definování nového JSON zápisu pro vytvoření webové mapy

Třetí krok je odlišný způsobem naplnění datové proměnné. Soubor JSON lze upravit přímo v rámci skriptu.

Zde bych rád upozornil, že v prostředí ArcGIS Notebooks jsou hodnoty True a False požadovány s velkým počátečním písmem. Při kopírování z jiných souborů doporučujeme pro rychlou úpravu např. hromadné nahrazení v textovém editoru.

 

data2={
    "operationalLayers": [
        {
            "id": "baeeb5ce480d42f79f3c8b8ef5ffafb0",
            "title": "Hranice kraje",
            "visibility": True,
            "blendMode": "normal",
            "opacity": 0.6,
            "layerDefinition": {
                "minScale": 3000000,
                "maxScale": 200,
                "geometryType": "esriGeometryPolyline",
                "objectIdField": "OBJECTID",
                "drawingInfo": {
                    "renderer": {
                        "type": "simple",
                        "symbol": {
                            "type": "esriSLS",
                            "style": "esriSLSSolid",
                            "color": [
                                115,
                                178,
                                255,
                                255
                            ],
                            "width": 3
                        }
                    },
                    "scaleSymbols": True
                }
            },
            "url": "https://ags.cuzk.cz/arcgis/rest/services/DATA200/MapServer/1",
            "layerType": "ArcGISFeatureLayer",
            "popupInfo": {
                "title": "{F_CODE}",
                "mediaInfos": [],
                "popupElements": [
                    {
                        "fieldInfos": [
                            {
                                "fieldName": "OBJECTID",
                                "isEditable": False,
                                "format": {
                                    "places": 0,
                                    "digitSeparator": False
                                },
                                "visible": True,
                                "label": "FID"
                            }
                        ],
                        "type": "fields"
                    }
                ],
                "fieldInfos": [
                    {
                        "fieldName": "OBJECTID",
                        "isEditable": False,
                        "format": {
                            "places": 0,
                            "digitSeparator": False
                        },
                        "visible": True,
                        "label": "FID"
                    }
                ],
                "expressionInfos": []
            },
            "disablePopup": False,
            "showLegend": True
        },
        {
            "id": "0a58edd50e434c9ab1841674e21f9e31",
            "title": "Hranice státního území",
            "visibility": True,
            "blendMode": "normal",
            "opacity": 0.6,
            "layerDefinition": {
                "minScale": 20000000,
                "maxScale": 2000,
                "geometryType": "esriGeometryPolyline",
                "objectIdField": "OBJECTID",
                "drawingInfo": {
                    "renderer": {
                        "type": "simple",
                        "symbol": {
                            "type": "esriSLS",
                            "style": "esriSLSSolid",
                            "color": [
                                0,
                                92,
                                230,
                                255
                            ],
                            "width": 3
                        }
                    },
                    "scaleSymbols": True
                }
            },
            "url": "https://ags.cuzk.cz/arcgis/rest/services/DATA200/MapServer/0",
            "layerType": "ArcGISFeatureLayer",
            "popupInfo": {
                "title": "{F_CODE}",
                "mediaInfos": [],
                "popupElements": [
                    {
                        "fieldInfos": [
                            {
                                "fieldName": "OBJECTID",
                                "isEditable": False,
                                "format": {
                                    "places": 0,
                                    "digitSeparator": False
                                },
                                "visible": True,
                                "label": "FID"
                            }
                        ],
                        "type": "fields"
                    }
                ],
                "fieldInfos": [
                    {
                        "fieldName": "OBJECTID",
                        "isEditable": False,
                        "format": {
                            "places": 0,
                            "digitSeparator": False
                        },
                        "visible": True,
                        "label": "FID"
                    }
                ],
                "expressionInfos": []
            },
            "disablePopup": False,
            "showLegend": True
        }
    ],
    "baseMap": {
        "baseMapLayers": [
            {
                "id": "b6f3ad9fceab4b998b616d94c88a80c9",
                "title": "Stínování světa",
                "visibility": True,
                "blendMode": "normal",
                "opacity": 1,
                "url": "https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer",
                "layerType": "ArcGISTiledMapServiceLayer"
            },
            {
                "id": "94f9329b4b45460f83776790bbe9a2b7",
                "title": "Topografická mapa světa",
                "visibility": True,
                "blendMode": "normal",
                "opacity": 1,
                "type": "VectorTileLayer",
                "styleUrl": "https://cdn.arcgis.com/sharing/rest/content/items/d719b8cf0243444b96c28d19dc2048c4/resources/styles/root.json",
                "layerType": "VectorTileLayer"
            }
        ],
        "title": "Stínování světa"
    },
    "spatialReference": {
        "wkid": 102100,
        "latestWkid": 3857
    },
    "initialState": {
        "viewpoint": {
            "targetGeometry": {
                "xmin": 1451595.9589885038,
                "ymin": 6385965.810142212,
                "xmax": 1745737.0293287265,
                "ymax": 6596682.049613636,
                "spatialReference": {
                    "wkid": 102100,
                    "latestWkid": 3857
                }
            }
        }
    },
    "version": "2.25",
    "authoringApp": "ArcGIS Pro",
    "authoringAppVersion": "13.0,2.36056",
    "tables": []
}

 

 

  • Čtvrtý krok – Vytvoření nové mapy

Stejný proces jako v prvním způsobu.

 

vlastnosti_noveho_prvku = {"type": "Web Map","title": "Zkouska_JSON_generovani2","tags": ["JSON","MAPA","test"],"snippet":"Toto je zkouska", "text":data}
nova_mapa = gis.content.add(item_properties = vlastnosti_noveho_prvku)
nova_mapa

 

 

Nyní v ArcGIS Online vznikla nová, druhá mapa a můžeme s ní dále pracovat jako s běžným obsahem.

 

Položka obsahuje všechny parametry a vrstvy, které jsme definovali v rámci našeho JSON souboru.

DavidDaveNovak_8-1669231197796.png

A takto vypadá naše mapa, která obsahuje hranice krajů a České republiky. Můžete si například ověřit, že modrá a světle modrá barva odpovídají nadefinovanému kódu v rámci souboru JSON.

DavidDaveNovak_9-1669231207788.png

Vytvoření druhé mapy je závěr tohoto prvního dílu z minisérie práce s JSON soubory. V další části se podíváme na způsob hromadného stahování obsahu pomocí ArcGIS API for Python.

Celý skript z této ukázky je zde k dispozici ke stažení jako zazipovaný Python Notebook.