I would like to get layers' description/properties without adding/creating the layer. Is it possible to get the all the info directly from the layer file (.lyr or .lyrx) in ArcGIS Pro SDK. It is fairly simple in ArcPy but I don't wanna switch between ArcPy and the SDK.
When I open a layer file I get something like this
Solved! Go to Solution.
You want to use the LayerDocument class.
Your workflow will be similar to that shown here in this code snippet: apply-symbology-to-a-layer-from-a-layer-file (there are also a number of other snippets on the LayerDocument reference page).
@CharlesMacleod Never mind, I figured it out.
QueuedTask.Run(() =>
{
LayerDocument lyrDocFromLyrxFile = new LayerDocument(layerPath);
var jsonfile = lyrDocFromLyrxFile.AsJson();
dynamic array = JsonConvert.DeserializeObject(jsonfile);
string nl = "\r\n";
var geometry = "Geometry : " + array.layerDefinitions[0].featureTemplates[0].tags.ToString() + nl;
var descriptionAll = array.binaryReferences[0].data.ToString();
var fufu = array.binaryReferences[0].uRI.ToString();
XmlDocument xmltest = new XmlDocument();
xmltest.LoadXml(descriptionAll);
string creationDate;
XmlNodeList xmlNodeListCreationDate = xmltest.GetElementsByTagName("CreaDate");
if (xmlNodeListCreationDate.Count > 0)
creationDate = "Creation Date : " + xmlNodeListCreationDate[0].InnerXml + nl;
else
creationDate = "Creation Date : No info" + nl;
string projection;
XmlNodeList xmlNodeListProjection = xmltest.GetElementsByTagName("projcsn");
if(xmlNodeListProjection.Count > 0)
projection = "Projection : " + xmlNodeListProjection[0].InnerXml + nl;
else
projection = "Projection : No info" + nl;
string tags;
XmlNodeList xmlNodeListTags = xmltest.GetElementsByTagName("keyword");
if (xmlNodeListTags.Count > 0)
tags = "Tags : " + xmlNodeListTags[0].InnerXml + nl;
else
tags = "Tags : No info" + nl;
string description;
XmlNodeList xmlNodeListDescription = xmltest.GetElementsByTagName("idAbs");
if (xmlNodeListDescription.Count > 0)
description = "Description : " + xmlNodeListDescription[0].InnerXml + nl;
else
description = "Description : No info" + nl;
string credit;
XmlNodeList xmlNodeListCredit = xmltest.GetElementsByTagName("idCredit");
if (xmlNodeListCredit.Count > 0)
credit = "Credit : " + xmlNodeListCredit[0].InnerXml + nl;
else
credit = "Credit : No info" + nl;
string limitation;
XmlNodeList xmlNodeListLimitation = xmltest.GetElementsByTagName("useLimit");
if (xmlNodeListCredit.Count > 0)
limitation = "Use Limitations: " + xmlNodeListLimitation[0].InnerXml + nl;
else
limitation = "Use Limitations : No info" + nl;
DescriptionTextBoxText = geometry + creationDate + projection + tags + description + credit + limitation;
});
You want to use the LayerDocument class.
Your workflow will be similar to that shown here in this code snippet: apply-symbology-to-a-layer-from-a-layer-file (there are also a number of other snippets on the LayerDocument reference page).
@CharlesMacleod Thanks for the reply. I was able to use this for .lyrx extension but it does not work for the .lyr. All my files are .lyr files.
for the .lyr extension layer files I get this
Do you know if there is a solution for this?
I will mark your answer as a solution anyway since it gives a solution to my question.
Hi Amadeus, i checked with the development team. Only JSON format is supported for LayerDocument. In Pro version 1.x, layer files with .lyr suffix could also be created with JSON format - hence the inclusion of both .lyr and .lyrx suffixes in the code example I referenced. The API reference for LayerDocument does correctly mention that .lyrx is the intended format.
Arcmap .lyr files, which are binary format, are not supported via LayerDocument. Therefore the only workaround would be to create the layer via LayerFactory (which I think u were trying to avoid).
@CharlesMacleod Thanks for the inquisition, yes unfortunately I dont have lyrx option at the moment. I will see if I can solve this in another way. I will share it here if I do.
I am using one of the .lyrx files to get the info from the layer document.
I was able to get geometry type by using JsonConvert.DeserializeObject(jsonfile)
but some of the info looks like in XML format
QueuedTask.Run(() => { LayerDocument lyrDocFromLyrxFile = new LayerDocument(layerPath); var jsonfile = lyrDocFromLyrxFile.AsJson(); dynamic array = JsonConvert.DeserializeObject(jsonfile); string nl = "\r\n"; var geometry = "Geometry: " + array.layerDefinitions[0].featureTemplates[0].tags.ToString() + nl; var description = "Description: " + array.binaryReferences[0].data + nl; //This is in XML how can I read child nodes and convert to string DescriptionTextBoxText = geometry + date.ToString(); });
//Is there way to get child nodes in string?
@CharlesMacleod Never mind, I figured it out.
QueuedTask.Run(() =>
{
LayerDocument lyrDocFromLyrxFile = new LayerDocument(layerPath);
var jsonfile = lyrDocFromLyrxFile.AsJson();
dynamic array = JsonConvert.DeserializeObject(jsonfile);
string nl = "\r\n";
var geometry = "Geometry : " + array.layerDefinitions[0].featureTemplates[0].tags.ToString() + nl;
var descriptionAll = array.binaryReferences[0].data.ToString();
var fufu = array.binaryReferences[0].uRI.ToString();
XmlDocument xmltest = new XmlDocument();
xmltest.LoadXml(descriptionAll);
string creationDate;
XmlNodeList xmlNodeListCreationDate = xmltest.GetElementsByTagName("CreaDate");
if (xmlNodeListCreationDate.Count > 0)
creationDate = "Creation Date : " + xmlNodeListCreationDate[0].InnerXml + nl;
else
creationDate = "Creation Date : No info" + nl;
string projection;
XmlNodeList xmlNodeListProjection = xmltest.GetElementsByTagName("projcsn");
if(xmlNodeListProjection.Count > 0)
projection = "Projection : " + xmlNodeListProjection[0].InnerXml + nl;
else
projection = "Projection : No info" + nl;
string tags;
XmlNodeList xmlNodeListTags = xmltest.GetElementsByTagName("keyword");
if (xmlNodeListTags.Count > 0)
tags = "Tags : " + xmlNodeListTags[0].InnerXml + nl;
else
tags = "Tags : No info" + nl;
string description;
XmlNodeList xmlNodeListDescription = xmltest.GetElementsByTagName("idAbs");
if (xmlNodeListDescription.Count > 0)
description = "Description : " + xmlNodeListDescription[0].InnerXml + nl;
else
description = "Description : No info" + nl;
string credit;
XmlNodeList xmlNodeListCredit = xmltest.GetElementsByTagName("idCredit");
if (xmlNodeListCredit.Count > 0)
credit = "Credit : " + xmlNodeListCredit[0].InnerXml + nl;
else
credit = "Credit : No info" + nl;
string limitation;
XmlNodeList xmlNodeListLimitation = xmltest.GetElementsByTagName("useLimit");
if (xmlNodeListCredit.Count > 0)
limitation = "Use Limitations: " + xmlNodeListLimitation[0].InnerXml + nl;
else
limitation = "Use Limitations : No info" + nl;
DescriptionTextBoxText = geometry + creationDate + projection + tags + description + credit + limitation;
});