New upstream version 3.0.1~rc0
Bas Couwenberg
3 years ago
132 | 132 | "profile": "https://github.com/djhoese", |
133 | 133 | "contributions": [ |
134 | 134 | "review", |
135 | "ideas" | |
135 | "ideas", | |
136 | "platform" | |
136 | 137 | ] |
137 | 138 | }, |
138 | 139 | { |
407 | 408 | "contributions": [ |
408 | 409 | "test" |
409 | 410 | ] |
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 | ] | |
410 | 429 | } |
411 | 430 | ], |
412 | 431 | "contributorsPerLine": 7 |
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 | --- | |
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 |
0 | 0 | [settings] |
1 | line_length=88 | |
2 | multi_line_output=3 | |
3 | 1 | known_first_party=pyproj,test |
4 | include_trailing_comma=true | |
2 | profile=black |
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 |
76 | 76 | ``cd pyproj`` |
77 | 77 | * Connect your repository to the upstream (main project). |
78 | 78 | ``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``. | |
80 | 80 | * If the minimum PROJ version is not yet available, you can build PROJ from source using: |
81 | 81 | ```bash |
82 | 82 | export PROJ_DIR=$PWD/pyproj/proj_dir |
83 | 83 | mkdir $PROJ_DIR |
84 | bash ci/travis/proj-dl-and-compile git | |
84 | bash ci/proj-compile.sh git | |
85 | 85 | ``` |
86 | 86 | * Activate our new development environment ``conda activate devel`` on Mac/Linux or |
87 | 87 | ``activate devel`` on Windows. |
125 | 125 | ``pytest``, which is easily available through ``conda`` or ``pip``. It was also installed if you made our default ``devel`` environment. |
126 | 126 | |
127 | 127 | ### 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``. | |
129 | 129 | |
130 | 130 | Running the whole test suite isn't that slow, but can be a burden if you're working on just |
131 | 131 | one module or a specific test. It is easy to run tests on a single directory: |
59 | 59 | rm -f pyproj/*/*.c |
60 | 60 | rm -f pyproj/*.c |
61 | 61 | |
62 | lint: ## check style with flake8 | |
63 | flake8 setup.py pyproj/ test/ docs/ | |
64 | flake8 --append-config=flake8/cython.cfg pyproj/ | |
65 | ||
66 | 62 | check-type: |
67 | 63 | mypy pyproj |
68 | 64 | |
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 | |
78 | 67 | |
79 | 68 | test: ## run tests |
80 | 69 | py.test |
86 | 75 | py.test --cov-report term-missing --cov=pyproj -v -s |
87 | 76 | |
88 | 77 | 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 | |
90 | 79 | |
91 | 80 | docs: ## generate Sphinx HTML documentation, including API docs |
92 | 81 | $(MAKE) -C docs clean |
103 | 92 | python setup.py install |
104 | 93 | |
105 | 94 | 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 . |
3 | 3 | |
4 | 4 | <p align="center"> |
5 | 5 | <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> | |
10 | 10 | <a href="https://badge.fury.io/py/pyproj"><img alt="PyPI" src="https://badge.fury.io/py/pyproj.svg"></a> |
11 | 11 | <a href="https://pepy.tech/project/pyproj"><img alt="Downloads" src="https://pepy.tech/badge/pyproj"></a> |
12 | 12 | <a href="https://anaconda.org/conda-forge/pyproj"><img alt="Anaconda-Server Badge" src="https://anaconda.org/conda-forge/pyproj/badges/version.svg"></a> |
23 | 23 | |
24 | 24 | ## Bugs/Questions |
25 | 25 | |
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 | |
27 | 28 | - 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 | |
29 | 30 | |
30 | 31 | ## Contributors ✨ |
31 | 32 | |
36 | 37 | <!-- markdownlint-disable --> |
37 | 38 | <table> |
38 | 39 | <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> | |
46 | 47 | </tr> |
47 | 48 | <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> | |
55 | 56 | </tr> |
56 | 57 | <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> | |
64 | 65 | </tr> |
65 | 66 | <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> | |
73 | 74 | </tr> |
74 | 75 | <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> | |
82 | 83 | </tr> |
83 | 84 | <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> | |
87 | 90 | </tr> |
88 | 91 | </table> |
89 | 92 | |
90 | <!-- markdownlint-enable --> | |
93 | <!-- markdownlint-restore --> | |
91 | 94 | <!-- prettier-ignore-end --> |
95 | ||
92 | 96 | <!-- ALL-CONTRIBUTORS-LIST:END --> |
93 | 97 | |
94 | 98 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! |
102 | 102 | - set PYPROJ_FULL_COVERAGE=YES |
103 | 103 | - "python -m pip install -e ." |
104 | 104 | - "python -m pip install -r requirements-dev.txt" |
105 | - "python -m pip install -r requirements-test.txt" | |
105 | 106 | |
106 | 107 | |
107 | 108 | install: |
133 | 134 | - "%CMD_IN_ENV% python -c \"import pyproj; pyproj.Proj('epsg:4269')\"" |
134 | 135 | - "%CMD_IN_ENV% py.test --cov-report term-missing --cov=pyproj -v -s" |
135 | 136 | |
136 | after_test: | |
137 | # TODO: build wheels | |
138 | # after_test: | |
137 | 139 | # 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" | |
148 | 142 | # - "%CMD_IN_ENV% python setup.py bdist_wininst" |
149 | 143 | # - "%CMD_IN_ENV% python setup.py bdist_msi" |
150 | 144 | # 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')" | |
153 | 147 | # 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" | |
156 | 150 | |
157 | 151 | artifacts: |
158 | 152 | # 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 | #!/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 |
44 | 44 | |
45 | 45 | |
46 | 46 | Transforming with the same projections |
47 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
47 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
48 | 48 | |
49 | 49 | pyproj will skip transformations if they are exactly the same by default. However, if you |
50 | 50 | sometimes throw in the projections that are about the same and the results being close enough |
113 | 113 | |
114 | 114 | .. code-block:: python |
115 | 115 | |
116 | from distutils.version import LooseVersion | |
117 | ||
116 | 118 | from pyproj.crs import BoundCRS, Ellipsoid, GeographicCRS, ProjectedCRS |
117 | 119 | from pyproj.crs.coordinate_operation import ( |
118 | 120 | TransverseMercatorConversion, |
119 | 121 | ToWGS84Transformation, |
120 | 122 | ) |
121 | 123 | 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)" | |
122 | 131 | |
123 | 132 | proj_crs = ProjectedCRS( |
124 | 133 | conversion=TransverseMercatorConversion( |
129 | 138 | scale_factor_natural_origin=0.9996, |
130 | 139 | ), |
131 | 140 | geodetic_crs=GeographicCRS( |
132 | datum=CustomDatum(ellipsoid="International 1909 (Hayford)") | |
141 | datum=CustomDatum(ellipsoid=HAYFORD_ELLIPSOID_NAME) | |
133 | 142 | ), |
134 | 143 | ) |
135 | 144 | bound_crs = BoundCRS( |
248 | 248 | - To get data directory being used: :func:`pyproj.datadir.get_data_dir` |
249 | 249 | - The order for searching for the data directory can be found in |
250 | 250 | 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` | |
252 | 252 | |
253 | 253 | |
254 | 254 | .. _upgrade_transformer: |
0 | 0 | Change Log |
1 | 1 | ========== |
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) | |
2 | 9 | |
3 | 10 | 3.0.0 |
4 | 11 | ----- |
5 | 12 | * Minimum supported Python version 3.6 (issue #499) |
6 | 13 | * Minimum PROJ version 7.2 (issues #599 & #689) |
7 | 14 | * WHL: Removed datumgrids from wheels because not needed with RFC 4 (pull #628) |
15 | * WHL: Wheels contain PROJ 7.2 | |
8 | 16 | * ENH: Added :ref:`network` (#675, #691, #695) |
9 | 17 | * ENH: Added ability to use global context (issue #661) |
10 | 18 | * ENH: Added transformation grid sync API/CLI (issue #572) |
0 | 0 | Documentation Archive |
1 | 1 | ===================== |
2 | 2 | |
3 | - `3.0.0 <https://pyproj4.github.io/pyproj/3.0.0/>`_ | |
3 | 4 | - `2.6.1 <https://pyproj4.github.io/pyproj/v2.6.1rel/>`_ |
4 | 5 | - `2.6.0 <https://pyproj4.github.io/pyproj/v2.6.0rel/>`_ |
5 | 6 | - `2.5.0 <https://pyproj4.github.io/pyproj/v2.5.0rel/>`_ |
97 | 97 | |
98 | 98 | Additionally, the :class:`pyproj.transformer.TransformerGroup` can assist finding the grids you need to download. |
99 | 99 | |
100 | .. warning:: There are cases where the URL to download the grid is missing. | |
101 | ||
100 | 102 | .. code-block:: python |
101 | 103 | |
102 | 104 | >>> from pyproj.transformer import TransformerGroup |
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== |
27 | 27 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
28 | 28 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
29 | 29 | """ |
30 | __version__ = "3.0.0" | |
30 | __version__ = "3.0.1rc0" | |
31 | 31 | __all__ = [ |
32 | 32 | "Proj", |
33 | 33 | "Geod", |
12 | 12 | from pyproj.enums import ProjVersion, WktVersion |
13 | 13 | from pyproj.exceptions import CRSError |
14 | 14 | from pyproj.geod import pj_ellps |
15 | from pyproj.utils import NumpyEncoder | |
15 | 16 | |
16 | 17 | # This is for looking up the ellipsoid parameters |
17 | 18 | # based on the long name |
644 | 645 | ------- |
645 | 646 | CoordinateSystem |
646 | 647 | """ |
647 | return CoordinateSystem.from_string(json.dumps(coordinate_system_dict)) | |
648 | return CoordinateSystem.from_string( | |
649 | json.dumps(coordinate_system_dict, cls=NumpyEncoder) | |
650 | ) | |
648 | 651 | |
649 | 652 | @staticmethod |
650 | 653 | def from_json(coordinate_system_json_str): |
933 | 936 | ------- |
934 | 937 | Ellipsoid |
935 | 938 | """ |
936 | return Ellipsoid._from_string(json.dumps(ellipsoid_dict)) | |
939 | return Ellipsoid._from_string(json.dumps(ellipsoid_dict, cls=NumpyEncoder)) | |
937 | 940 | |
938 | 941 | @staticmethod |
939 | 942 | def from_json(ellipsoid_json_str): |
1214 | 1217 | ------- |
1215 | 1218 | PrimeMeridian |
1216 | 1219 | """ |
1217 | return PrimeMeridian._from_string(json.dumps(prime_meridian_dict)) | |
1220 | return PrimeMeridian._from_string( | |
1221 | json.dumps(prime_meridian_dict, cls=NumpyEncoder) | |
1222 | ) | |
1218 | 1223 | |
1219 | 1224 | @staticmethod |
1220 | 1225 | def from_json(prime_meridian_json_str): |
1569 | 1574 | ------- |
1570 | 1575 | Datum |
1571 | 1576 | """ |
1572 | return Datum._from_string(json.dumps(datum_dict)) | |
1577 | return Datum._from_string(json.dumps(datum_dict, cls=NumpyEncoder)) | |
1573 | 1578 | |
1574 | 1579 | @staticmethod |
1575 | 1580 | def from_json(datum_json_str): |
2044 | 2049 | ------- |
2045 | 2050 | CoordinateOperation |
2046 | 2051 | """ |
2047 | return CoordinateOperation._from_string(json.dumps(coordinate_operation_dict)) | |
2052 | return CoordinateOperation._from_string( | |
2053 | json.dumps(coordinate_operation_dict, cls=NumpyEncoder) | |
2054 | ) | |
2048 | 2055 | |
2049 | 2056 | @staticmethod |
2050 | 2057 | def from_json(coordinate_operation_json_str): |
22 | 22 | |
23 | 23 | # version number string for PROJ |
24 | 24 | 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)) | |
25 | 33 | |
26 | 34 | |
27 | 35 | _PJ_DIRECTION_MAP = { |
472 | 480 | buflent = xbuff.len |
473 | 481 | tt = NULL |
474 | 482 | |
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.') | |
477 | 485 | |
478 | 486 | cdef Py_ssize_t iii |
479 | 487 | cdef int errno = 0 |
502 | 510 | if errcheck and errno: |
503 | 511 | with gil: |
504 | 512 | raise ProjError( |
505 | f"transform error: {pystrdecode(proj_errno_string(errno))}" | |
513 | f"transform error: {pyproj_errno_string(self.context, errno)}" | |
506 | 514 | ) |
507 | 515 | elif errcheck: |
508 | 516 | with gil: |
600 | 608 | if errcheck and errno: |
601 | 609 | with gil: |
602 | 610 | raise ProjError( |
603 | f"itransform error: {pystrdecode(proj_errno_string(errno))}" | |
611 | f"itransform error: {pyproj_errno_string(self.context, errno)}" | |
604 | 612 | ) |
605 | 613 | elif errcheck: |
606 | 614 | with gil: |
700 | 708 | if errcheck and errno: |
701 | 709 | with gil: |
702 | 710 | raise ProjError( |
703 | f"proj error: {pystrdecode(proj_errno_string(errno))}" | |
711 | f"proj error: {pyproj_errno_string(self.context, errno)}" | |
704 | 712 | ) |
705 | 713 | |
706 | 714 | if errno or invalid_coord: |
351 | 351 | """ |
352 | 352 | .. versionadded:: 2.3.0 |
353 | 353 | |
354 | Calculate the total distance between points along a line. | |
354 | Calculate the total distance between points along a line (meters). | |
355 | 355 | |
356 | 356 | >>> from pyproj import Geod |
357 | 357 | >>> geod = Geod('+a=6378137 +f=0.0033528106647475126') |
376 | 376 | Returns |
377 | 377 | ------- |
378 | 378 | float: |
379 | The total length of the line. | |
379 | The total length of the line (meters). | |
380 | 380 | """ |
381 | 381 | # process inputs, making copies that support buffer API. |
382 | 382 | inx, xisfloat, xislist, xistuple = _copytobuffer(lons) |
387 | 387 | """ |
388 | 388 | .. versionadded:: 2.3.0 |
389 | 389 | |
390 | Calculate the distances between points along a line. | |
390 | Calculate the distances between points along a line (meters). | |
391 | 391 | |
392 | 392 | >>> from pyproj import Geod |
393 | 393 | >>> geod = Geod(ellps="WGS84") |
410 | 410 | Returns |
411 | 411 | ------- |
412 | 412 | array, :class:`numpy.ndarray`, list, tuple, or scalar: |
413 | The total length of the line. | |
413 | The total length of the line (meters). | |
414 | 414 | """ |
415 | 415 | # process inputs, making copies that support buffer API. |
416 | 416 | inx, xisfloat, xislist, xistuple = _copytobuffer(lons) |
1 | 1 | |
2 | 2 | IF CTE_PROJ_VERSION_MAJOR >= 8: |
3 | 3 | cdef extern from "proj.h": |
4 | const char * proj_context_errno_string(PJ_CONTEXT* ctx, int err) | |
4 | 5 | ctypedef enum PJ_CATEGORY: |
5 | 6 | PJ_CATEGORY_ELLIPSOID |
6 | 7 | PJ_CATEGORY_PRIME_MERIDIAN |
10 | 11 | PJ_CATEGORY_DATUM_ENSEMBLE |
11 | 12 | ELSE: |
12 | 13 | cdef extern from "proj.h": |
14 | const char * proj_errno_string(int err) | |
13 | 15 | ctypedef enum PJ_CATEGORY: |
14 | 16 | PJ_CATEGORY_ELLIPSOID |
15 | 17 | PJ_CATEGORY_PRIME_MERIDIAN |
50 | 52 | |
51 | 53 | int proj_errno (const PJ *P) nogil |
52 | 54 | int proj_context_errno (PJ_CONTEXT *ctx) |
53 | const char * proj_errno_string (int err) | |
54 | 55 | int proj_errno_reset (const PJ *P) nogil |
55 | 56 | PJ *proj_create (PJ_CONTEXT *ctx, const char *definition) |
56 | 57 | PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ* obj) |
122 | 122 | .. versionadded:: 3.0.0 |
123 | 123 | |
124 | 124 | 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. | |
125 | 130 | |
126 | 131 | Parameters |
127 | 132 | ---------- |
0 | 0 | """ |
1 | 1 | Utility functions used within pyproj |
2 | 2 | """ |
3 | import json | |
3 | 4 | from array import array |
4 | 5 | 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) | |
5 | 27 | |
6 | 28 | |
7 | 29 | def _copytobuffer_return_scalar(xx: Any) -> Tuple[array, bool, bool, bool]: |
0 | 0 | cython>=0.28.4 |
1 | black | |
2 | flake8 | |
3 | 1 | mypy |
4 | numpy | |
5 | pandas | |
6 | pylint | |
7 | pytest>3.6 | |
8 | pytest-cov | |
9 | shapely | |
10 | 2 | pre-commit |
11 | xarray |
34 | 34 | |
35 | 35 | [options] |
36 | 36 | zip_safe = False # https://mypy.readthedocs.io/en/stable/installed_packages.html |
37 | packages = find: | |
37 | packages = pyproj,pyproj.crs | |
38 | 38 | python_requires = >=3.6 |
39 | 39 | install_requires = |
40 | 40 | certifi |
28 | 28 | """checks that the PROJ library meets the minimum version""" |
29 | 29 | if parse_version(proj_version) < PROJ_MIN_VERSION: |
30 | 30 | 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 " | |
32 | 32 | f"version is {proj_version}. For more information see: " |
33 | 33 | "https://pyproj4.github.io/pyproj/stable/installation.html" |
34 | 34 | ) |
57 | 57 | ) |
58 | 58 | proj_dir = Path(proj).parent.parent |
59 | 59 | 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") | |
61 | 61 | else: |
62 | 62 | raise SystemExit(f"ERROR: Invalid path for PROJ_DIR {proj_dir}") |
63 | 63 | return proj_dir |
143 | 143 | except ImportError: |
144 | 144 | raise SystemExit( |
145 | 145 | "ERROR: Cython.Build.cythonize not found. " |
146 | "Cython is required to build from a repo." | |
146 | "Cython is required to build pyproj." | |
147 | 147 | ) |
148 | 148 | |
149 | 149 | # By default we'll try to get options PROJ_DIR or the local version of proj |
214 | 214 | if line.find("__version__") >= 0: |
215 | 215 | # parse __version__ and remove surrounding " or ' |
216 | 216 | return line.split("=")[1].strip()[1:-1] |
217 | raise SystemExit("ERROR: pyproj version not fount.") | |
217 | raise SystemExit("ERROR: pyproj version not found.") | |
218 | 218 | |
219 | 219 | |
220 | 220 | # static items in setup.cfg |
7 | 7 | |
8 | 8 | _NETWORK_ENABLED = pyproj.network.is_network_enabled() |
9 | 9 | 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)" | |
10 | 17 | |
11 | 18 | |
12 | 19 | def unset_data_dir(): |
14 | 14 | from pyproj.enums import ProjVersion, WktVersion |
15 | 15 | from pyproj.exceptions import CRSError |
16 | 16 | 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 | ) | |
18 | 23 | |
19 | 24 | |
20 | 25 | class CustomCRS(object): |
989 | 994 | "input_str,long_name", |
990 | 995 | [ |
991 | 996 | ("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), | |
994 | 999 | ], |
995 | 1000 | ) |
996 | 1001 | def test_ellipsoid__from_name(input_str, long_name): |
0 | import numpy | |
0 | 1 | import pytest |
1 | 2 | from numpy.testing import assert_almost_equal |
2 | 3 | |
15 | 16 | VerticalPerspectiveConversion, |
16 | 17 | ) |
17 | 18 | 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 | |
19 | 20 | |
20 | 21 | |
21 | 22 | def _to_dict(operation): |
39 | 40 | assert_almost_equal(cf_dict.pop("towgs84"), expected_cf.pop("towgs84")) |
40 | 41 | |
41 | 42 | 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 | } | |
42 | 67 | |
43 | 68 | |
44 | 69 | def test_to_cf_transverse_mercator(): |
58 | 83 | "semi_major_axis": 6378388.0, |
59 | 84 | "semi_minor_axis": crs.ellipsoid.semi_minor_metre, |
60 | 85 | "inverse_flattening": 297.0, |
61 | "reference_ellipsoid_name": "International 1909 (Hayford)", | |
86 | "reference_ellipsoid_name": HAYFORD_ELLIPSOID_NAME, | |
62 | 87 | "longitude_of_prime_meridian": 0.0, |
63 | 88 | "prime_meridian_name": "Greenwich", |
64 | 89 | "horizontal_datum_name": ( |
65 | "Unknown based on International 1909 (Hayford) ellipsoid" | |
90 | f"Unknown based on {HAYFORD_ELLIPSOID_NAME} ellipsoid" | |
66 | 91 | ), |
67 | 92 | "towgs84": towgs84_test, |
68 | 93 | "grid_mapping_name": "transverse_mercator", |
134 | 159 | "semi_major_axis": 6378388.0, |
135 | 160 | "semi_minor_axis": crs.ellipsoid.semi_minor_metre, |
136 | 161 | "inverse_flattening": 297.0, |
137 | "reference_ellipsoid_name": "International 1909 (Hayford)", | |
162 | "reference_ellipsoid_name": HAYFORD_ELLIPSOID_NAME, | |
138 | 163 | "longitude_of_prime_meridian": 0.0, |
139 | 164 | "prime_meridian_name": "Greenwich", |
140 | 165 | "grid_mapping_name": "transverse_mercator", |
18 | 18 | from pyproj.crs.coordinate_system import Cartesian2DCS, Ellipsoidal3DCS, VerticalCS |
19 | 19 | from pyproj.crs.datum import CustomDatum |
20 | 20 | from pyproj.crs.enums import VerticalCSAxis |
21 | from test.conftest import HAYFORD_ELLIPSOID_NAME | |
21 | 22 | |
22 | 23 | |
23 | 24 | def test_make_projected_crs(): |
135 | 136 | false_northing=0, |
136 | 137 | scale_factor_natural_origin=0.9996, |
137 | 138 | ), |
138 | geodetic_crs=GeographicCRS( | |
139 | datum=CustomDatum(ellipsoid="International 1909 (Hayford)") | |
140 | ), | |
139 | geodetic_crs=GeographicCRS(datum=CustomDatum(ellipsoid=HAYFORD_ELLIPSOID_NAME)), | |
141 | 140 | ) |
142 | 141 | bound_crs = BoundCRS( |
143 | 142 | source_crs=proj_crs, |
17 | 17 | ) |
18 | 18 | from pyproj.enums import PJType |
19 | 19 | from pyproj.exceptions import CRSError |
20 | from test.conftest import proj_env | |
20 | from test.conftest import PROJ_GTE_8, proj_env | |
21 | 21 | |
22 | 22 | |
23 | 23 | @contextmanager |
236 | 236 | assert "PROJ_TRACE" not in captured.err |
237 | 237 | assert "PROJ_DEBUG" in captured.err |
238 | 238 | else: |
239 | assert captured.err == "" | |
239 | if PROJ_GTE_8: | |
240 | assert "PROJ_ERROR" in captured.err | |
241 | else: | |
242 | assert captured.err == "" | |
240 | 243 | |
241 | 244 | |
242 | 245 | def test_proj_debug_logging__error(capsys): |
6 | 6 | |
7 | 7 | import numpy as np |
8 | 8 | import pytest |
9 | from numpy.testing import assert_almost_equal | |
9 | from numpy.testing import assert_almost_equal, assert_array_equal | |
10 | 10 | |
11 | 11 | import pyproj |
12 | 12 | from pyproj import Proj, Transformer, itransform, transform |
14 | 14 | from pyproj.enums import TransformDirection |
15 | 15 | from pyproj.exceptions import ProjError |
16 | 16 | 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 | |
18 | 18 | |
19 | 19 | |
20 | 20 | def test_tranform_wgs84_to_custom(): |
43 | 43 | assert f"{xx:.3f} {yy:.3f}" == "-1825155.697 330730.391" |
44 | 44 | |
45 | 45 | |
46 | @pytest.mark.skipif(PROJ_GTE_8, reason="https://github.com/OSGeo/PROJ/issues/2425") | |
46 | 47 | def test_illegal_transformation(): |
47 | 48 | # issue 202 |
48 | 49 | with pytest.warns(FutureWarning): |
400 | 401 | ) |
401 | 402 | |
402 | 403 | |
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 | ||
403 | 421 | def test_transform_direction__string(): |
404 | 422 | forward_transformer = Transformer.from_crs(4326, 3857) |
405 | 423 | inverse_transformer = Transformer.from_crs(3857, 4326) |
454 | 472 | |
455 | 473 | def test_str(): |
456 | 474 | 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 | ) | |
457 | 482 | |
458 | 483 | |
459 | 484 | @pytest.mark.parametrize( |
477 | 502 | "Spain; Sweden; Switzerland; " |
478 | 503 | "United Kingdom (UK) including Channel Islands and Isle of Man; " |
479 | 504 | "Vatican City State.\n" |
480 | "- bounds: (-16.1, 32.88, 40.18, 84.17)" | |
505 | f"- bounds: {_BOUND_REPR}" | |
481 | 506 | ), |
482 | 507 | ), |
483 | 508 | ( |