def get_mapserver_data_string(self, filters=None, srid=4326): # Get base mapserver query. q, q_primary_alias, q_registry, q_entities = self.get_base_mapserver_query(filters=filters) # Register the necssary entity dependencies. for field in ['habitat_type.energy', 'habitat_type.substrate.id']: q = self.register_field_dependencies(q, q_registry, field) # Get specific entity aliases. ht_parent_str = self.get_field_parent_str('habitat_type.energy') ht_alias = q_registry[ht_parent_str] # Define labeled query components. # NOTE: for compatibility w/ PostGIS+Mapserver, select geometry as 'RAW' and explicitly specify SRID 4326. geom = func.ST_SetSRID(q_primary_alias.geom.RAW, 4326).label('hab_geom') geom_id = q_primary_alias.id.label('geom_id') substrate_id = ht_alias.substrate_id.label('substrate_id') energy = ht_alias.energy.label('energy') area = ht_alias.energy.label('area') # Select only the labeleld components defined above. q = q.with_entities(geom, geom_id, substrate_id, energy).order_by(desc(area)) # Get raw sql for query. q_raw_sql = sa_compile.query_to_raw_sql(q) # Add query into mapserver data string. mapserver_data_str = "hab_geom from (%s) AS subquery USING UNIQUE geom_id USING srid=%s" % (q_raw_sql, srid) return mapserver_data_str
def get_mapserver_data_string(self, result_field=None, filters=[], srid=4326): # Create filter for selecting value field. result_field_filter = { 'field': 'field', 'op': '==', 'value': result_field['field'] } # Get base mapserver query. q, q_primary_alias, q_registry, q_entities = self.get_base_mapserver_query(filters= filters + [result_field_filter]) # Create field definition for the 'value' column. # Note that we use density, rather than total value. value_field = { 'id': 'value', 'template': '{field:value}/{field:cell.area}', 'aggregate_funcs': result_field.get('aggregate_funcs', ['sum']) } # Register the value field. q = self.register_field_dependencies(q, q_registry, value_field.get('template', '{{field:{}}}'.format(value_field['id']))) value_field_entity = self.get_field_entity(q_registry, value_field) # Make labeled entity for aggregate function. func_name = value_field['aggregate_funcs'][0] aggregate_func = getattr(func, func_name) aggregate_entity = aggregate_func(value_field_entity).label("value_field") q_entities.add(aggregate_entity) # Register the necssary entity dependencies. for field in ['{field:cell.geom}']: q = self.register_field_dependencies(q, q_registry, field) # Get specific entity aliases. cell_parent_str = self.get_field_parent_str('cell.id') cell_alias = q_registry[cell_parent_str] # Define labeled query components. # NOTE: for compatibility w/ PostGIS+Mapserver, select geometry as 'RAW' and explicitly specify SRID 4326. geom = func.ST_SetSRID(cell_alias.geom.RAW, 4326).label('geom') geom_id = cell_alias.id.label('geom_id') # Select only the labeleld components defined above, grouping on cell. q = q.with_entities(geom, geom_id, aggregate_entity).group_by(cell_alias.id) # Get raw sql for query. q_raw_sql = sa_compile.query_to_raw_sql(q) # Add query into mapserver data string. mapserver_data_str = "geom from (%s) AS subquery USING UNIQUE geom_id USING srid=%s" % (q_raw_sql, srid) return mapserver_data_str