25 Apr 2015

Offline Map Tiles with Mapbox-Studio and MOBAC

I just found I neat workaround on how to get your Mapbox projects (Mapbox is a free, fully customizeable Tool for map design) to any local tile storage format that it also available in MOBAC (MOBAC is a free software for the creation of local map tiles from variable sources, in a bunch of different formats, to be used on almost any mobile device)!

  • Get Mapbox-Studio and design your custom map
  • Upload your project to mapbox
  • Create an account and connect to it
  • Get your username, project ID and an access token, which are put to the URL for fetching the tiles back from the Mapbox server: http://api.tiles.mapbox.com/v4/your_username.your_project_id/{$z}/{$x}/{$y}.png?access_token=your_private_or_public_api_key

  • Use the following XML (replacing user, project ID and access token) for a custom mapsource in MOBAC.

    
    
     MAPBOX
     0
     18
     png
     None
     http://api.tiles.mapbox.com/v4/gimoya.ganok9hk/{$z}/{$x}/{$y}.png?access_token=pk.eyJ1IjoiZ2ltb3lhIiwiYSI6IkZrTld6NmcifQ.eY6Ymt2kVLvPQ6A2Dt9zAQ 
     #000000
    
    
  • 8 Apr 2015

    QspatiaLite Use Case: Find Number of Species from Point Data

    Here's a short follow up on some previous posting about the use of QspatiaLite for the aggregation of species distribution data. In this case the species data comes as a point layer. For each cell of a 1000 x 1000 m grid (1) the number of individuals per species, (2) the total number of individuals and (3) the number of different species should be calculated.


    There is a layer with 10 different species (variabel name is "sp") across the whole extent with names "1", "2", "3", .. , "10" and a layer with the grid cells (variable name = "id") numbered consecutively, from 1 to 150.

    In the attribute table of the below screenshot you see that I selected the grid cell with id=1 and the points (=species) within this cell. There are 8 individuals - "4", "5", "6" and "10" occure once, whereas "2" and "8" occure twice.

    The query table in the screenshot is the result for (3).


    For (1) you have to query for points/species within grid cells and group over grid cells and species and take the count from that aggregation
    SELECT
     t.gID AS gID,
     t.sp AS Sp,
     count(*) AS NrIndSp
    FROM (SELECT
      g.id AS gID, 
      s.sp AS sp
    FROM grid AS g JOIN Sp_distr AS s 
    ON within(s.Geometry, g.Geometry)
    ) as t GROUP BY t.gId, t.sp
    

    For (2) you simple need to query for points/species within grid cells and aggregate over grid cells:

    Select 
     t.gID,
     count(*) as NrInd
    From (SELECT
      g.id AS gID, 
      s.sp AS sp
    FROM grid AS g JOIN Sp_distr AS s 
    ON within(s.Geometry, g.Geometry)
    ) as t 
    GROUP BY t.gID 
    ORDER BY t.gID
    

    For (3) you'll first need to aggregate over grid cells and points/species, and then again aggregate over this query table by grid cells which will finally give you the distinct species!

    SELECT 
     v.gID,
     count(*) AS SpNr
    FROM (SELECT 
     t.gID,
     t.sp
    FROM (SELECT
      g.id AS gID, 
      s.sp AS sp
    FROM grid AS g JOIN Sp_distr AS s 
    ON within(s.Geometry, g.Geometry)
    ) as t GROUP BY t.gId, t.sp
    ) as v GROUP BY v.gId
    

    18 Feb 2015

    Python Processing Script for Splitting Layer and Saving each Feature to Shapefile

    A script for a common task: Split a Layer by distinct values of an attribute-field. The script will use the value for the name of the files and remove the field from the new files.

    Put this processing script to the appropiate director (in my case it's "C:\Users\Kay\.qgis2\processing\scripts") to make it work. Then it will be easily accessible from your processing toolbox.

    ##[User scripts]=group
    ##input=vector
    ##class_field=field input
    ##output=output file
    
    from qgis.core import *
    from PyQt4.QtCore import *
    from processing.core.VectorWriter import VectorWriter
    
    layer = processing.getObject(input)
    provider = layer.dataProvider()
    fields = provider.fields()
    class_field_index = layer.fieldNameIndex(class_field)
    
    fields.remove( class_field_index )
    
    inFeat = QgsFeature()
    outFeat = QgsFeature()
    inGeom = QgsGeometry()
    nElement = 0
    writers = {}
    
    feats = processing.features(layer)
    nFeat = len(feats)
    
    for inFeat in feats:
        progress.setPercentage(int(100 * nElement / nFeat))
        nElement += 1
        featAttr = inFeat.attributes()
        classField = featAttr[class_field_index]
    
        if classField not in writers:
            outputFile = output + '_' + classField + '.shp'
            writers[classField] = VectorWriter(outputFile, None, fields, provider.geometryType(), layer.crs())
            
        inGeom = inFeat.geometry()
        outFeat.setGeometry(inGeom)
        
        del featAttr[class_field_index]
        outFeat.setAttributes(featAttr)
            
        writers[classField].addFeature(outFeat)
    
    for writer in writers.values():
        del writer