Need help with otm-legacy?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

126 Stars 62 Forks Other 1.4K Commits 22 Opened issues


OpenTreeMap is a collaborative platform for crowdsourced tree inventory, ecosystem services calculations, and community engagement. OpenTreeMap is a project of Azavea and Urban Ecos.

Services available


Need anything else?

Contributors list

OpenTreeMap Logo

Deprecated Repository

This repository contains the code for OTM1, the old version of the OpenTreeMap software (also known as OTM v1.0 through v1.3). Development is largely suspended on OTM1. "OTM2", available in another repository, is the newest, next-generation version of the OpenTreeMap software. If you're just getting started, we highly recommend starting with the OTM2 code - it has been re-engineered from the ground up and the target for all current and future development.

This OTM1 repository exists primarily for archival purposes.

Updates? Issues? Questions?

For updates join the announcement email list here: For issues or questions you can try mailing the user list: or connect with us via IRC at #opentreemap on freenode (

This is v1.3 of OpenTreeMap, the in development version.

Other Repositories

OpenTreeMap is also available for iOS and Android.

iOS app code is available at
Default graphics and config files for the OpenTreeMap iOS app are available at

Android app code is available at
A default skin is included in the repository, as are "howto.pdf" build instructions.

Installation Instructions

Required programs:

  • Webserver - Gunicorn is recommended
  • Database - Postgres 8.1 + postgis 1.5 is recommended (postgis 2.0+ is not yet supported)
  • Map tile renderer - GeoServer(java) on tomcat is recommended
  • SMTP service - sendmail is recommended
  • tile caching service - tilecache is recommended (port 8080 through apache)
  • Python 2.7

Required python libraries (installed via pip)

  • BeautifulSoup (3.2.0)
  • Django (1.3.4)
  • PIL (1.1.7)
  • South (0.7.5)
  • Unidecode (0.04.9)
  • django-badges (0.1.6)
  • django-debug-toolbar (0.9.1)
  • django-extensions (0.7.1)
  • django-pagination (1.0.7)
  • django-profiles (0.2)
  • django-shapes (0.2.0)
  • django-sorting (0.1)
  • django-tagging (0.3.1)
  • django-threadedcomments
  • django-pipeline (1.1.27)
  • feedparser (5.1)
  • geopy (0.94.1)
  • psycopg2 (2.4.1)
  • python-omgeo (1.4.1)
  • simplejson (2.3.2)
  • sorl-thumbnail (11.12)
  • template-utils (0.4p2)
  • wsgiref (0.1.2)
  • xlrd (0.7.1)
  • yuicompressor (

Optional libraries

  • gunicorn (0.14.3) (via pip)
  • libapache2-mod-wsgi (if you want to run with apache) (via apt)

Required libraries from aptitude

  • binutils
  • libgeos-3.2.0
  • libgeos-c1
  • libgdal1-1.6.0
  • libproj0
  • gdal-bin

Required libraries from the web

  • wget
  • wget
  • git clone git://
  • pip install django-pipeline==1.1.27


Fix to proj to deal with spherical mercator
    tar -xzf /proj-datumgrid-1.4.tar.gz
    cd proj-datumgrid-1.4
    nad2bin null < null.lla
                            sudo cp null /usr/share/proj
Get django-sorting and fix bug
    git clone git://
            Apply patch to django-sorting:
                    -including comment by Alsaihn
            sudo cp django_sorting -R /usr/local/lib/python2.6/dist-packages/django_sorting
Get django-shapes and remove HttpResponse call
    In shapes/views/ - zip-response method - change >
        # Stick it all in a django HttpResponse
        #response = HttpResponse(zip_stream, mimetype=mimetype)
        #response['Content-Disposition'] = 'attachment;' % file_name.replace('.shp','')
        #response['Content-length'] = str(len(zip_stream))
        #response['Content-Type'] = mimetype
        return zip_stream

Get django-reputation and fix default config and user bug svn checkout django-reputation cd django-reputation sudo cp django_reputation -R /usr/local/lib/python2.6/dist-packages/django_reputation Change default config and user bug: (b/c it doesn't seem to accept values in cd /usr/local/lib/python2.6/dist-packages/django_reputation In - In - change > .... relevant_reputation_actions = UserReputationAction.objects.filter(user=user).filter........ .... if expected_delta <= MAX_REPUTATION_GAIN_PER_DAY and expected_delta >= -1 * MAX_REPUTATION_LOSS_PER_DAY: delta = action_value elif expected_delta > MAX_REPUTATION_GAIN_PER_DAY: delta = 0 elif expected_delta < MAX_REPUTATION_LOSS_PER_DAY: delta = 0 ... Fix Tilecache TMS issue In tilecache/Services/ - change > ... elif len(parts) < 2: return self.serviceCapabilities(host, self.service.layers) else: + parts = parts[-5:] layer = self.getLayer(parts[1]) if len(parts) < 3: return self.layerCapabilities(host, layer) ...

USDA Grant

Portions of OpenTreeMap are based upon work supported by the National Institute of Food and Agriculture, U.S. Department of Agriculture, under Agreement No. 2010-33610-20937, 2011-33610-30511, 2011-33610-30862 and 2012-33610-19997 of the Small Business Innovation Research Grants Program. Any opinions, findings, and conclusions, or recommendations expressed on the OpenTreeMap website are those of Azavea and do not necessarily reflect the view of the U.S. Department of Agriculture.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.