Overview

FieldMapper is a Cordova-powered Android app that facilitates the collection of geo-referenced data in fieldwork contexts. Essentially, FieldMapper's interface lets you create objects with user-generated attributes on a map. The data can then be exported into GIS software and further processed. FieldMapper offers the opportunity of creating either point objects or freehand-drawn line objects, which enables users to utilize the app in all contexts where place-specific information needs to be transformed into a computer-processable data set. On top of that, you can import your own layers and fine-tune the user experience with a variety of options.

The documentation covers all relevant topics from importing layers to post-processing the data. Before jumping right into it, I recommend familiarising yourself with the map interface first. You can find a clickable screenshot of the app with explanations on the landing page.

Contributions to the project are most welcome. If you think the app lacks an important feature or its scope should be broadened to render different use cases possible, I'd be happy to make this work. Also, if you encounter bugs or struggle with the usage of the app, just drop me a line. I'm eager to hear from you if you have used the app in your project. Please provide reference to FieldMapper where possible.


Use Cases

FieldMapper comes in handy when it matters to you where the phenomena you are trying to capture take place. Two general use cases come to mind:

  1. Observation of spatially bounded systems
    I developed the prototype of the app in preparation for my Bachelor's dissertation research project where I conducted fieldwork in a neighbourhood park. Among other things, I used the app to count visitors and the frequency of certain demographic variables. Because all data gathered through FieldMapper is tagged with coordinates, one can easily detect spatial patterns and clusters of phenomena with it. Users can add custom buttons to the map UI, which makes it possible to work with custom variables. Another feature that appears to be especially useful in the study of social networks is the "group" functionality which enables users to mark interaction between actors. Yet, usage of the app is not limited to social research as it would be possible to as well survey abiotic components of systems.[1]

  2. Mapping social routines and perception of place in social research
    Apart from observing visitors, I also employed the app in the context of interviews. Visitors were asked to mark their home, areas they consider to be unsafe or their preferred spot under certain circumstances. With FieldMapper, I was able to quantify the share of visitors living nearby and to calculate mean distances from their homes to the park surveyed and other places of interest. In contexts like this, the ability to draw polylines freehand (which can be transformed into polygons using GIS software) proves especially useful. Color codes, timestamps and free text comments are on hand for metadata tagging.


Variable Management

Overview

As your aim is to collect data that suits your research question, you probably want to work with a custom set of variables tailored to your case. These variables will actually determine the attributes of objects that you add to the map. Once you have clicked on Variable Management in the settings tab, you are prompted to add a variable. Now just enter the name of the new variable and press enter. The variable shows up in the list below. Next to its name you can see three buttons: by pressing and dragging the left button, you can re-order the list of variables. Changes will also affect the order of buttons added to the map UI. The middle button lets you edit the variable values and change the appearance of the corresponding button. The right button will delete the variable. You can delete all variables at once by clicking on the three dots in the upper right corner and choosing "Clear variables". Note that, if you do not edit the variable, it will be operationalized as a boolean variable by default (see below).

Choosing the right type

If you click on the edit button, a page opens up that allows you to change the type, value and icon of the variable (button). First decide which kind of data you want to encode. Type Boolean generates a single button that can be activated and deactivated. Of these two button states, active means "true" and inactive means "false". This kind of button makes most sense when the attribute only has two possible states (dichotomous variable) and state 1 is the negation of state 2, for instance "wears hat/doesn't wear hat" (if you are only interested whether someone wears a hat and not which kind of hat). If you name the variable "Hat" or "Wears hat" and choose Boolean as the variable type, "Hat" can be either "true" or "false". If "true"/"false" does not make sense but you still want to operationalize the attribute as a dichotomous variable, you can choose Custom binary. Now enter two comma-separated values. The first value will correspond to an inactive button. As with most things, you can operationalize an attribute in more than one way. Instead of the following configuration ...

Name Type Values
Hat Boolean (true, false)

... you could also encode the same information with this configuration:

Name Type Values
Hat Custom Binary doesn't wear one, wears one

In most cases, working with boolean variables (where reasonable) will make things easier.

Aside from these, you can also encode information that does not fit a binary scheme. Imagine you are interested in the type of hat a person is wearing. As there are more than two kinds of hats, both other variable types do not work. Therefore, we need to choose type Non-dichotomous and enter all possible attribute states we are interested in. In our case those could be "Sombrero", "Beanie" and "Kippah". Unlike the binary types, this will generate not a single button with two states (active and inactive) but a bar of length n = number of states/values.

Using custom icons

Enable the Use SVG/PNG icon option to upload your own icons. If the option is disabled, the first two letters of the variable name (if boolean or binary) or values (if non-dichotomous) will show up as the button icon (which will suffice for most purposes if you do not have a couple of variables that share the same initial letters or care much about a visual representation of the attributes.)

You can find free SVG icons in icon libraries such as FontAwesome or Ionicons. Download them to your device and upload them using the dedicated function in the edit menu of the variable.


Options

Toolbars

Configure which toolbars you want to have in the map interface by switching on and off the different toolbar options. Have a look at the interface guide on the landing page to find out about the purpose of the different controls.

Other

Some options may only appear after you enable/disable particular toolbars.

  • Allow deletion of imported objects:

    If you have imported your own layers, here you can determine whether you want those to be affected when you delete objects on the map (for example with the clear button).

  • Include imported layers in export:

    Similarly, here you can decide whether you want to include imported layers when you save the map state as GeoJSON. (Imported layers will be saved as a separate file anyway.)

  • Enable comments:

    Choose whether you want to have a prompt pop up which asks you to add additional information on the object after you add an object to the map.

  • Only group objects of same geometry type:

    If you have enabled the "group" functionality, you can determine whether the algorithm should distinguish between points and lines when automatically assigning group membership to objects. If enabled, points and lines can't be in the same group (which leads to groups like p/number/ and l/number/), if disabled they can be (/number/ without l or p).

  • Automatically choose random color for groups:

    If enabled, the color bar disappears from the map interface and the app will iterate over the colors (see below) and automatically colorize objects belonging to the same group with the same color.

Colors

Choose which colors you want to have in the game. Will affect both automatic (see above) and manual coloring of objects.


Layer Management

Overview

FieldMapper allows you to import your own layers. It accepts both GeoJSON layers and image overlays. The basic process of adding and editing layers is the same as for variables, so have a look at the Variable Management section if you struggle with the basics.

GeoJSON and Image Overlay

FieldMapper can handle two types of layers: GeoJSON and Image Overlay. GeoJSON is based on the JSON format and looks as follows:


{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "color": "green"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          13.38778495788574,
          52.515803012883595
        ]
      }
    }
  ]
}

If your imported GeoJSON objects have a color attribute in their properties, FieldMapper will automatically style them accordingly.

FieldMapper can also handle images as layers which you might want to import to account for more complex stylings that GeoJSON is not capable of capturing. If you want to import an image overlay, you need to provide the bounds of the area the image is meant to represent.

QGIS has an "export as image" function. If you want to export a layers as an image so it can be imported into FieldMapper, follow these steps (tested with QGIS 3.8):

  1. Draw on top of a OSM layer or create your custom layers a different way.

  2. Create a extent layer enclosing all relevant layers (in a spatial sense) and extract the layer extent (Vector > Research Tools > Extract Layer Extent...).

  3. Go to the attribute table of the resulting layer. You can now extract a pair of coordinates representing two diagonally opposite corners of the image layer that you will be asked to provide in the edit menu of FieldMapper: <MINX>, <MINY> and <MAXX>, <MAXY>. Make sure the coordinates are in WGS84 decimal degree format.

  4. Select File > Import/Export > Export Map to Image. Calculate the extent using your extent layer and click save.


Data Handling

FieldMapper exports GeoJSON files which can be accessed under data/io.github.fieldmapperapp/files/exports. All the attributes added via the Variable Management interface are stored as properties of the exported objects. You can access these attributes in the attribute table of the layer after importing the layers into GIS software (e.g. QGIS). After loading the export layers into GIS software, you can perform all kinds of queries on the data, for example calculating the mean distance between or Moran's I for points or rendering a heat map.[2] With FieldMapper you can only create points and lines. Lines can be transformed into polygons really easy with the help of GIS software. In QGIS (tested with v3.8), just use the Polygonize function which can be accessed via Vector > Geometry Tools > Lines to Polygons.

Every object added to the map has a timestamp which serves as a unique ID (if you prefer a numerical ID you can easily generate it from the timestamps with Excel, Python or whichever software/language you use). All exported layers also have a timestamp in their file name. The layer timestamp is helpful in integrating FieldMapper outputs with other timecoded datasets such as those generated by digital questionnaires. If FieldMapper plays a part in an interview procedure where you gather textual data (with a questionnaire) and geodata (with FieldMapper), you can computationally establish cross-dataset object reference on the basis of the timestamps. You can further link questionnaire items to FieldMapper objects either with color codes (establish conventions where you define that the item "Where do your live?" corresponds to blue objects beforehand) or by using the comments function and providing an textual item reference (code). If you have a fixed interview procedure and the same number of objects per item in every iteration of the procedure you could also use the timetags to get item reference.


[1]: Note that the app has difficulty mapping processes such as the movement of actors in space. If you repeat surveying the same place, you can of course record changes in the number and location of actors. Every object placed on the map has a timestamp that acts as its unique ID. Accordingly, you will have trouble identifying object A at place B in dataset 2 as the same object A that was located 5 m left of B in dataset 1. If you're dealing with a multitude of moving actors, it is unlikely that you are able to map (even discrete) movement anyway. If your survey only covers a limited number of (hardly mobile) actors you might be able to keep track of change in a system by re-importing a layer depicting a prior state and moving markers manually and deleting/adding markers where necessary.

[2]: You can style point layers as heat maps in QGIS (tested with v3.8) by choosing "heat map" in the Symbology section of the Layer Properties menu. If the input layers are polygons and you want to calculate the heat from the degree of overlapping, generate random points in the polygons first (Vector > Research Tools > Random Points inside Polygons).