Codebase list python-pyproj / fe5cb06
New upstream version 3.0.1~rc0 Bas Couwenberg 3 years ago
41 changed file(s) with 510 addition(s) and 311 deletion(s). Raw diff Collapse all Expand all
132132 "profile": "https://github.com/djhoese",
133133 "contributions": [
134134 "review",
135 "ideas"
135 "ideas",
136 "platform"
136137 ]
137138 },
138139 {
407408 "contributions": [
408409 "test"
409410 ]
411 },
412 {
413 "login": "underchemist",
414 "name": "Yann-Sebastien Tremblay-Johnston",
415 "avatar_url": "https://avatars1.githubusercontent.com/u/5283998?v=4",
416 "profile": "https://medium.com/@underchemist",
417 "contributions": [
418 "doc"
419 ]
420 },
421 {
422 "login": "odidev",
423 "name": "odidev",
424 "avatar_url": "https://avatars2.githubusercontent.com/u/40816837?v=4",
425 "profile": "https://github.com/odidev",
426 "contributions": [
427 "platform"
428 ]
410429 }
411430 ],
412431 "contributorsPerLine": 7
+0
-2
.gitattributes less more
0 proj.4/src/* linguist-vendored
1 nad2bin.c linguist-vendored
0 contact_links:
1 - name: Ask questions
2 url: https://github.com/pyproj4/pyproj/discussions
3 about: Please ask and answer questions here.
4 - name: Ask questions from the GIS community
5 url: https://gis.stackexchange.com/questions/tagged/pyproj
6 about: To get answers from questions in the GIS commminuty, please ask and answer questions here with the pyproj tag.
+0
-13
.github/ISSUE_TEMPLATE/question.md less more
0 ---
1 name: Question
2 about: Please search existing issues or GIS Stack Exchange (https://gis.stackexchange.com/questions/tagged/pyproj) to avoid creating duplicates
3 labels: question
4 ---
5
6 <!--
7 Please search existing issues to avoid creating duplicates.
8 Please check if someone has already asked the same/similar question on GIS Stack Exchange https://gis.stackexchange.com/questions/tagged/pyproj.
9
10 Issues installing pyproj?
11 Have you seen: http://pyproj4.github.io/pyproj/stable/installation.html
12 -->
0 name: Publish Docs
1
2 on:
3 push:
4 branches: [ master ]
5 release:
6 types: [ created ]
7
8 jobs:
9 docs:
10 name: Publish Docs
11 runs-on: ubuntu-latest
12
13 steps:
14 - uses: actions/checkout@v2
15 with:
16 persist-credentials: false
17
18 - name: Setup Conda
19 uses: s-weigand/setup-conda@v1
20 with:
21 activate-conda: false
22 python-version: 3.8
23 conda-channels: conda-forge
24
25 - name: Install and Build
26 shell: bash
27 run: |
28 conda create -n docs python=3.8 cython proj
29 source activate docs
30 python -m pip install -e . --no-use-pep517 || python -m pip install -e .
31 python -m pip install -r requirements-docs.txt
32 sphinx-build -b html docs/ docs/_build/
33
34 - name: Deploy 🚀
35 uses: JamesIves/github-pages-deploy-action@3.7.1
36 if: ${{ github.event_name == 'release' }}
37 with:
38 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39 BRANCH: gh-pages
40 FOLDER: docs/_build/
41 CLEAN: false
42 TARGET_FOLDER: ${{ github.ref }}
43
44 - name: Deploy 🚀
45 uses: JamesIves/github-pages-deploy-action@3.7.1
46 if: ${{ github.event_name == 'push' }}
47 with:
48 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49 BRANCH: gh-pages
50 FOLDER: docs/_build/
51 CLEAN: false
52 TARGET_FOLDER: latest
0 name: Test PROJ Latest
1
2 on:
3 push:
4 branches: [ master ]
5 schedule:
6 - cron: '0 0 * * 0'
7
8 jobs:
9 test_proj_latest:
10 name: PROJ Latest
11 runs-on: ubuntu-latest
12 env:
13 PYPROJ_FULL_COVERAGE: YES
14 PROJ_DIR: ${{ github.workspace }}/proj_install
15 PROJ_LIB: ${{ github.workspace }}/proj_install/share/proj
16 steps:
17 - uses: actions/checkout@v2
18 - uses: actions/setup-python@v2
19 with:
20 python-version: 3.7
21 - name: Install PROJ
22 shell: bash
23 run: |
24 sudo apt-get install -qq sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev
25 bash ci/proj-compile.sh git
26
27 - name: Install and Log Environment
28 shell: bash
29 run: |
30 python -V
31 python -m pip install cython
32 python -m pip install -e . --no-use-pep517 || python -m pip install -e .
33 python -m pip install -r requirements-test.txt
34 pyproj -v
35
36 - name: Test
37 shell: bash
38 run: |
39 py.test --cov-report term-missing --cov=pyproj --cov-report xml
40
41 - name: Test Network
42 shell: bash
43 env:
44 PROJ_NETWORK: ON
45 run: |
46 py.test
47
48 - name: Test Global Context
49 shell: bash
50 env:
51 PYPROJ_GLOBAL_CONTEXT: ON
52 run: |
53 py.test
54
55 - name: Test Grids
56 shell: bash
57 run: |
58 $PROJ_DIR/bin/projsync --quiet --bbox -175,0,-50,85
59 py.test
0 name: Tests
1
2 on:
3 push:
4 branches: [ master ]
5 pull_request:
6 branches: [ master ]
7 schedule:
8 - cron: '0 0 * * 0'
9
10 jobs:
11 linting:
12 runs-on: ubuntu-latest
13 steps:
14 - uses: actions/checkout@v2
15 - uses: actions/setup-python@v2
16 - uses: pre-commit/action@v2.0.0
17 - name: Install mypy
18 run: |
19 python -m pip install mypy
20 - name: mypy
21 run: |
22 mypy pyproj
23
24 test:
25 needs: linting
26 name: ${{ matrix.os }}, ${{ matrix.python-version }}
27 runs-on: ${{ matrix.os }}
28 strategy:
29 fail-fast: true
30 matrix:
31 os: [ubuntu-latest, macos-latest, windows-latest]
32 python-version: [3.6, 3.7, 3.8, 3.9]
33 env:
34 - PYPROJ_FULL_COVERAGE: YES
35
36 steps:
37 - uses: actions/checkout@v2
38
39 - name: Setup Conda
40 uses: s-weigand/setup-conda@v1
41 with:
42 activate-conda: false
43 python-version: ${{ matrix.python-version }}
44 conda-channels: conda-forge
45
46 - name: Install Env
47 shell: bash
48 run: |
49 conda create -n test python=${{ matrix.python-version }} cython proj numpy shapely xarray pandas
50 source activate test
51 python -m pip install -e . --no-use-pep517 || python -m pip install -e .
52 python -m pip install -r requirements-test.txt
53
54 - name: Check and Log Environment
55 shell: bash
56 run: |
57 source activate test
58 python -V
59 pyproj -v
60 conda info
61
62 - name: Test
63 shell: bash
64 run: |
65 source activate test
66 py.test --cov-report term-missing --cov=pyproj --cov-report xml
67
68 - name: Test Network
69 shell: bash
70 env:
71 PROJ_NETWORK: ON
72 run: |
73 source activate test
74 py.test
75
76 - name: Test Global Context
77 shell: bash
78 env:
79 PYPROJ_GLOBAL_CONTEXT: ON
80 run: |
81 source activate test
82 py.test
83
84 - name: Test Grids
85 shell: bash
86 run: |
87 source activate test
88 projsync --quiet --bbox -175,0,-50,85
89 py.test
90
91 - name: Test Build docs
92 shell: bash
93 if: contains(matrix.os, 'ubuntu')
94 run: |
95 source activate test
96 python -m pip install -r requirements-docs.txt
97 sphinx-build -b html docs/ docs/_build/
98
99 - uses: codecov/codecov-action@v1
00 [settings]
1 line_length=88
2 multi_line_output=3
31 known_first_party=pyproj,test
4 include_trailing_comma=true
2 profile=black
+0
-140
.travis.yml less more
0 language: python
1
2 sudo: false
3
4 cache:
5 directories:
6 - $PROJ_BASE_DIR
7 - $HOME/.cache/pip
8
9 env:
10 global:
11 - PROJ_BASE_DIR=$HOME/proj_install
12 - CYTHON_COVERAGE=True
13 - PROJSOURCE=7.2.0
14 # Following generated with
15 - WHEELHOUSE_UPLOADER_USERNAME=travis-worker
16 # Following generated by
17 # travis encrypt -r jswhit/pyproj WHEELHOUSE_UPLOADER_SECRET=<api key>
18 - secure: "IoTBjr6e/eBQWtGleP1X36SpocljQxsmJZ+EcVGhJ4v3GZaECLLklKtrWf8DyygFNPFIZ5Tri/C5rPTbuioG6gWtrL8QPgXOK9MI1QZqmfx/kNi0tmH0g9BxL0jlhP8SInZFsfO4m8qJkYJwh3DqBudQhmbDabnMbX2h7hKKTSA="
19 # Doctr deploy key for pyproj4/pyproj
20 - secure: "V9hQpdQmIOlk/Wvy0NIntlwSI1OvJ12cTrNPBIvwOy86kyPSk4qFj2YMixvcViM235iiCehN+Ray7FIeeHkPVZe9S+zFgVDxFf/RcgBt7tuhLrOoD1AH6pk9/h+z1owZYAboseLU05wv2+T+am0gCz40kES8As7v6bP+xsw69rw="
21
22 matrix:
23 include:
24 - python: 3.6.12
25 - language: cpp
26 os: osx
27 env:
28 - PYTHON=3.7.8
29 - python: 3.7.9
30 - python: 3.7.9
31 env:
32 - PROJ_NETWORK=ON
33 - PROJ_DEBUG=3
34 - python: 3.7.9
35 env:
36 - PROJSYNC=ALL
37 - python: 3.7.9
38 env:
39 - PYPROJ_GLOBAL_CONTEXT=ON
40 - python: 3.7.9
41 env:
42 - DOC=true
43 - python: 3.8.5
44 - python: 3.9-dev
45 - python: 3.9-dev
46 env:
47 - PROJSOURCE=git
48
49 allow_failures:
50 - python: 3.9-dev
51 env:
52 - PROJSOURCE=git
53
54
55 before_install:
56 - |
57 if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
58 brew update
59 brew install sqlite3 wget openssl readline libtiff
60 # from https://pythonhosted.org/CodeChat/.travis.yml.html
61 brew outdated pyenv || brew upgrade pyenv
62 # virtualenv doesn't work without pyenv knowledge. venv in Python 3.3
63 # doesn't provide Pip by default. So, use `pyenv-virtualenv <https://github.com/yyuu/pyenv-virtualenv/blob/master/README.md>`_.
64 brew install pyenv-virtualenv
65 pyenv install --list | grep "3.7"
66 pyenv install $PYTHON
67 # I would expect something like ``pyenv init; pyenv local $PYTHON`` or
68 # ``pyenv shell $PYTHON`` would work, but ``pyenv init`` doesn't seem to
69 # modify the Bash environment. ??? So, I hand-set the variables instead.
70 export PYENV_VERSION=$PYTHON
71 export PATH="/Users/travis/.pyenv/shims:${PATH}"
72 pyenv-virtualenv venv
73 source venv/bin/activate
74 # A manual check that the correct version of Python is running.
75 python --version
76 else
77 sudo apt-get install -qq sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev
78 fi
79 - |
80 if [[ "$TRAVIS_OS_NAME" == "osx" && -n "$PYPROJ_OMP" ]]; then
81 # install OpenMP not present by default on osx
82 brew install libomp
83
84 # enable OpenMP support for Apple-clang
85 export CC=/usr/bin/clang
86 export CXX=/usr/bin/clang++
87 export CPPFLAGS="$CPPFLAGS -Xpreprocessor -fopenmp"
88 export CFLAGS="$CFLAGS -I/usr/local/opt/libomp/include"
89 export CXXFLAGS="$CXXFLAGS -I/usr/local/opt/libomp/include"
90 export LDFLAGS="$LDFLAGS -L/usr/local/opt/libomp/lib -lomp"
91 export DYLD_LIBRARY_PATH=/usr/local/opt/libomp/lib
92
93 # avoid error due to multiple OpenMP libraries loaded simultaneously
94 export KMP_DUPLICATE_LIB_OK=TRUE
95 fi
96 - echo "PROJSOURCE is $PROJSOURCE"
97 # Download external PROJ.4 version and compile if not existing already
98 - export PROJ_DIR=$PROJ_BASE_DIR/proj-${PROJSOURCE:0:5}
99 - |
100 if [ "$PROJSOURCE" = "git" ] || [[ "$PROJSOURCE" != "git" && ! -d "$PROJ_DIR" ]]; then
101 ci/travis/proj-dl-and-compile "$PROJSOURCE"
102 fi
103 - export PROJ_LIB=$PROJ_DIR/share/proj
104 - |
105 if [ "$PROJSYNC" = "ALL" ]; then
106 $PROJ_DIR/bin/projsync --quiet --bbox -175,0,-50,85
107 fi
108
109 install:
110 # coverage report requires a local install
111 - pip install 'pip>=10.0.1'
112 - make install-dev
113 - pip install coveralls
114
115 script:
116 - python -c "import pyproj; pyproj.Proj('epsg:4269')"
117 - make test-coverage
118 - make check
119 # Building and uploading docs with doctr
120 - set -e
121 - |
122 if [ "$DOC" ]; then
123 make install-docs
124 make docs-man
125 make docs
126 pip install doctr
127 if [[ -z "$TRAVIS_TAG" ]]; then
128 DEPLOY_DIR=latest;
129 else
130 DEPLOY_DIR="$TRAVIS_TAG";
131 fi
132 doctr deploy --build-tags --built-docs docs/_build/html $DEPLOY_DIR
133 fi
134
135 after_success:
136 - coveralls
137
138 notifications:
139 email: false
7676 ``cd pyproj``
7777 * Connect your repository to the upstream (main project).
7878 ``git remote add upstream https://github.com/pyproj4/pyproj.git``
79 * Create the development environment by running ``conda create -n devel -c conda-forge cython proj numpy shapely``.
79 * Create the development environment by running ``conda create -n devel -c conda-forge cython proj numpy shapely xarray pandas``.
8080 * If the minimum PROJ version is not yet available, you can build PROJ from source using:
8181 ```bash
8282 export PROJ_DIR=$PWD/pyproj/proj_dir
8383 mkdir $PROJ_DIR
84 bash ci/travis/proj-dl-and-compile git
84 bash ci/proj-compile.sh git
8585 ```
8686 * Activate our new development environment ``conda activate devel`` on Mac/Linux or
8787 ``activate devel`` on Windows.
125125 ``pytest``, which is easily available through ``conda`` or ``pip``. It was also installed if you made our default ``devel`` environment.
126126
127127 ### Running Tests
128 Running the tests can be done by running ``py.test``
128 Running the tests can be done by running ``py.test``. Make sure you install the test requirements before running the tests ``pip install -r requirements-test.txt``.
129129
130130 Running the whole test suite isn't that slow, but can be a burden if you're working on just
131131 one module or a specific test. It is easy to run tests on a single directory:
5959 rm -f pyproj/*/*.c
6060 rm -f pyproj/*.c
6161
62 lint: ## check style with flake8
63 flake8 setup.py pyproj/ test/ docs/
64 flake8 --append-config=flake8/cython.cfg pyproj/
65
6662 check-type:
6763 mypy pyproj
6864
69 check: lint check-type ## flake8 black isort check
70 black --check setup.py pyproj/ test/ docs/
71 isort --check setup.py pyproj/ test/ docs/
72
73 isort: ## order imports
74 isort setup.py pyproj/ test/ docs/
75
76 black: ## black format files
77 black setup.py pyproj/ test/ docs/
65 check: check-type
66 pre-commit run --show-diff-on-failure --all-files
7867
7968 test: ## run tests
8069 py.test
8675 py.test --cov-report term-missing --cov=pyproj -v -s
8776
8877 install-docs: ## Install requirements for building documentation
89 pip install sphinx sphinx_rtd_theme sphinx-argparse
78 python -m pip install -r requirements-docs.txt
9079
9180 docs: ## generate Sphinx HTML documentation, including API docs
9281 $(MAKE) -C docs clean
10392 python setup.py install
10493
10594 install-dev: clean ## install development version to active Python's site-packages
106 pip install -U -r requirements-dev.txt
107 PYPROJ_FULL_COVERAGE=YES pip install -e . --no-use-pep517 || PYPROJ_FULL_COVERAGE=YES pip install -e .
95 python -m pip install -r requirements-dev.txt
96 pre-commit install
97 python -m pip install -r requirements-test.txt
98 PYPROJ_FULL_COVERAGE=YES python -m pip install -e . --no-use-pep517 || PYPROJ_FULL_COVERAGE=YES python -m pip install -e .
33
44 <p align="center">
55 <a href="https://gitter.im/pyproj4-pyproj/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img alt="Join the chat at https://gitter.im/pyproj4-pyproj/community" src="https://badges.gitter.im/pyproj4-pyproj/community.svg"></a>
6 <a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-38-orange.svg?style=flat-square"></a>
7 <a href="https://travis-ci.com/pyproj4/pyproj"><img alt="Build Status" src="https://travis-ci.com/pyproj4/pyproj.svg?branch=master"></a>
8 <a href="https://ci.appveyor.com/project/jswhit/pyproj"><img alt="Build Status" src="https://ci.appveyor.com/api/projects/status/8xkka4s97uwhkc64/branch/master?svg=true"></a>
9 <a href="https://coveralls.io/github/pyproj4/pyproj?branch=master"><img alt="Coverage Status" src="https://coveralls.io/repos/github/pyproj4/pyproj/badge.svg?branch=master"></a>
6 <a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-39-orange.svg?style=flat-square"></a>
7 <a href="https://ci.appveyor.com/project/jswhit/pyproj"><img alt="Appveyor Build Status" src="https://ci.appveyor.com/api/projects/status/8xkka4s97uwhkc64/branch/master?svg=true"></a>
8 <a href="https://github.com/pyproj4/pyproj/actions?query=workflow%3ATests"><img alt="GitHub Actions Build Status" src="https://github.com/pyproj4/pyproj/workflows/Tests/badge.svg"></a>
9 <a href="https://codecov.io/gh/pyproj4/pyproj"><img alt="Codecov Status" src="https://codecov.io/gh/pyproj4/pyproj/branch/master/graph/badge.svg"></a>
1010 <a href="https://badge.fury.io/py/pyproj"><img alt="PyPI" src="https://badge.fury.io/py/pyproj.svg"></a>
1111 <a href="https://pepy.tech/project/pyproj"><img alt="Downloads" src="https://pepy.tech/badge/pyproj"></a>
1212 <a href="https://anaconda.org/conda-forge/pyproj"><img alt="Anaconda-Server Badge" src="https://anaconda.org/conda-forge/pyproj/badges/version.svg"></a>
2323
2424 ## Bugs/Questions
2525
26 - Report bugs/ask questions: https://github.com/pyproj4/pyproj/issues
26 - Report bugs/feature requests: https://github.com/pyproj4/pyproj/issues
27 - Ask questions: https://github.com/pyproj4/pyproj/discussions
2728 - Ask developer questions: https://gitter.im/pyproj4-pyproj/community
28 - Ask the community: https://gis.stackexchange.com/questions/tagged/pyproj
29 - Ask the GIS community: https://gis.stackexchange.com/questions/tagged/pyproj
2930
3031 ## Contributors ✨
3132
3637 <!-- markdownlint-disable -->
3738 <table>
3839 <tr>
39 <td align="center"><a href="https://github.com/jswhit"><img src="https://avatars2.githubusercontent.com/u/579593?v=4" width="100px;" alt="Jeff Whitaker"/><br /><sub><b>Jeff Whitaker</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Code">💻</a> <a href="#example-jswhit" title="Examples">💡</a> <a href="#ideas-jswhit" title="Ideas, Planning, & Feedback">🤔</a> <a href="#review-jswhit" title="Reviewed Pull Requests">👀</a> <a href="#question-jswhit" title="Answering Questions">💬</a> <a href="#maintenance-jswhit" title="Maintenance">🚧</a> <a href="#infra-jswhit" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajswhit" title="Bug reports">🐛</a></td>
40 <td align="center"><a href="https://github.com/snowman2"><img src="https://avatars3.githubusercontent.com/u/8699967?v=4" width="100px;" alt="Alan D. Snow"/><br /><sub><b>Alan D. Snow</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Code">💻</a> <a href="#example-snowman2" title="Examples">💡</a> <a href="#maintenance-snowman2" title="Maintenance">🚧</a> <a href="#infra-snowman2" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-snowman2" title="Ideas, Planning, & Feedback">🤔</a> <a href="#review-snowman2" title="Reviewed Pull Requests">👀</a> <a href="#question-snowman2" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Asnowman2" title="Bug reports">🐛</a></td>
41 <td align="center"><a href="https://github.com/micahcochran"><img src="https://avatars0.githubusercontent.com/u/7433104?v=4" width="100px;" alt="Micah Cochran"/><br /><sub><b>Micah Cochran</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Code">💻</a> <a href="#maintenance-micahcochran" title="Maintenance">🚧</a> <a href="#infra-micahcochran" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#review-micahcochran" title="Reviewed Pull Requests">👀</a> <a href="#question-micahcochran" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Amicahcochran" title="Bug reports">🐛</a></td>
42 <td align="center"><a href="https://jorisvandenbossche.github.io/"><img src="https://avatars2.githubusercontent.com/u/1020496?v=4" width="100px;" alt="Joris Van den Bossche"/><br /><sub><b>Joris Van den Bossche</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Code">💻</a> <a href="#ideas-jorisvandenbossche" title="Ideas, Planning, & Feedback">🤔</a> <a href="#review-jorisvandenbossche" title="Reviewed Pull Requests">👀</a> <a href="#question-jorisvandenbossche" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajorisvandenbossche" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Tests">⚠️</a></td>
43 <td align="center"><a href="https://github.com/cjmayo"><img src="https://avatars1.githubusercontent.com/u/921089?v=4" width="100px;" alt="Chris Mayo"/><br /><sub><b>Chris Mayo</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cjmayo" title="Tests">⚠️</a></td>
44 <td align="center"><a href="https://www.petrel.org"><img src="https://avatars1.githubusercontent.com/u/2298266?v=4" width="100px;" alt="Charles Karney"/><br /><sub><b>Charles Karney</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cffk" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=cffk" title="Tests">⚠️</a></td>
45 <td align="center"><a href="http://www.justaprogrammer.net/profile/justin"><img src="https://avatars3.githubusercontent.com/u/146930?v=4" width="100px;" alt="Justin Dearing"/><br /><sub><b>Justin Dearing</b></sub></a><br /><a href="#infra-zippy1981" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
40 <td align="center"><a href="https://github.com/jswhit"><img src="https://avatars2.githubusercontent.com/u/579593?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jeff Whitaker</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jswhit" title="Code">💻</a> <a href="#example-jswhit" title="Examples">💡</a> <a href="#ideas-jswhit" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/pulls?q=is%3Apr+reviewed-by%3Ajswhit" title="Reviewed Pull Requests">👀</a> <a href="#question-jswhit" title="Answering Questions">💬</a> <a href="#maintenance-jswhit" title="Maintenance">🚧</a> <a href="#infra-jswhit" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajswhit" title="Bug reports">🐛</a></td>
41 <td align="center"><a href="https://github.com/snowman2"><img src="https://avatars3.githubusercontent.com/u/8699967?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alan D. Snow</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=snowman2" title="Code">💻</a> <a href="#example-snowman2" title="Examples">💡</a> <a href="#maintenance-snowman2" title="Maintenance">🚧</a> <a href="#infra-snowman2" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-snowman2" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/pulls?q=is%3Apr+reviewed-by%3Asnowman2" title="Reviewed Pull Requests">👀</a> <a href="#question-snowman2" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Asnowman2" title="Bug reports">🐛</a></td>
42 <td align="center"><a href="https://github.com/micahcochran"><img src="https://avatars0.githubusercontent.com/u/7433104?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Micah Cochran</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/commits?author=micahcochran" title="Code">💻</a> <a href="#maintenance-micahcochran" title="Maintenance">🚧</a> <a href="#infra-micahcochran" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pyproj4/pyproj/pulls?q=is%3Apr+reviewed-by%3Amicahcochran" title="Reviewed Pull Requests">👀</a> <a href="#question-micahcochran" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Amicahcochran" title="Bug reports">🐛</a></td>
43 <td align="center"><a href="https://jorisvandenbossche.github.io/"><img src="https://avatars2.githubusercontent.com/u/1020496?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joris Van den Bossche</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Documentation">📖</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Code">💻</a> <a href="#ideas-jorisvandenbossche" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/pulls?q=is%3Apr+reviewed-by%3Ajorisvandenbossche" title="Reviewed Pull Requests">👀</a> <a href="#question-jorisvandenbossche" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajorisvandenbossche" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jorisvandenbossche" title="Tests">⚠️</a></td>
44 <td align="center"><a href="https://github.com/cjmayo"><img src="https://avatars1.githubusercontent.com/u/921089?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Mayo</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cjmayo" title="Tests">⚠️</a></td>
45 <td align="center"><a href="https://www.petrel.org"><img src="https://avatars1.githubusercontent.com/u/2298266?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Charles Karney</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cffk" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=cffk" title="Tests">⚠️</a></td>
46 <td align="center"><a href="http://www.justaprogrammer.net/profile/justin"><img src="https://avatars3.githubusercontent.com/u/146930?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Justin Dearing</b></sub></a><br /><a href="#infra-zippy1981" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
4647 </tr>
4748 <tr>
48 <td align="center"><a href="https://github.com/jdkloe"><img src="https://avatars3.githubusercontent.com/u/1906112?v=4" width="100px;" alt="Jos de Kloe"/><br /><sub><b>Jos de Kloe</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jdkloe" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jdkloe" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajdkloe" title="Bug reports">🐛</a></td>
49 <td align="center"><a href="https://github.com/georgeouzou"><img src="https://avatars3.githubusercontent.com/u/16732042?v=4" width="100px;" alt="George Ouzounoudis"/><br /><sub><b>George Ouzounoudis</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=georgeouzou" title="Code">💻</a> <a href="#ideas-georgeouzou" title="Ideas, Planning, & Feedback">🤔</a></td>
50 <td align="center"><a href="https://github.com/djhoese"><img src="https://avatars3.githubusercontent.com/u/1828519?v=4" width="100px;" alt="David Hoese"/><br /><sub><b>David Hoese</b></sub></a><br /><a href="#review-djhoese" title="Reviewed Pull Requests">👀</a> <a href="#ideas-djhoese" title="Ideas, Planning, & Feedback">🤔</a></td>
51 <td align="center"><a href="http://mitkin.github.io"><img src="https://avatars3.githubusercontent.com/u/3927849?v=4" width="100px;" alt="Mikhail Itkin"/><br /><sub><b>Mikhail Itkin</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mitkin" title="Code">💻</a></td>
52 <td align="center"><a href="http://dopplershift.github.io"><img src="https://avatars2.githubusercontent.com/u/221526?v=4" width="100px;" alt="Ryan May"/><br /><sub><b>Ryan May</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=dopplershift" title="Code">💻</a></td>
53 <td align="center"><a href="https://github.com/artttt"><img src="https://avatars3.githubusercontent.com/u/4626281?v=4" width="100px;" alt="artttt"/><br /><sub><b>artttt</b></sub></a><br /><a href="#ideas-artttt" title="Ideas, Planning, & Feedback">🤔</a></td>
54 <td align="center"><a href="http://ocefpaf.github.io/python4oceanographers"><img src="https://avatars1.githubusercontent.com/u/950575?v=4" width="100px;" alt="Filipe"/><br /><sub><b>Filipe</b></sub></a><br /><a href="#infra-ocefpaf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pyproj4/pyproj/commits?author=ocefpaf" title="Code">💻</a> <a href="#platform-ocefpaf" title="Packaging/porting to new platform">📦</a></td>
49 <td align="center"><a href="https://github.com/jdkloe"><img src="https://avatars3.githubusercontent.com/u/1906112?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jos de Kloe</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jdkloe" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jdkloe" title="Tests">⚠️</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajdkloe" title="Bug reports">🐛</a></td>
50 <td align="center"><a href="https://github.com/georgeouzou"><img src="https://avatars3.githubusercontent.com/u/16732042?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Ouzounoudis</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=georgeouzou" title="Code">💻</a> <a href="#ideas-georgeouzou" title="Ideas, Planning, & Feedback">🤔</a></td>
51 <td align="center"><a href="https://github.com/djhoese"><img src="https://avatars3.githubusercontent.com/u/1828519?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Hoese</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/pulls?q=is%3Apr+reviewed-by%3Adjhoese" title="Reviewed Pull Requests">👀</a> <a href="#ideas-djhoese" title="Ideas, Planning, & Feedback">🤔</a> <a href="#platform-djhoese" title="Packaging/porting to new platform">📦</a></td>
52 <td align="center"><a href="http://mitkin.github.io"><img src="https://avatars3.githubusercontent.com/u/3927849?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mikhail Itkin</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mitkin" title="Code">💻</a></td>
53 <td align="center"><a href="http://dopplershift.github.io"><img src="https://avatars2.githubusercontent.com/u/221526?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan May</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=dopplershift" title="Code">💻</a></td>
54 <td align="center"><a href="https://github.com/artttt"><img src="https://avatars3.githubusercontent.com/u/4626281?v=4?s=100" width="100px;" alt=""/><br /><sub><b>artttt</b></sub></a><br /><a href="#ideas-artttt" title="Ideas, Planning, & Feedback">🤔</a></td>
55 <td align="center"><a href="http://ocefpaf.github.io/python4oceanographers"><img src="https://avatars1.githubusercontent.com/u/950575?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Filipe</b></sub></a><br /><a href="#infra-ocefpaf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pyproj4/pyproj/commits?author=ocefpaf" title="Code">💻</a> <a href="#platform-ocefpaf" title="Packaging/porting to new platform">📦</a></td>
5556 </tr>
5657 <tr>
57 <td align="center"><a href="https://github.com/heitorPB"><img src="https://avatars2.githubusercontent.com/u/13461702?v=4" width="100px;" alt="Heitor"/><br /><sub><b>Heitor</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=heitorPB" title="Documentation">📖</a></td>
58 <td align="center"><a href="https://github.com/sebastic"><img src="https://avatars3.githubusercontent.com/u/4605306?v=4" width="100px;" alt="Bas Couwenberg"/><br /><sub><b>Bas Couwenberg</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=sebastic" title="Code">💻</a> <a href="#platform-sebastic" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/pyproj4/pyproj/commits?author=sebastic" title="Tests">⚠️</a></td>
59 <td align="center"><a href="https://github.com/nickeubank"><img src="https://avatars0.githubusercontent.com/u/9683693?v=4" width="100px;" alt="Nick Eubank"/><br /><sub><b>Nick Eubank</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=nickeubank" title="Code">💻</a></td>
60 <td align="center"><a href="https://www.math.uwaterloo.ca/~mdunphy/"><img src="https://avatars3.githubusercontent.com/u/9088426?v=4" width="100px;" alt="Michael Dunphy"/><br /><sub><b>Michael Dunphy</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mdunphy" title="Documentation">📖</a></td>
61 <td align="center"><a href="http://matthew.dynevor.org"><img src="https://avatars2.githubusercontent.com/u/67612?v=4" width="100px;" alt="Matthew Brett"/><br /><sub><b>Matthew Brett</b></sub></a><br /><a href="#infra-matthew-brett" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-matthew-brett" title="Packaging/porting to new platform">📦</a></td>
62 <td align="center"><a href="https://naboa.de"><img src="https://avatars1.githubusercontent.com/u/10531844?v=4" width="100px;" alt="Jakob de Maeyer "/><br /><sub><b>Jakob de Maeyer </b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jdemaeyer" title="Code">💻</a></td>
63 <td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4" width="100px;" alt="The Gitter Badger"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=gitter-badger" title="Documentation">📖</a></td>
58 <td align="center"><a href="https://github.com/heitorPB"><img src="https://avatars2.githubusercontent.com/u/13461702?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Heitor</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=heitorPB" title="Documentation">📖</a></td>
59 <td align="center"><a href="https://github.com/sebastic"><img src="https://avatars3.githubusercontent.com/u/4605306?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bas Couwenberg</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=sebastic" title="Code">💻</a> <a href="#platform-sebastic" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/pyproj4/pyproj/commits?author=sebastic" title="Tests">⚠️</a></td>
60 <td align="center"><a href="https://github.com/nickeubank"><img src="https://avatars0.githubusercontent.com/u/9683693?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nick Eubank</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=nickeubank" title="Code">💻</a></td>
61 <td align="center"><a href="https://www.math.uwaterloo.ca/~mdunphy/"><img src="https://avatars3.githubusercontent.com/u/9088426?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Dunphy</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mdunphy" title="Documentation">📖</a></td>
62 <td align="center"><a href="http://matthew.dynevor.org"><img src="https://avatars2.githubusercontent.com/u/67612?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Brett</b></sub></a><br /><a href="#infra-matthew-brett" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-matthew-brett" title="Packaging/porting to new platform">📦</a></td>
63 <td align="center"><a href="https://naboa.de"><img src="https://avatars1.githubusercontent.com/u/10531844?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jakob de Maeyer </b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jdemaeyer" title="Code">💻</a></td>
64 <td align="center"><a href="https://gitter.im"><img src="https://avatars2.githubusercontent.com/u/8518239?v=4?s=100" width="100px;" alt=""/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=gitter-badger" title="Documentation">📖</a></td>
6465 </tr>
6566 <tr>
66 <td align="center"><a href="http://lizards.opensuse.org/author/bmwiedemann/"><img src="https://avatars3.githubusercontent.com/u/637990?v=4" width="100px;" alt="Bernhard M. Wiedemann"/><br /><sub><b>Bernhard M. Wiedemann</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=bmwiedemann" title="Code">💻</a></td>
67 <td align="center"><a href="https://github.com/ReallyNiceGuy"><img src="https://avatars0.githubusercontent.com/u/6545730?v=4" width="100px;" alt="Marco Aurélio da Costa"/><br /><sub><b>Marco Aurélio da Costa</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=ReallyNiceGuy" title="Code">💻</a></td>
68 <td align="center"><a href="https://github.com/ChrisBarker-NOAA"><img src="https://avatars2.githubusercontent.com/u/916576?v=4" width="100px;" alt="Christopher H. Barker"/><br /><sub><b>Christopher H. Barker</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=ChrisBarker-NOAA" title="Code">💻</a></td>
69 <td align="center"><a href="https://evers.dev/"><img src="https://avatars3.githubusercontent.com/u/13132571?v=4" width="100px;" alt="Kristian Evers"/><br /><sub><b>Kristian Evers</b></sub></a><br /><a href="#question-kbevers" title="Answering Questions">💬</a> <a href="#ideas-kbevers" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/commits?author=kbevers" title="Documentation">📖</a></td>
70 <td align="center"><a href="http://www.spatialys.com/en/about/"><img src="https://avatars2.githubusercontent.com/u/1192433?v=4" width="100px;" alt="Even Rouault"/><br /><sub><b>Even Rouault</b></sub></a><br /><a href="#question-rouault" title="Answering Questions">💬</a></td>
71 <td align="center"><a href="https://github.com/cgohlke"><img src="https://avatars3.githubusercontent.com/u/483428?v=4" width="100px;" alt="Christoph Gohlke"/><br /><sub><b>Christoph Gohlke</b></sub></a><br /><a href="#platform-cgohlke" title="Packaging/porting to new platform">📦</a> <a href="#question-cgohlke" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Acgohlke" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=cgohlke" title="Tests">⚠️</a></td>
72 <td align="center"><a href="https://github.com/chrrrisw"><img src="https://avatars0.githubusercontent.com/u/5555320?v=4" width="100px;" alt="Chris Willoughby"/><br /><sub><b>Chris Willoughby</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=chrrrisw" title="Code">💻</a></td>
67 <td align="center"><a href="http://lizards.opensuse.org/author/bmwiedemann/"><img src="https://avatars3.githubusercontent.com/u/637990?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bernhard M. Wiedemann</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=bmwiedemann" title="Code">💻</a></td>
68 <td align="center"><a href="https://github.com/ReallyNiceGuy"><img src="https://avatars0.githubusercontent.com/u/6545730?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marco Aurélio da Costa</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=ReallyNiceGuy" title="Code">💻</a></td>
69 <td align="center"><a href="https://github.com/ChrisBarker-NOAA"><img src="https://avatars2.githubusercontent.com/u/916576?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christopher H. Barker</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=ChrisBarker-NOAA" title="Code">💻</a></td>
70 <td align="center"><a href="https://evers.dev/"><img src="https://avatars3.githubusercontent.com/u/13132571?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kristian Evers</b></sub></a><br /><a href="#question-kbevers" title="Answering Questions">💬</a> <a href="#ideas-kbevers" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/commits?author=kbevers" title="Documentation">📖</a></td>
71 <td align="center"><a href="http://www.spatialys.com/en/about/"><img src="https://avatars2.githubusercontent.com/u/1192433?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Even Rouault</b></sub></a><br /><a href="#question-rouault" title="Answering Questions">💬</a></td>
72 <td align="center"><a href="https://github.com/cgohlke"><img src="https://avatars3.githubusercontent.com/u/483428?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christoph Gohlke</b></sub></a><br /><a href="#platform-cgohlke" title="Packaging/porting to new platform">📦</a> <a href="#question-cgohlke" title="Answering Questions">💬</a> <a href="https://github.com/pyproj4/pyproj/issues?q=author%3Acgohlke" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=cgohlke" title="Tests">⚠️</a></td>
73 <td align="center"><a href="https://github.com/chrrrisw"><img src="https://avatars0.githubusercontent.com/u/5555320?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Willoughby</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=chrrrisw" title="Code">💻</a></td>
7374 </tr>
7475 <tr>
75 <td align="center"><a href="https://github.com/glostis"><img src="https://avatars0.githubusercontent.com/u/25295717?v=4" width="100px;" alt="Guillaume Lostis"/><br /><sub><b>Guillaume Lostis</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=glostis" title="Documentation">📖</a></td>
76 <td align="center"><a href="https://github.com/edpop"><img src="https://avatars3.githubusercontent.com/u/13479292?v=4" width="100px;" alt="Eduard Popov"/><br /><sub><b>Eduard Popov</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=edpop" title="Documentation">📖</a></td>
77 <td align="center"><a href="http://www.personal.psu.edu/jar339"><img src="https://avatars2.githubusercontent.com/u/7864460?v=4" width="100px;" alt="Joe Ranalli"/><br /><sub><b>Joe Ranalli</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajranalli" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jranalli" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jranalli" title="Tests">⚠️</a></td>
78 <td align="center"><a href="https://github.com/gberardinelli"><img src="https://avatars0.githubusercontent.com/u/13799588?v=4" width="100px;" alt="Greg Berardinelli"/><br /><sub><b>Greg Berardinelli</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Agberardinelli" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=gberardinelli" title="Code">💻</a> <a href="#ideas-gberardinelli" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/commits?author=gberardinelli" title="Tests">⚠️</a></td>
79 <td align="center"><a href="https://github.com/mraspaud"><img src="https://avatars1.githubusercontent.com/u/167802?v=4" width="100px;" alt="Martin Raspaud"/><br /><sub><b>Martin Raspaud</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Amraspaud" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mraspaud" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mraspaud" title="Tests">⚠️</a> <a href="#ideas-mraspaud" title="Ideas, Planning, & Feedback">🤔</a></td>
80 <td align="center"><a href="https://sites.google.com/site/mwtoews/"><img src="https://avatars1.githubusercontent.com/u/895458?v=4" width="100px;" alt="Mike Taves"/><br /><sub><b>Mike Taves</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mwtoews" title="Tests">⚠️</a></td>
81 <td align="center"><a href="http://davidhaberthür.ch"><img src="https://avatars2.githubusercontent.com/u/1651235?v=4" width="100px;" alt="David Haberthür"/><br /><sub><b>David Haberthür</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=habi" title="Documentation">📖</a></td>
76 <td align="center"><a href="https://github.com/glostis"><img src="https://avatars0.githubusercontent.com/u/25295717?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Guillaume Lostis</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=glostis" title="Documentation">📖</a></td>
77 <td align="center"><a href="https://github.com/edpop"><img src="https://avatars3.githubusercontent.com/u/13479292?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Eduard Popov</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=edpop" title="Documentation">📖</a></td>
78 <td align="center"><a href="http://www.personal.psu.edu/jar339"><img src="https://avatars2.githubusercontent.com/u/7864460?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joe Ranalli</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajranalli" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jranalli" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jranalli" title="Tests">⚠️</a></td>
79 <td align="center"><a href="https://github.com/gberardinelli"><img src="https://avatars0.githubusercontent.com/u/13799588?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Greg Berardinelli</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Agberardinelli" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=gberardinelli" title="Code">💻</a> <a href="#ideas-gberardinelli" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/pyproj4/pyproj/commits?author=gberardinelli" title="Tests">⚠️</a></td>
80 <td align="center"><a href="https://github.com/mraspaud"><img src="https://avatars1.githubusercontent.com/u/167802?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martin Raspaud</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Amraspaud" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mraspaud" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mraspaud" title="Tests">⚠️</a> <a href="#ideas-mraspaud" title="Ideas, Planning, & Feedback">🤔</a></td>
81 <td align="center"><a href="https://sites.google.com/site/mwtoews/"><img src="https://avatars1.githubusercontent.com/u/895458?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike Taves</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=mwtoews" title="Tests">⚠️</a></td>
82 <td align="center"><a href="http://davidhaberthür.ch"><img src="https://avatars2.githubusercontent.com/u/1651235?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Haberthür</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=habi" title="Documentation">📖</a></td>
8283 </tr>
8384 <tr>
84 <td align="center"><a href="https://github.com/mmodenesi"><img src="https://avatars2.githubusercontent.com/u/5569789?v=4" width="100px;" alt="mmodenesi"/><br /><sub><b>mmodenesi</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ammodenesi" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mmodenesi" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mmodenesi" title="Tests">⚠️</a></td>
85 <td align="center"><a href="https://www.indigoag.com/"><img src="https://avatars0.githubusercontent.com/u/48448372?v=4" width="100px;" alt="jacob-indigo"/><br /><sub><b>jacob-indigo</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajacob-indigo" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jacob-indigo" title="Code">💻</a></td>
86 <td align="center"><a href="https://rahulporuri.github.io"><img src="https://avatars0.githubusercontent.com/u/1926457?v=4" width="100px;" alt="Poruri Sai Rahul"/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=rahulporuri" title="Tests">⚠️</a></td>
85 <td align="center"><a href="https://github.com/mmodenesi"><img src="https://avatars2.githubusercontent.com/u/5569789?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mmodenesi</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ammodenesi" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mmodenesi" title="Code">💻</a> <a href="https://github.com/pyproj4/pyproj/commits?author=mmodenesi" title="Tests">⚠️</a></td>
86 <td align="center"><a href="https://www.indigoag.com/"><img src="https://avatars0.githubusercontent.com/u/48448372?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jacob-indigo</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/issues?q=author%3Ajacob-indigo" title="Bug reports">🐛</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jacob-indigo" title="Code">💻</a></td>
87 <td align="center"><a href="https://rahulporuri.github.io"><img src="https://avatars0.githubusercontent.com/u/1926457?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=rahulporuri" title="Tests">⚠️</a></td>
88 <td align="center"><a href="https://medium.com/@underchemist"><img src="https://avatars1.githubusercontent.com/u/5283998?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yann-Sebastien Tremblay-Johnston</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=underchemist" title="Documentation">📖</a></td>
89 <td align="center"><a href="https://github.com/odidev"><img src="https://avatars2.githubusercontent.com/u/40816837?v=4?s=100" width="100px;" alt=""/><br /><sub><b>odidev</b></sub></a><br /><a href="#platform-odidev" title="Packaging/porting to new platform">📦</a></td>
8790 </tr>
8891 </table>
8992
90 <!-- markdownlint-enable -->
93 <!-- markdownlint-restore -->
9194 <!-- prettier-ignore-end -->
95
9296 <!-- ALL-CONTRIBUTORS-LIST:END -->
9397
9498 This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
102102 - set PYPROJ_FULL_COVERAGE=YES
103103 - "python -m pip install -e ."
104104 - "python -m pip install -r requirements-dev.txt"
105 - "python -m pip install -r requirements-test.txt"
105106
106107
107108 install:
133134 - "%CMD_IN_ENV% python -c \"import pyproj; pyproj.Proj('epsg:4269')\""
134135 - "%CMD_IN_ENV% py.test --cov-report term-missing --cov=pyproj -v -s"
135136
136 after_test:
137 # TODO: build wheels
138 # after_test:
137139 # If tests are successful, create binary packages for the project.
138 - mkdir pyproj\proj_dir\share\proj
139 - copy %PROJ_LIB%\* pyproj\proj_dir\share\proj
140 - mkdir pyproj\.lib
141 - mkdir .lib
142 - copy %PROJ_DIR%\lib\* pyproj\.lib
143 - copy %PROJ_DIR%\lib\* .lib
144 - copy c:\tools\vcpkg\installed\"%platform%"-windows\bin\sqlite3.dll pyproj\.lib
145 - set PROJ_LIBDIR=.lib
146 - set PROJ_WHEEL=true
147 - "%CMD_IN_ENV% python setup.py bdist_wheel"
140 # - set PROJ_WHEEL=true
141 # - "%CMD_IN_ENV% python setup.py bdist_wheel"
148142 # - "%CMD_IN_ENV% python setup.py bdist_wininst"
149143 # - "%CMD_IN_ENV% python setup.py bdist_msi"
150144 # test wheel
151 - python -m pip install pyproj --ignore-installed -f dist
152 - python -c "import pyproj; pyproj.Proj('epsg:4269')"
145 # - python -m pip install pyproj --ignore-installed -f dist
146 # - python -c "import pyproj; pyproj.Proj('epsg:4269')"
153147 # cleanup for test dir
154 - if %PROJSOURCE% == git del /F /Q dist\*
155 - ps: "ls dist"
148 # - if %PROJSOURCE% == git del /F /Q dist\*
149 # - ps: "ls dist"
156150
157151 artifacts:
158152 # Archive the generated packages in the ci.appveyor.com build report.
0 #!/bin/bash
1 pushd .
2 echo "Building PROJ $1 version from source..."
3 if [[ $1 == "git" ]]; then
4 git clone https://github.com/OSGeo/PROJ.git proj-git
5 else
6 curl https://download.osgeo.org/proj/proj-$1.tar.gz > "proj-${1:0:5}.tar.gz"
7 tar zxf "proj-${1:0:5}.tar.gz"
8 fi
9 cd "proj-${1:0:5}"
10 # build using autotools
11 sh autogen.sh
12 ./configure --prefix=$PROJ_DIR
13 make
14 make install
15 # build using cmake
16 #cmake . -DCMAKE_INSTALL_PREFIX=$PROJ_DIR
17 #cmake --build .
18 #make install
19 popd
+0
-24
ci/travis/proj-dl-and-compile less more
0 #!/bin/bash
1 echo "Building PROJ $1 version from source..."
2 if [[ $1 == "git" ]]; then
3 git clone https://github.com/OSGeo/PROJ.git proj-git
4 else
5 curl https://download.osgeo.org/proj/proj-$1.tar.gz > "proj-${1:0:5}.tar.gz"
6 tar zxf "proj-${1:0:5}.tar.gz"
7 fi
8 cd "proj-${1:0:5}"
9
10 # could be installed to a cached location (probably not git version)
11 # seems to take only about 13 seconds of build time
12 # build using autotools
13 sh autogen.sh
14 ./configure --prefix=$PROJ_DIR
15 make
16 make install
17 # build using cmake
18 #cmake . -DCMAKE_INSTALL_PREFIX=$PROJ_DIR
19 #cmake --build .
20 #make install
21 find $PROJ_DIR
22 # export PROJ_DIR="/tmp/proj_dl_install"
23 cd ..
0 coverage:
1 status:
2 project:
3 default:
4 target: 94% # the required coverage value
5 threshold: 0.2% # the leniency in hitting the target
4444
4545
4646 Transforming with the same projections
47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4848
4949 pyproj will skip transformations if they are exactly the same by default. However, if you
5050 sometimes throw in the projections that are about the same and the results being close enough
113113
114114 .. code-block:: python
115115
116 from distutils.version import LooseVersion
117
116118 from pyproj.crs import BoundCRS, Ellipsoid, GeographicCRS, ProjectedCRS
117119 from pyproj.crs.coordinate_operation import (
118120 TransverseMercatorConversion,
119121 ToWGS84Transformation,
120122 )
121123 from pyproj.crs.datum import CustomDatum
124 import pyproj
125
126 if LooseVersion(pyproj.__proj_version__) >= LooseVersion("8.0")
127 # https://github.com/OSGeo/PROJ/pull/2536
128 HAYFORD_ELLIPSOID_NAME = "International 1924 (Hayford 1909, 1910)"
129 else:
130 HAYFORD_ELLIPSOID_NAME = "International 1909 (Hayford)"
122131
123132 proj_crs = ProjectedCRS(
124133 conversion=TransverseMercatorConversion(
129138 scale_factor_natural_origin=0.9996,
130139 ),
131140 geodetic_crs=GeographicCRS(
132 datum=CustomDatum(ellipsoid="International 1909 (Hayford)")
141 datum=CustomDatum(ellipsoid=HAYFORD_ELLIPSOID_NAME)
133142 ),
134143 )
135144 bound_crs = BoundCRS(
248248 - To get data directory being used: :func:`pyproj.datadir.get_data_dir`
249249 - The order for searching for the data directory can be found in
250250 the docstrings of :func:`pyproj.datadir.get_data_dir`
251 - To change the data directory: :func:`pyproj.datadir.get_data_dir`
251 - To change the data directory: :func:`pyproj.datadir.set_data_dir`
252252
253253
254254 .. _upgrade_transformer:
00 Change Log
11 ==========
2
3 3.0.1
4 -----
5 * WHL: Wheels contain PROJ 7.2.1
6 * Use `proj_context_errno_string` in PROJ 8+ due to deprecation (issue #760)
7 * BUG: Allow transformations with empty arrays (issue #766)
8 * BUG: support numpy objects in CRS.from_cf (issue #773)
29
310 3.0.0
411 -----
512 * Minimum supported Python version 3.6 (issue #499)
613 * Minimum PROJ version 7.2 (issues #599 & #689)
714 * WHL: Removed datumgrids from wheels because not needed with RFC 4 (pull #628)
15 * WHL: Wheels contain PROJ 7.2
816 * ENH: Added :ref:`network` (#675, #691, #695)
917 * ENH: Added ability to use global context (issue #661)
1018 * ENH: Added transformation grid sync API/CLI (issue #572)
00 Documentation Archive
11 =====================
22
3 - `3.0.0 <https://pyproj4.github.io/pyproj/3.0.0/>`_
34 - `2.6.1 <https://pyproj4.github.io/pyproj/v2.6.1rel/>`_
45 - `2.6.0 <https://pyproj4.github.io/pyproj/v2.6.0rel/>`_
56 - `2.5.0 <https://pyproj4.github.io/pyproj/v2.5.0rel/>`_
9797
9898 Additionally, the :class:`pyproj.transformer.TransformerGroup` can assist finding the grids you need to download.
9999
100 .. warning:: There are cases where the URL to download the grid is missing.
101
100102 .. code-block:: python
101103
102104 >>> from pyproj.transformer import TransformerGroup
+0
-1
github_deploy_key_pyproj4_pyproj.enc less more
0 gAAAAABcv0vdkreKT0kDO9nMioPyB2R66eYGDtTK08mBxWq1dvzZ_aK2HEVvJ0e7nZtpTGdQuR6GTq5_6yA2iYScVK7Z4LoOqw3dDaQX6ssnYdcmTzdiAVRDE-kZ9WXUxf7izcBsafLmNgizctJ2MT23AQ30CEYb0J4C1Akq9PThRoIdJ3P4jhyztlTjPv4PxcCrA2Gl_x0pJsAS-vpC38A6n41ZxiKQrkBqoKwem11p7Ui4vjv6mcARSuRXHWpiQSHuJXpLfMZv0_GM7VYxdVo04WZA-dPv6RyER4rPlJwvpdWQ2GNN3ZyfYW4-EiSdNuoCe8idQM2cZr5ZoMLSAtZUFlfORVqWV7eyU1HYbaoicfqwMTgOijy06u7ifn60Yg-C-D2GwWNHYgDZm-JPYoaarn47bJqlrdhQaCSif1mrGThGcbtsIhnnH0yJXpj6fdhi4QhaksoLe2cOi9mBYB0WbM-JYDyfIdRDyfnos40iOk5PJe-dj51AdDcDOLk7gegCiTt_MDQKrLt1GnEfPlo5EBa7BqT7Ws38mAY2UG28BoMfHDhV2JYWspDGGZ7EDi8T-IQAwe2z3swCLh1EW7TT9CcTwxYMqX-y0Kj99bcZHoiFvG76u78fsNe1fIPLmGFJ7zyfR_sTBt08rDyWR1B_Ssspk66xedVttWt_cCn_FHJQIyD7dufz_X4dnxV9qPykVzJ9T6Z45eLSSC38M8QPa9oZIuoTWJnbNKWjIC8B_0MZk3QXjI3ZiMFvrWic5CZjHk84VKEwbkxvfZhZwXiY5bK4bLI2eCJatipAhjH3TKwAZIzYiIQv_yswaUQ7I77pMGaFwgLx7cLjIFnBpOYzow9VeT7bTZWIydNMtwU7QeYCsLtcJj99bmj45egzlLWWsZQjasZ6uZ9atRKeQPpoqnCnTMpdx_v7WHTO2PuBaH6_9vvIJdi1foVmeGMmnbq-hvvdoFdt7bevlSFN_f1Izcf1OGME_3tEHvHp2gssbtaQ2kZw5Bfj4eBCnqC-GBLztg_aykKAs_A3DF2gXo-4j2Yc30dzdtXS2yscopJudW7GywEJD2wpVEX-zN8DXL_lfW7nCRSaMWi42EdrSIFNwxvMWKZXGAIhld_29U3zq-faxA6qq5nDsj1roygVu-oXUP2Icqstje2OucMOfdkOEDdB-mvGCnNYIffthdlw6NbCes82Zsjqmk08Ms1Hrwxeh_vrO3Vrip3IEgeGIdtu8I-K-pGUDRVikLeaNyrx88jggsog-GF1N86OsjdYueV-eCsuq3rV_fuFDt76v_a0HV3FjFq6eZc3bB7pgBarFlRTQsRGHM5q_XaVY_Tp_iJBYlZbFjsMY5RSF_OGvdeVtkL4g7Rgyhj8WgVYfz4Ykrp_vZuAYWQE3LYpuqCq5tjFOm9nFcPxpwjEoV3rlMijiOwTdCg7Kg3QMRcDjnloIDzBa7mpvuuNgou4tCehzh83kFlw3oskHQgQkRXwKDreLoxDlgxxXu-zQGRz7zLOf0xJii6ZGSIdCBEJvCndF8AAHSA5ReTyFPlLwiQAEQ5zvUAuQ9rVrYaYG1SeFqhtxkuAUvhxRdIzg2ICKpASkI52EpvhXbeJe8JcMBOwKRXiB6XcdtOffX9eYVm1gp0wZ-1rmWa8Uqg3flTzls9ug2kgRzbJN5vsBoSLVJXwzBZjacZ9ZQ7ZciwUK0_Dg-D2emCymkVcFUrnB2OsnE4rNIkfhUpTG9vXp-n1tVnzm8UXoLLvfldDtjxdz9sQsj9hORkxkVcpDpeqE1I7UdmBHCCz_bZ7bj230KTfdEXQMWcQWfWFl4U8KiaSnJBBjwAjMIHbT7UxJzbsOpl7cN_WuObrvGLWUnByXILW7QDe8XQwfSYwX75l05g9a7PHNXhfX61DUFcw2asY1m9UP4WPljFfgcR46xcHfkwQjGE232wfQ5hPfiVoskTLmBP-EdAd-gc6aWVb6hIv55p0iNRlkNs4fMmQNejmQjwIGRvZgYq99MSdhocG5yueJaEAMAaXpAawXm54Sh1Aw9fYSyMYe0p6glKqil-_Eck3Lx1RFaXfvOK0ICgsnSaqN7n7QDJ5TjE8yVxJjBTCEMbKJU5m57DRjRezKK35LN-ZfpQH3eINTLbjYN3FII-aycNrjP5uev9fSceNrq9JWGoYIVDeBqJV3akai9a2tvGXJh7Dn3alvMOzPzqJKhC4mO5T0bCtAcN_8SAI87E77Ver9D6nyvk1Jvul18Ax50ta7paJ1jZWKL_gjFCfVm5m9FWlXx3ytDzEO8HSNd4uI_u6iKqZf9btBFJZu0P8vtvSVAGBj-D5Gty99gTy9V0qZSPmOmf2vqMeIpFHXTzJ8HKEDvGms0o4ymSY3YP3UPvQivqnP5ggIccZgvGlaRoWHUOMyFNRRCc8gr_s2-gO4mixXtonjnaw1l1HOXKrykVvnWCdEgkMFsYJRl-2ob4BeJDisus3g7gRKBgP9h1KSMtFokkeFkRmnDvdWximbs5kXibfz_4GbK7sGuWUF6kbvE4lEKYADPdRbtSCEZCTqcVgyUOclz-fbUgaeXwazC-xMclXhdFfJl4eSGhs7-60GVHErJZBMoVTr3-fdPsEpJrGa4etr2MRtW-XuOrSIMxgiyAoLm6ZFu5gqoQCKTil69-rpHHGIDmLZeJ4mNckoq7VGHAIWooj35jnnExBqwzh6mKack6THi2W3buzFlKbI7BRpXxbRktDgOLCx8hRJe2B1RrdUHuraa8kEqq-UHSiL59YvhnVwWUXwQs_ppX6L0_qAg3AvCACrLNJV3FlChJ7H0xGT7ZhYmJzrTfE7gJnVweLTQQCxFJEnIyB7jBCaWArttTGJZ4tiX_Z3Du4KertA2sodEz7TPnPAuQH6ZWgRXsA0XsOWGVmBlT00REN7hIKGY41o-2zaLOJ0ATAMVNGg6572sge5M8QXPO24_ekWX82NWwKMdm0MfCuKMlTRdclFFgQ5YCEDENJyv3RYQ2hItX8hrBFJ-r8rcd-AUjHJnFNnHhQ9P6f6J7JzMl4vWTYD6lwWIV2SmlVZZlHtVIcMYKaCJTHorWs7RHhxa4sJBP8Z2h_U69Xs1KDBUJrRaA9--TT3MHNwFZVPAfsD0ARjyjoBc53mMMNOhyF9Zkwla90cezdKMPnKh0eE68-0AejMhpFFTdOnOLKSvmBHGDKo9I9tiDBgDKp_vamJIoxeBk1Tn1s6GVC0HSKJOGqBBfKqNtliIrJ0F4i_AAzYeIdJnDwpWIzanWZwm216N6gqHMZdIjl32rwfi5MiT9hcgySIwEe76R1WcVdhnMxtCtivbEWh-d7IzpoD8jEN6ljUG7D41mwPrfyQ0NpwzUubNPiFWApdAwsuiof7E70u4N-7eS1rIlUtlt5x_hGr6OB9eDES9THlK2zJqEojbv7Sx5SO9E3N1LT3-FCiLcZoHObW5hFe_MD4YRLO47nAoTcnmWPb6E2TK40glcepdZfcfam6sox3CX9e25QTs2yYm5pnDLvW6cqQOTkAJ5d2kcUXiUGTKAg4dCJDyjakquCwh5UZtfpKq9zusOrxGzq5Hv4p7oWfOCTjupxA2LHozt22Lv10uOTBiVdyJ0_Ik0T3tbDYegcHZlt5inXvtIc6drsNLQDCjCzSEWbdiyzq3VHHEeGgN9IP9NXOfwssWWxeJtD39IUL6SQ6C1LpVWXJ_oBQLnc131d0fBgT86iWHntC5w-zAbGvcxB2kz9CxzejBffCurVTXVh0dCm33CFd3DhGptn2oSI_r63YD8VFWtM0Q9NEWI61r9fuo6zIY6E1AQgNqsPQSkFExrcq6WqNqfbbq7BFR63MPiGhE2lBvIb6jIgn1B9R1hOB99lxaz6d-5FxqFfzUCyPILgX3kF3u509l4yd7ZXmjKJDo_YMEca5J21OAtmsqLVRQ4dYKsEMH7_SrvQLF2UY9fmkPD8OfW0tcDZHLMYZ-ZusqCPmpzwsTBQWxNkACwhuLBP_oeQbzuXIvhNl1mxQzz9NTImuRwfgr5S_E-zHiizdTqVzSTrVb1q2tsacOZn4Y9nPMVG4qejrcEq1qSZHpg1hYr_4D8g-0OOO3OrChRdWPS3T2IqTcqf74IBq-QZ_5nF_2csXUlOSv436G_LbS35jUz231rML25chdNGqVA16MM_huOWL6ertJoxMEiFt5mMSu7mi5ZfvRZVar5uf_yY4rU0_uafMPve45qIZJmGeHhqAdw1Moet0TFk3OuJKsQki37BGFjbYlFNpTp_3uKUuUmzdsbRnQGgMgQ9GwA1ICejVuYxCDOxGFr8LkXrZgiy8EaCLoxhvMWshHtzBmGua2c0fx-qfC3lY9be25ouFYv6gH_sIJQZRGpMR-t5AZ0GC2QdSCuEIfWCKX6pZQUZkYr5sfZQnYKwnVMufZGHHc_70Pcb90J3kVI-pNIlWqmRSw==
2727 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2828 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2929 """
30 __version__ = "3.0.0"
30 __version__ = "3.0.1rc0"
3131 __all__ = [
3232 "Proj",
3333 "Geod",
1212 from pyproj.enums import ProjVersion, WktVersion
1313 from pyproj.exceptions import CRSError
1414 from pyproj.geod import pj_ellps
15 from pyproj.utils import NumpyEncoder
1516
1617 # This is for looking up the ellipsoid parameters
1718 # based on the long name
644645 -------
645646 CoordinateSystem
646647 """
647 return CoordinateSystem.from_string(json.dumps(coordinate_system_dict))
648 return CoordinateSystem.from_string(
649 json.dumps(coordinate_system_dict, cls=NumpyEncoder)
650 )
648651
649652 @staticmethod
650653 def from_json(coordinate_system_json_str):
933936 -------
934937 Ellipsoid
935938 """
936 return Ellipsoid._from_string(json.dumps(ellipsoid_dict))
939 return Ellipsoid._from_string(json.dumps(ellipsoid_dict, cls=NumpyEncoder))
937940
938941 @staticmethod
939942 def from_json(ellipsoid_json_str):
12141217 -------
12151218 PrimeMeridian
12161219 """
1217 return PrimeMeridian._from_string(json.dumps(prime_meridian_dict))
1220 return PrimeMeridian._from_string(
1221 json.dumps(prime_meridian_dict, cls=NumpyEncoder)
1222 )
12181223
12191224 @staticmethod
12201225 def from_json(prime_meridian_json_str):
15691574 -------
15701575 Datum
15711576 """
1572 return Datum._from_string(json.dumps(datum_dict))
1577 return Datum._from_string(json.dumps(datum_dict, cls=NumpyEncoder))
15731578
15741579 @staticmethod
15751580 def from_json(datum_json_str):
20442049 -------
20452050 CoordinateOperation
20462051 """
2047 return CoordinateOperation._from_string(json.dumps(coordinate_operation_dict))
2052 return CoordinateOperation._from_string(
2053 json.dumps(coordinate_operation_dict, cls=NumpyEncoder)
2054 )
20482055
20492056 @staticmethod
20502057 def from_json(coordinate_operation_json_str):
2222
2323 # version number string for PROJ
2424 proj_version_str = f"{PROJ_VERSION_MAJOR}.{PROJ_VERSION_MINOR}.{PROJ_VERSION_PATCH}"
25
26
27 cdef pyproj_errno_string(PJ_CONTEXT* ctx, int err):
28 # https://github.com/pyproj4/pyproj/issues/760
29 IF CTE_PROJ_VERSION_MAJOR >= 8:
30 return pystrdecode(proj_context_errno_string(ctx, err))
31 ELSE:
32 return pystrdecode(proj_errno_string(err))
2533
2634
2735 _PJ_DIRECTION_MAP = {
472480 buflent = xbuff.len
473481 tt = NULL
474482
475 if not xbuff.len or not (xbuff.len == ybuff.len == buflenz == buflent):
476 raise ProjError('x, y, z, and time must be same size')
483 if not (xbuff.len == ybuff.len == buflenz == buflent):
484 raise ProjError('x, y, z, and time must be same size if included.')
477485
478486 cdef Py_ssize_t iii
479487 cdef int errno = 0
502510 if errcheck and errno:
503511 with gil:
504512 raise ProjError(
505 f"transform error: {pystrdecode(proj_errno_string(errno))}"
513 f"transform error: {pyproj_errno_string(self.context, errno)}"
506514 )
507515 elif errcheck:
508516 with gil:
600608 if errcheck and errno:
601609 with gil:
602610 raise ProjError(
603 f"itransform error: {pystrdecode(proj_errno_string(errno))}"
611 f"itransform error: {pyproj_errno_string(self.context, errno)}"
604612 )
605613 elif errcheck:
606614 with gil:
700708 if errcheck and errno:
701709 with gil:
702710 raise ProjError(
703 f"proj error: {pystrdecode(proj_errno_string(errno))}"
711 f"proj error: {pyproj_errno_string(self.context, errno)}"
704712 )
705713
706714 if errno or invalid_coord:
351351 """
352352 .. versionadded:: 2.3.0
353353
354 Calculate the total distance between points along a line.
354 Calculate the total distance between points along a line (meters).
355355
356356 >>> from pyproj import Geod
357357 >>> geod = Geod('+a=6378137 +f=0.0033528106647475126')
376376 Returns
377377 -------
378378 float:
379 The total length of the line.
379 The total length of the line (meters).
380380 """
381381 # process inputs, making copies that support buffer API.
382382 inx, xisfloat, xislist, xistuple = _copytobuffer(lons)
387387 """
388388 .. versionadded:: 2.3.0
389389
390 Calculate the distances between points along a line.
390 Calculate the distances between points along a line (meters).
391391
392392 >>> from pyproj import Geod
393393 >>> geod = Geod(ellps="WGS84")
410410 Returns
411411 -------
412412 array, :class:`numpy.ndarray`, list, tuple, or scalar:
413 The total length of the line.
413 The total length of the line (meters).
414414 """
415415 # process inputs, making copies that support buffer API.
416416 inx, xisfloat, xislist, xistuple = _copytobuffer(lons)
11
22 IF CTE_PROJ_VERSION_MAJOR >= 8:
33 cdef extern from "proj.h":
4 const char * proj_context_errno_string(PJ_CONTEXT* ctx, int err)
45 ctypedef enum PJ_CATEGORY:
56 PJ_CATEGORY_ELLIPSOID
67 PJ_CATEGORY_PRIME_MERIDIAN
1011 PJ_CATEGORY_DATUM_ENSEMBLE
1112 ELSE:
1213 cdef extern from "proj.h":
14 const char * proj_errno_string(int err)
1315 ctypedef enum PJ_CATEGORY:
1416 PJ_CATEGORY_ELLIPSOID
1517 PJ_CATEGORY_PRIME_MERIDIAN
5052
5153 int proj_errno (const PJ *P) nogil
5254 int proj_context_errno (PJ_CONTEXT *ctx)
53 const char * proj_errno_string (int err)
5455 int proj_errno_reset (const PJ *P) nogil
5556 PJ *proj_create (PJ_CONTEXT *ctx, const char *definition)
5657 PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ* obj)
122122 .. versionadded:: 3.0.0
123123
124124 Download missing grids that can be downloaded automatically.
125
126 .. warning:: There are cases where the URL to download the grid is missing.
127 In those cases, you can enable enable
128 :ref:`debugging-internal-proj` and perform a
129 transformation. The logs will show the grids PROJ searches for.
125130
126131 Parameters
127132 ----------
00 """
11 Utility functions used within pyproj
22 """
3 import json
34 from array import array
45 from typing import Any, Tuple
6
7
8 class NumpyEncoder(json.JSONEncoder):
9 """
10 Handle numpy types when dumping to JSON
11 """
12
13 def default(self, obj):
14 try:
15 return obj.tolist()
16 except AttributeError:
17 pass
18 try:
19 # numpy scalars
20 if obj.dtype.kind == "f":
21 return float(obj)
22 elif obj.dtype.kind == "i":
23 return int(obj)
24 except AttributeError:
25 pass
26 return json.JSONEncoder.default(self, obj)
527
628
729 def _copytobuffer_return_scalar(xx: Any) -> Tuple[array, bool, bool, bool]:
00 cython>=0.28.4
1 black
2 flake8
31 mypy
4 numpy
5 pandas
6 pylint
7 pytest>3.6
8 pytest-cov
9 shapely
102 pre-commit
11 xarray
0 sphinx < 3.5.0
1 sphinx_rtd_theme
2 sphinx-argparse
0 pytest>3.6
1 pytest-cov
2 numpy
3 pandas
4 shapely
5 xarray
3434
3535 [options]
3636 zip_safe = False # https://mypy.readthedocs.io/en/stable/installed_packages.html
37 packages = find:
37 packages = pyproj,pyproj.crs
3838 python_requires = >=3.6
3939 install_requires =
4040 certifi
2828 """checks that the PROJ library meets the minimum version"""
2929 if parse_version(proj_version) < PROJ_MIN_VERSION:
3030 raise SystemExit(
31 f"ERROR: Minimum supported proj version is {PROJ_MIN_VERSION}, installed "
31 f"ERROR: Minimum supported PROJ version is {PROJ_MIN_VERSION}, installed "
3232 f"version is {proj_version}. For more information see: "
3333 "https://pyproj4.github.io/pyproj/stable/installation.html"
3434 )
5757 )
5858 proj_dir = Path(proj).parent.parent
5959 elif proj_dir is not None and proj_dir.exists():
60 print("PROJ_DIR is set, using existing proj4 installation..\n")
60 print("PROJ_DIR is set, using existing PROJ installation..\n")
6161 else:
6262 raise SystemExit(f"ERROR: Invalid path for PROJ_DIR {proj_dir}")
6363 return proj_dir
143143 except ImportError:
144144 raise SystemExit(
145145 "ERROR: Cython.Build.cythonize not found. "
146 "Cython is required to build from a repo."
146 "Cython is required to build pyproj."
147147 )
148148
149149 # By default we'll try to get options PROJ_DIR or the local version of proj
214214 if line.find("__version__") >= 0:
215215 # parse __version__ and remove surrounding " or '
216216 return line.split("=")[1].strip()[1:-1]
217 raise SystemExit("ERROR: pyproj version not fount.")
217 raise SystemExit("ERROR: pyproj version not found.")
218218
219219
220220 # static items in setup.cfg
77
88 _NETWORK_ENABLED = pyproj.network.is_network_enabled()
99 PROJ_GTE_8 = LooseVersion(pyproj.__proj_version__) >= LooseVersion("8.0")
10
11
12 if PROJ_GTE_8:
13 # https://github.com/OSGeo/PROJ/pull/2536
14 HAYFORD_ELLIPSOID_NAME = "International 1924 (Hayford 1909, 1910)"
15 else:
16 HAYFORD_ELLIPSOID_NAME = "International 1909 (Hayford)"
1017
1118
1219 def unset_data_dir():
1414 from pyproj.enums import ProjVersion, WktVersion
1515 from pyproj.exceptions import CRSError
1616 from pyproj.transformer import TransformerGroup
17 from test.conftest import PROJ_GTE_8, get_wgs84_datum_name, grids_available
17 from test.conftest import (
18 HAYFORD_ELLIPSOID_NAME,
19 PROJ_GTE_8,
20 get_wgs84_datum_name,
21 grids_available,
22 )
1823
1924
2025 class CustomCRS(object):
989994 "input_str,long_name",
990995 [
991996 ("Airy 1830", "Airy 1830"),
992 ("intl", "International 1909 (Hayford)"),
993 ("International 1909 (Hayford)", "International 1909 (Hayford)"),
997 ("intl", HAYFORD_ELLIPSOID_NAME),
998 (HAYFORD_ELLIPSOID_NAME, HAYFORD_ELLIPSOID_NAME),
994999 ],
9951000 )
9961001 def test_ellipsoid__from_name(input_str, long_name):
0 import numpy
01 import pytest
12 from numpy.testing import assert_almost_equal
23
1516 VerticalPerspectiveConversion,
1617 )
1718 from pyproj.exceptions import CRSError
18 from test.conftest import get_wgs84_datum_name
19 from test.conftest import HAYFORD_ELLIPSOID_NAME, get_wgs84_datum_name
1920
2021
2122 def _to_dict(operation):
3940 assert_almost_equal(cf_dict.pop("towgs84"), expected_cf.pop("towgs84"))
4041
4142 assert cf_dict == expected_cf
43
44
45 def test_cf_from_numpy_dtypes():
46 cf = {
47 "grid_mapping_name": "lambert_conformal_conic",
48 "standard_parallel": numpy.array([60, 30], dtype="f4"),
49 "longitude_of_central_meridian": numpy.float32(0),
50 "latitude_of_projection_origin": numpy.int32(45),
51 }
52 crs = CRS.from_cf(cf)
53 with pytest.warns(UserWarning):
54 assert crs.to_dict() == {
55 "datum": "WGS84",
56 "lat_0": 45,
57 "lat_1": 60,
58 "lat_2": 30,
59 "lon_0": 0,
60 "no_defs": None,
61 "proj": "lcc",
62 "type": "crs",
63 "units": "m",
64 "x_0": 0,
65 "y_0": 0,
66 }
4267
4368
4469 def test_to_cf_transverse_mercator():
5883 "semi_major_axis": 6378388.0,
5984 "semi_minor_axis": crs.ellipsoid.semi_minor_metre,
6085 "inverse_flattening": 297.0,
61 "reference_ellipsoid_name": "International 1909 (Hayford)",
86 "reference_ellipsoid_name": HAYFORD_ELLIPSOID_NAME,
6287 "longitude_of_prime_meridian": 0.0,
6388 "prime_meridian_name": "Greenwich",
6489 "horizontal_datum_name": (
65 "Unknown based on International 1909 (Hayford) ellipsoid"
90 f"Unknown based on {HAYFORD_ELLIPSOID_NAME} ellipsoid"
6691 ),
6792 "towgs84": towgs84_test,
6893 "grid_mapping_name": "transverse_mercator",
134159 "semi_major_axis": 6378388.0,
135160 "semi_minor_axis": crs.ellipsoid.semi_minor_metre,
136161 "inverse_flattening": 297.0,
137 "reference_ellipsoid_name": "International 1909 (Hayford)",
162 "reference_ellipsoid_name": HAYFORD_ELLIPSOID_NAME,
138163 "longitude_of_prime_meridian": 0.0,
139164 "prime_meridian_name": "Greenwich",
140165 "grid_mapping_name": "transverse_mercator",
1818 from pyproj.crs.coordinate_system import Cartesian2DCS, Ellipsoidal3DCS, VerticalCS
1919 from pyproj.crs.datum import CustomDatum
2020 from pyproj.crs.enums import VerticalCSAxis
21 from test.conftest import HAYFORD_ELLIPSOID_NAME
2122
2223
2324 def test_make_projected_crs():
135136 false_northing=0,
136137 scale_factor_natural_origin=0.9996,
137138 ),
138 geodetic_crs=GeographicCRS(
139 datum=CustomDatum(ellipsoid="International 1909 (Hayford)")
140 ),
139 geodetic_crs=GeographicCRS(datum=CustomDatum(ellipsoid=HAYFORD_ELLIPSOID_NAME)),
141140 )
142141 bound_crs = BoundCRS(
143142 source_crs=proj_crs,
1717 )
1818 from pyproj.enums import PJType
1919 from pyproj.exceptions import CRSError
20 from test.conftest import proj_env
20 from test.conftest import PROJ_GTE_8, proj_env
2121
2222
2323 @contextmanager
236236 assert "PROJ_TRACE" not in captured.err
237237 assert "PROJ_DEBUG" in captured.err
238238 else:
239 assert captured.err == ""
239 if PROJ_GTE_8:
240 assert "PROJ_ERROR" in captured.err
241 else:
242 assert captured.err == ""
240243
241244
242245 def test_proj_debug_logging__error(capsys):
66
77 import numpy as np
88 import pytest
9 from numpy.testing import assert_almost_equal
9 from numpy.testing import assert_almost_equal, assert_array_equal
1010
1111 import pyproj
1212 from pyproj import Proj, Transformer, itransform, transform
1414 from pyproj.enums import TransformDirection
1515 from pyproj.exceptions import ProjError
1616 from pyproj.transformer import AreaOfInterest, TransformerGroup
17 from test.conftest import grids_available, proj_env, proj_network_env
17 from test.conftest import PROJ_GTE_8, grids_available, proj_env, proj_network_env
1818
1919
2020 def test_tranform_wgs84_to_custom():
4343 assert f"{xx:.3f} {yy:.3f}" == "-1825155.697 330730.391"
4444
4545
46 @pytest.mark.skipif(PROJ_GTE_8, reason="https://github.com/OSGeo/PROJ/issues/2425")
4647 def test_illegal_transformation():
4748 # issue 202
4849 with pytest.warns(FutureWarning):
400401 )
401402
402403
404 @pytest.mark.parametrize("empty_array", [(), [], np.array([])])
405 def test_transform_empty_array_xy(empty_array):
406 transformer = Transformer.from_crs(2193, 4326)
407 assert_array_equal(
408 transformer.transform(empty_array, empty_array), (empty_array, empty_array)
409 )
410
411
412 @pytest.mark.parametrize("empty_array", [(), [], np.array([])])
413 def test_transform_empty_array_xyzt(empty_array):
414 transformer = Transformer.from_pipeline("+init=ITRF2008:ITRF2000")
415 assert_array_equal(
416 transformer.transform(empty_array, empty_array, empty_array, empty_array),
417 (empty_array, empty_array, empty_array, empty_array),
418 )
419
420
403421 def test_transform_direction__string():
404422 forward_transformer = Transformer.from_crs(4326, 3857)
405423 inverse_transformer = Transformer.from_crs(3857, 4326)
454472
455473 def test_str():
456474 assert str(Transformer.from_crs(4326, 3857)).startswith("proj=pipeline")
475
476
477 _BOUND_REPR = (
478 "(-16.096100515106, 32.884955146013, 40.178745269776, 84.722623821813)"
479 if PROJ_GTE_8
480 else "(-16.1, 32.88, 40.18, 84.17)"
481 )
457482
458483
459484 @pytest.mark.parametrize(
477502 "Spain; Sweden; Switzerland; "
478503 "United Kingdom (UK) including Channel Islands and Isle of Man; "
479504 "Vatican City State.\n"
480 "- bounds: (-16.1, 32.88, 40.18, 84.17)"
505 f"- bounds: {_BOUND_REPR}"
481506 ),
482507 ),
483508 (