Hi Anjo,

Yes, you can style resources based on concept values.  Here are the steps:

1. Using a PostgreSQL tool (like PGAdmin, Navicat, or the command line) 
confirm that Arches has loaded a materialized view called 
mv_geojson_geoms.  This view collects all the geometries for all resource 
model in Arches.  It includes the instance id, geometry, and node id for 
every resource instance for every model in Arches.  If your version of 
Arches doesn't have it, it looks like this:

SELECT t.tileid,
    t.resourceinstanceid,
    n.nodeid,
    
(st_transform(st_setsrid(st_geomfromgeojson(((json_array_elements((((t.tiledata)::json
 
-> (n.nodeid)::text) -> 'features'::text)) -> 'geometry'::text))::text), 
4326), 900913))::geometry(Geometry,900913) AS geom
   FROM (tiles t
     LEFT JOIN nodes n ON ((t.nodegroupid = n.nodegroupid)))
  WHERE ((( SELECT count(*) AS count
           FROM jsonb_object_keys(t.tiledata) 
jsonb_object_keys(jsonb_object_keys)
          WHERE (jsonb_object_keys.jsonb_object_keys IN ( SELECT 
(n_1.nodeid)::text AS nodeid
                   FROM nodes n_1
                  WHERE (n_1.datatype = 
'geojson-feature-collection'::text)))) > 0) AND (n.datatype = 
'geojson-feature-collection'::text))



2. You will write a view that references mv_geojson_geoms to identify (in 
your case) all instances where the condition type is not null.  Here is an 
example of a view that finds all buildings with "Grade I" protection type:

SELECT row_number() OVER () AS gid,
    mv.tileid,
    mv.resourceinstanceid,
    mv.nodeid,
    mv.geom,
    (name_tile.tiledata ->> '677f303d-09cc-11e7-9aa6-6c4008b05c4c'::text) 
AS name,
    'Grade I Listed Building' AS protection
   FROM ((mv_geojson_geoms mv
     LEFT JOIN tiles type_tile ON ((mv.resourceinstanceid = 
type_tile.resourceinstanceid)))
     LEFT JOIN tiles name_tile ON ((mv.resourceinstanceid = 
name_tile.resourceinstanceid)))
  WHERE (((type_tile.tiledata ->> 
'4ca32698-fa12-11e6-9e3e-026d961c88e6'::text) = 
'bc908dbc-45ff-426c-8713-f622907730ab'::text) AND ((name_tile.tiledata ->> 
'677f303d-09cc-11e7-9aa6-6c4008b05c4c'::text) IS NOT NULL))

A few things to note here:
a. the type_tile.tiledata ->> 
''4ca32698-fa12-11e6-9e3e-026d961c88e6'::text   is used to identify the 
concept node that you are interested in.  In your case, this would be the 
id of the Condition Type node in your model.  You can use the json 
representation of the your model (e.g.: export your model and use a text 
editor to open it) to find the node id

b. the = 'bc908dbc-45ff-426c-8713-f622907730ab'::text  is used to identify 
the id of the concept you want to match.  In your case this would be the id 
of the concept you want to match (e.g.: "good").  This value may be in the 
model json that you used to find the concept id.  Or you can use the 
concepts.json file that came with the mapping file that you used to import 
data into Arches.  (note that you can re-create this file by going to your 
resource model in Arches Designer, click on manage, and select create 
mapping file)

c. In this example, the name_tile.tiledata is used to identify the node in 
the model that you use to name your instance. 
 

3.  Once you have the view working, you can create a layer using Arches 
built-in map server.  Here's an example of a simple json configuration for 
the view:

{
"type": "vector",
"name": "Grade I Buildings",
"layers": [{
"id": "grade_i_buildings",
"type": "circle",
      "minzoom": 11,
"maxzoom": 21,
"source": "grade_i_buildings",
"source-layer": "grade_i_buildings",
"layout": {
"visibility": "visible"
},
"paint": {
"circle-radius": {
            "stops": [
                [11, 2],
                [15, 8],
                [21, 50]
            ]
        }
,
"circle-color": "rgba(58, 171, 209,0.25)",
"circle-stroke-color": "rgb(58, 171, 209)",
          "circle-stroke-width": 1
}
}],
"config": {
"provider": {
"class": "TileStache.Goodies.VecTiles:Provider",
"kwargs": {
"dbinfo": {
"host": "localhost",
"user": "postgres",
"password": "postgis",
"database": "her_lincoln",
"port": "5432"
},
"simplify": 0.5,
"queries": [
"select gid as __id__, name as __name__, geom as __geometry__ from 
grade_i_buildings"
]
}
},
"allowed origin": "*",
"compress": true,
"write cache": false
}
}

You can add this layer to Arches as an overlay using the following command:

python manage.py packages -o add_tileserver_layer -t 
~dwuthrich/arches/packages/lincoln_release/map_layers/tile_server/overlays/grade_i_buildings/grade_i_buildings.json
 
-n "Grade I Buildings"

(obviously, you'll need to replace this path and file name in this example 
with your own path/file)


4.  You can now go to Arches map manager, navigate to overlays, and view 
your layer.  Note that you can click on the "service styling" tab and then 
click on the black area to see the json used to style your data.  If you 
copy this json, you can paste it into any basemap (or other overlay) style 
in Arches.  In this way, you could automatically add your styled data to a 
basemap, or aggregate multiple overlays into a single overlay or basemap.


I hope this helps.

Cheers,

Dennis


On Friday, April 27, 2018 at 12:31:45 PM UTC-7, Anjo Weichbrodt wrote:
>
> Hi,
>
> I would like to represent geometries of resources in different colors 
> depending on their attributes.
> Example: there is the resource "Wall" which has the "Condition Type"s *good, 
> fair, poor*. Is it possible to represent all walls with *good* condition 
> green, *fair* condition orange and *poor* condition red?
>
> Thank you!
> Anjo
>

-- 
-- To post, send email to archesproject@googlegroups.com. To unsubscribe, send 
email to archesproject+unsubscr...@googlegroups.com. For more information, 
visit https://groups.google.com/d/forum/archesproject?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Arches Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to archesproject+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to