OpenTreeMap is a collaborative platform for crowdsourced tree inventory, ecosystem services calculations, and community engagement. OpenTreeMap is a project of Azavea and Urban Ecos.
Python JavaScript HTML CSS PLpgSQL
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

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###

###Patches:### Fix to proj to deal with spherical mercator wget 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 wget 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 #response.write(zip_stream) 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 - <change values as needed>
        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)
                + 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.