# Issue with geojson layer in Perspective Map

**URL:** <https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141>\
**Category:** Ignition\
**Tags:** ignition83, perspective\
**Created:** [January 8, 2026, 12:32am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141 "2026-01-08T00:32:59Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 8, 2026, 12:32am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/1 "2026-01-08T00:32:59Z")

</div>

I am having an issue with Perspective Map and I wanted to see if anyone else has experienced this:

If I have a Map and I manually create the structure:

 ![2026-01-08_10-25](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/2/a2f1d48adbb0c40b0c7957aefee0baba0584505c.png)

The map loads fine.

If I bind `features` to anything and hit save, the map, in both the browser and designer, will show

 ![2026-01-08_10-26](https://us1.discourse-cdn.com/inductiveautomation/original/3X/3/b/3b882a05fc03b2edcaee6b036827893efcc87e95.png)

with the error: `can't access property "length", s.features is undefined`. This is also shown in the js console.

If I reload the web page it works again. It seems to only break on designer save.

If I set the prop to `Persistent`, that also seems to fix it.

Binding lower level props or the whole array (`layers.other.geoJSON[0]`) also seems to work fine.

Any thoughts? I’ll try sending this to support soon if this isn’t a me thing

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 8, 2026, 12:37am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/2 "2026-01-08T00:37:57Z")

</div>

I should add that the reason I want to bind `features` specifically is that this is easy to get from Postgresql, and I want to have a `styleOptions` field. Its nice when this field is known to Designer, rather than being set from a script, so that its easier to use

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [January 8, 2026, 12:58am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/3 "2026-01-08T00:58:57Z")

</div>

Bindings that require a callout to a DB or across the network will supply a null until the data arrives. You should place the binding on a custom property, and use `coalesce()` to substitute a default value for `features` until the null is replaced.

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 8, 2026, 3:57am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/4 "2026-01-08T03:57:14Z")

</div>

ahh, perfect! I thought there would be an easy way to do this. Thank you!

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 12, 2026, 11:09pm UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/5 "2026-01-12T23:09:54Z")

</div>

Sorry for an additional late reply, I had an alternative but worse solution when I posted this, and I’ve just gotten around to trying this properly.

I can’t get `coalesce` to work, or a `script` checking for `None`. I have the binding on a separate custom property as suggested, then I’ve tried:

- using using a property binding to get it onto layers.ui.other.geoJSON[2].features, with a transform
- using an expression binding with coalesce directly

As a test, I tried both of these targeting a binding of a blank array.

The only way I can get a binding (at the `features` level) to work is by also setting the `feature` to be `persistent`

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [January 12, 2026, 11:36pm UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/6 "2026-01-12T23:36:33Z")

</div>

I can't read your mind nor see how you applied or misapplied the `coalesce()` function. **Show us**.

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 18, 2026, 10:18pm UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/7 "2026-01-18T22:18:56Z")

</div>

Absolutely. I apologise as well for the infrequent replies, I’ve been under a bit of a time crunch. I’ll try and get you screenshots/code blocks. Thank you!

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [January 27, 2026, 7:49am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/8 "2026-01-27T07:49:21Z")

</div>

Thank you for your time and patience.

Here is a Map, with layers.other.geoJSON.0.features bound on the right:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/4/c47addd314681db4489945c0f805c483241ac71b.jpeg)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/1/4160df4cac3f77166427e7df7f92e53926804c1f.png)

I have `this.custom.array` as just an empty way as I wasn’t sure of the best way to return an array from this.

`this.custom.features` is bound to:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/b/5/b5b96c94ef05841acbc815ad3c43df83675cc992.png)

Upon saving this in Designer, the `can't access property "length", s.features is undefined` occurs. Refreshing the the browser does occasionally work, but not permanently.

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [February 26, 2026, 5:37am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/9 "2026-02-26T05:37:38Z")

</div>

I have also noticed this is happening on bindings just to custom tags: element with the binding is not persistent, it does not seem sticky.

I have a few things with nested flex containers that have `position.display` bound to `custom.on`. The custom is set to false. I’ve tried the `display` binding as just property and as an expression with: `coalesce({this.custom.test}, false)`. This appears to not be working because there is no value on first load (of `position.display` ) without persistent being set. Setting persistent allows the desired behaviour, which is no flashing on loading the view. This does not seem ideal, as this code is stored in git.

Any insight into how I’m using this wrong with what I’ve posted, or should I start talking through official channels?

---

<div class="post-metadata">

**Author:** ![Bushmatic](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bushmatic/32/87014_2.png) [@Bushmatic](https://forum.inductiveautomation.com/u/Bushmatic)\
**Post date:** [February 26, 2026, 6:13am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/10 "2026-02-26T06:13:58Z")

</div>

There is a brief window between `position.display` being evaluated (which will be `true` with persistence off) and when the custom properties are evaluated.

Not sure if this is best practice, but since you seem to want to avoid any persistent properties, my thought is you could create a startup script for this view that sets a custom property called `initialized` to `True`. This property doesn’t need a binding or a persistent value, and it will be null until the script sets it.

Your binding on `position.display` would be this expression:

```python
coalesce({this.custom.initialized}, false) && coalesce({this.custom.on}, false)

```

The unresolved state of both properties coalesces to false, so the component remains hidden until both resolve. This is untested but maybe worth a try.

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [February 26, 2026, 6:30am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/11 "2026-02-26T06:30:43Z")

</div>

Thank you for your response!

I had `position.display = coalesce({this.custom.test}, false)`, which seems like if the custom property hasn’t been evaluated, `position.display` will be false, like what you have suggested. But this isn’t what I have observed unfortunately.

> but since you seem to want to avoid any persistent properties,

I’m okay with a persistent value in this case, I just brought it up to help show that I can’t get `coalesce` to work. It is only for the db queries that persistent bothers me, cause that could be lots of data

---

<div class="post-metadata">

**Author:** ![Bushmatic](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bushmatic/32/87014_2.png) [@Bushmatic](https://forum.inductiveautomation.com/u/Bushmatic)\
**Post date:** [February 26, 2026, 6:34am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/12 "2026-02-26T06:34:10Z")

</div>

Yeah, if your current solution with coalesce doesn’t do it, what I posted wouldn’t functionally change anything. I have run into this issue a few times myself, and I think I was able to fudge it by applying a style class that fades in from 0% to 100% opacity. In the meantime I find myself having to make sure all my persistent values are set correctly before I save my projects, which is an extra step and prone to error here and there. Maybe you could look into mounting your query result somewhere else where this project can read it, instead of polling right then and there. Alternatively a startup script that writes initial values may work as well.

---

<div class="post-metadata">

**Author:** ![alluring-mushroom](https://avatars.discourse-cdn.com/v4/letter/a/d6d6ee/32.png) [@alluring-mushroom](https://forum.inductiveautomation.com/u/alluring-mushroom)\
**Post date:** [February 26, 2026, 7:07am UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/13 "2026-02-26T07:07:36Z")

</div>

Yeah, my workaround for the large db datasets is a script that reads from a binding and writes it over the correct prop.

I was hoping that @pturmel would be able to show me a mistake with the bindings to avoid that, as this seems likely to be a frequent thing to do, but you have said implies otherwise. Ahh, well, I shall stick with workarounds.

Thank you for your input!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 26, 2026, 1:46pm UTC](https://forum.inductiveautomation.com/t/issue-with-geojson-layer-in-perspective-map/113141/14 "2026-02-26T13:46:43Z")

</div>

I would use `coalesce({this.custom.features}, asList())`, but that requires my Integration toolkit. I suspect your coalesce is running even before the persistent array assignment is made.
