{"action":"created","comment":{"url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/comments/63674617","id":63674617,"diff_hunk":"@@ -0,0 +1,569 @@\n+##################\n+## LLA <-> ECEF ##\n+##################\n+\n+immutable LLAfromECEF{Datum} <: AbstractTransformation{LLA, ECEF}\n+    a::Float64      # major axis\n+    f::Float64      # flattening\n+    e2::Float64     # Eccentricity squared\n+    e2m::Float64    # 1 - e2m\n+    e2a::Float64    # |e2m|\n+    e4a::Float64    # e2m^2\n+\n+    datum::Datum\n+\n+    function LLAfromECEF(a,f,e2,e2m,e2a,e4a,datum)\n+        if !(isfinite(a) && a > 0)\n+            error(\"Major radius is not positive\")\n+        end\n+        if !(isfinite(f) && f < 1)\n+            error(\"Minor radius is not positive\")","path":"src/transformations.jl","position":20,"original_position":20,"commit_id":"1b4d1162452e276cf0fcf092aa8e5b79f5093776","original_commit_id":"09d4963d8e7455b7e8e044533f8ae599041f2e5b","user":{"login":"cffk","id":2298266,"avatar_url":"https://avatars.githubusercontent.com/u/2298266?v=3","gravatar_id":"","url":"https://api.github.com/users/cffk","html_url":"https://github.com/cffk","followers_url":"https://api.github.com/users/cffk/followers","following_url":"https://api.github.com/users/cffk/following{/other_user}","gists_url":"https://api.github.com/users/cffk/gists{/gist_id}","starred_url":"https://api.github.com/users/cffk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cffk/subscriptions","organizations_url":"https://api.github.com/users/cffk/orgs","repos_url":"https://api.github.com/users/cffk/repos","events_url":"https://api.github.com/users/cffk/events{/privacy}","received_events_url":"https://api.github.com/users/cffk/received_events","type":"User","site_admin":false},"body":"Negative f is allowed.  So you could change major and minor to equatorial and polar.  With the ecef conversions, f needs to be in (-inf,1).  For the series approximation, the ellipsoid needs to be close to spherical, i.e., f in (-0.02,0.02), say.","created_at":"2016-05-18T09:48:37Z","updated_at":"2016-05-18T09:48:37Z","html_url":"https://github.com/JuliaGeo/Geodesy.jl/pull/15#discussion_r63674617","pull_request_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15","_links":{"self":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/comments/63674617"},"html":{"href":"https://github.com/JuliaGeo/Geodesy.jl/pull/15#discussion_r63674617"},"pull_request":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15"}}},"pull_request":{"url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15","id":69945136,"html_url":"https://github.com/JuliaGeo/Geodesy.jl/pull/15","diff_url":"https://github.com/JuliaGeo/Geodesy.jl/pull/15.diff","patch_url":"https://github.com/JuliaGeo/Geodesy.jl/pull/15.patch","issue_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/15","number":15,"state":"open","locked":false,"title":"Coordinate transformations version","user":{"login":"andyferris","id":2974526,"avatar_url":"https://avatars.githubusercontent.com/u/2974526?v=3","gravatar_id":"","url":"https://api.github.com/users/andyferris","html_url":"https://github.com/andyferris","followers_url":"https://api.github.com/users/andyferris/followers","following_url":"https://api.github.com/users/andyferris/following{/other_user}","gists_url":"https://api.github.com/users/andyferris/gists{/gist_id}","starred_url":"https://api.github.com/users/andyferris/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andyferris/subscriptions","organizations_url":"https://api.github.com/users/andyferris/orgs","repos_url":"https://api.github.com/users/andyferris/repos","events_url":"https://api.github.com/users/andyferris/events{/privacy}","received_events_url":"https://api.github.com/users/andyferris/received_events","type":"User","site_admin":false},"body":"Hi,\r\n\r\nI've been doing a complete overhaul of Geodesy. Underneath it all, we have written a new, generic, transformations package called *CoordinateTransformations* ([link](https://github.com/FugroRoames/CoordinateTransformations.jl/tree/initial-code)).\r\n\r\nTwo stand-out features are\r\n\r\n* The ability to compose transformations together into a transformation chain, using `∘` or `compose()`\r\n* UTM/UPS support as a partial, native-Julia port of [GeographicLib](http://geographiclib.sourceforge.net/)\r\n\r\nThese changes make for a pretty massive update to Geodesy. One possible use that we foresee of composed transformations is for doing SLAM (simultaneous localization and mapping) that fuses absolutely georeferenced data and local sensor data. But they can be convenient for simpler things, too. The UTM/UPS addition means less people would need to use *Proj4.jl*. \r\n\r\nThis PR also relies on *CoordinateTransformations* getting into METADATA, which in turn is waiting for *Rotations.jl* to do the same, but it is a perfect time to do the code review.","created_at":"2016-05-13T05:29:54Z","updated_at":"2016-05-18T09:48:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"23771f88df3326912d1fa8f1498b3aae260b75a3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15/commits","review_comments_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15/comments","review_comment_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/15/comments","statuses_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/statuses/1b4d1162452e276cf0fcf092aa8e5b79f5093776","head":{"label":"FugroRoames:CoordinateTransformations-version","ref":"CoordinateTransformations-version","sha":"1b4d1162452e276cf0fcf092aa8e5b79f5093776","user":{"login":"FugroRoames","id":7897460,"avatar_url":"https://avatars.githubusercontent.com/u/7897460?v=3","gravatar_id":"","url":"https://api.github.com/users/FugroRoames","html_url":"https://github.com/FugroRoames","followers_url":"https://api.github.com/users/FugroRoames/followers","following_url":"https://api.github.com/users/FugroRoames/following{/other_user}","gists_url":"https://api.github.com/users/FugroRoames/gists{/gist_id}","starred_url":"https://api.github.com/users/FugroRoames/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FugroRoames/subscriptions","organizations_url":"https://api.github.com/users/FugroRoames/orgs","repos_url":"https://api.github.com/users/FugroRoames/repos","events_url":"https://api.github.com/users/FugroRoames/events{/privacy}","received_events_url":"https://api.github.com/users/FugroRoames/received_events","type":"Organization","site_admin":false},"repo":{"id":52846392,"name":"Geodesy.jl","full_name":"FugroRoames/Geodesy.jl","owner":{"login":"FugroRoames","id":7897460,"avatar_url":"https://avatars.githubusercontent.com/u/7897460?v=3","gravatar_id":"","url":"https://api.github.com/users/FugroRoames","html_url":"https://github.com/FugroRoames","followers_url":"https://api.github.com/users/FugroRoames/followers","following_url":"https://api.github.com/users/FugroRoames/following{/other_user}","gists_url":"https://api.github.com/users/FugroRoames/gists{/gist_id}","starred_url":"https://api.github.com/users/FugroRoames/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FugroRoames/subscriptions","organizations_url":"https://api.github.com/users/FugroRoames/orgs","repos_url":"https://api.github.com/users/FugroRoames/repos","events_url":"https://api.github.com/users/FugroRoames/events{/privacy}","received_events_url":"https://api.github.com/users/FugroRoames/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/FugroRoames/Geodesy.jl","description":"Work with points defined in various coordinate systems.","fork":true,"url":"https://api.github.com/repos/FugroRoames/Geodesy.jl","forks_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/forks","keys_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/teams","hooks_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/hooks","issue_events_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/issues/events{/number}","events_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/events","assignees_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/assignees{/user}","branches_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/branches{/branch}","tags_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/tags","blobs_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/git/refs{/sha}","trees_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/statuses/{sha}","languages_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/languages","stargazers_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/stargazers","contributors_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/contributors","subscribers_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/subscribers","subscription_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/subscription","commits_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/commits{/sha}","git_commits_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/git/commits{/sha}","comments_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/comments{/number}","issue_comment_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/issues/comments{/number}","contents_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/contents/{+path}","compare_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/merges","archive_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/downloads","issues_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/issues{/number}","pulls_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/pulls{/number}","milestones_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/milestones{/number}","notifications_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/labels{/name}","releases_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/releases{/id}","deployments_url":"https://api.github.com/repos/FugroRoames/Geodesy.jl/deployments","created_at":"2016-03-01T03:52:30Z","updated_at":"2016-03-01T03:52:30Z","pushed_at":"2016-05-18T03:51:06Z","git_url":"git://github.com/FugroRoames/Geodesy.jl.git","ssh_url":"git@github.com:FugroRoames/Geodesy.jl.git","clone_url":"https://github.com/FugroRoames/Geodesy.jl.git","svn_url":"https://github.com/FugroRoames/Geodesy.jl","homepage":null,"size":458,"stargazers_count":0,"watchers_count":0,"language":"Julia","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"JuliaGeo:master","ref":"master","sha":"f40214542130b970c9f1c5371c05da8811609b86","user":{"login":"JuliaGeo","id":10616454,"avatar_url":"https://avatars.githubusercontent.com/u/10616454?v=3","gravatar_id":"","url":"https://api.github.com/users/JuliaGeo","html_url":"https://github.com/JuliaGeo","followers_url":"https://api.github.com/users/JuliaGeo/followers","following_url":"https://api.github.com/users/JuliaGeo/following{/other_user}","gists_url":"https://api.github.com/users/JuliaGeo/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaGeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaGeo/subscriptions","organizations_url":"https://api.github.com/users/JuliaGeo/orgs","repos_url":"https://api.github.com/users/JuliaGeo/repos","events_url":"https://api.github.com/users/JuliaGeo/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaGeo/received_events","type":"Organization","site_admin":false},"repo":{"id":29447144,"name":"Geodesy.jl","full_name":"JuliaGeo/Geodesy.jl","owner":{"login":"JuliaGeo","id":10616454,"avatar_url":"https://avatars.githubusercontent.com/u/10616454?v=3","gravatar_id":"","url":"https://api.github.com/users/JuliaGeo","html_url":"https://github.com/JuliaGeo","followers_url":"https://api.github.com/users/JuliaGeo/followers","following_url":"https://api.github.com/users/JuliaGeo/following{/other_user}","gists_url":"https://api.github.com/users/JuliaGeo/gists{/gist_id}","starred_url":"https://api.github.com/users/JuliaGeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuliaGeo/subscriptions","organizations_url":"https://api.github.com/users/JuliaGeo/orgs","repos_url":"https://api.github.com/users/JuliaGeo/repos","events_url":"https://api.github.com/users/JuliaGeo/events{/privacy}","received_events_url":"https://api.github.com/users/JuliaGeo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuliaGeo/Geodesy.jl","description":"Work with points defined in various coordinate systems.","fork":false,"url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl","forks_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/forks","keys_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/teams","hooks_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/hooks","issue_events_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/events{/number}","events_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/events","assignees_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/assignees{/user}","branches_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/branches{/branch}","tags_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/tags","blobs_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/statuses/{sha}","languages_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/languages","stargazers_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/stargazers","contributors_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/contributors","subscribers_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/subscribers","subscription_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/subscription","commits_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/contents/{+path}","compare_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/merges","archive_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/downloads","issues_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues{/number}","pulls_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls{/number}","milestones_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/milestones{/number}","notifications_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/labels{/name}","releases_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/releases{/id}","deployments_url":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/deployments","created_at":"2015-01-19T00:55:25Z","updated_at":"2016-05-06T17:14:41Z","pushed_at":"2016-05-18T03:51:07Z","git_url":"git://github.com/JuliaGeo/Geodesy.jl.git","ssh_url":"git@github.com:JuliaGeo/Geodesy.jl.git","clone_url":"https://github.com/JuliaGeo/Geodesy.jl.git","svn_url":"https://github.com/JuliaGeo/Geodesy.jl","homepage":null,"size":223,"stargazers_count":4,"watchers_count":4,"language":"Julia","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":10,"forks":4,"open_issues":10,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15"},"html":{"href":"https://github.com/JuliaGeo/Geodesy.jl/pull/15"},"issue":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/15"},"comments":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/issues/15/comments"},"review_comments":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15/comments"},"review_comment":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/pulls/15/commits"},"statuses":{"href":"https://api.github.com/repos/JuliaGeo/Geodesy.jl/statuses/1b4d1162452e276cf0fcf092aa8e5b79f5093776"}}}}