{"action":"created","comment":{"url":"https://api.github.com/repos/osmlab/atlas/pulls/comments/230510797","pull_request_review_id":171264084,"id":230510797,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMDUxMDc5Nw==","diff_hunk":"@@ -29,6 +33,34 @@ public long absoluteValence()\n         return this.connectedEdges().size();\n     }\n \n+    @Override\n+    public JsonObject asGeoJsonFeature()\n+    {\n+        final JsonObject feature = super.asGeoJsonFeature();\n+        final JsonObject properties = feature.getAsJsonObject(\"properties\");","path":"src/main/java/org/openstreetmap/atlas/geography/atlas/items/Node.java","position":19,"original_position":19,"commit_id":"e7ddfd0278e3e39ae750166092abbda27b9c6da9","original_commit_id":"fc0a3f28b38c578f6fa4a7cbe33623cf2120eedf","user":{"login":"jklamer","id":9659948,"node_id":"MDQ6VXNlcjk2NTk5NDg=","avatar_url":"https://avatars1.githubusercontent.com/u/9659948?v=4","gravatar_id":"","url":"https://api.github.com/users/jklamer","html_url":"https://github.com/jklamer","followers_url":"https://api.github.com/users/jklamer/followers","following_url":"https://api.github.com/users/jklamer/following{/other_user}","gists_url":"https://api.github.com/users/jklamer/gists{/gist_id}","starred_url":"https://api.github.com/users/jklamer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jklamer/subscriptions","organizations_url":"https://api.github.com/users/jklamer/orgs","repos_url":"https://api.github.com/users/jklamer/repos","events_url":"https://api.github.com/users/jklamer/events{/privacy}","received_events_url":"https://api.github.com/users/jklamer/received_events","type":"User","site_admin":false},"body":"same ad before. This function could just be overriding the ```getGeojsonProperties()``` function. ","created_at":"2018-11-02T21:16:08Z","updated_at":"2018-11-02T21:21:35Z","html_url":"https://github.com/osmlab/atlas/pull/269#discussion_r230510797","pull_request_url":"https://api.github.com/repos/osmlab/atlas/pulls/269","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/comments/230510797"},"html":{"href":"https://github.com/osmlab/atlas/pull/269#discussion_r230510797"},"pull_request":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/269"}}},"pull_request":{"url":"https://api.github.com/repos/osmlab/atlas/pulls/269","id":227648575,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI3NjQ4NTc1","html_url":"https://github.com/osmlab/atlas/pull/269","diff_url":"https://github.com/osmlab/atlas/pull/269.diff","patch_url":"https://github.com/osmlab/atlas/pull/269.patch","issue_url":"https://api.github.com/repos/osmlab/atlas/issues/269","number":269,"state":"open","locked":false,"title":"DNM - Tippecanoe & Line Delimited GeoJSON","user":{"login":"hallahan","id":556367,"node_id":"MDQ6VXNlcjU1NjM2Nw==","avatar_url":"https://avatars3.githubusercontent.com/u/556367?v=4","gravatar_id":"","url":"https://api.github.com/users/hallahan","html_url":"https://github.com/hallahan","followers_url":"https://api.github.com/users/hallahan/followers","following_url":"https://api.github.com/users/hallahan/following{/other_user}","gists_url":"https://api.github.com/users/hallahan/gists{/gist_id}","starred_url":"https://api.github.com/users/hallahan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hallahan/subscriptions","organizations_url":"https://api.github.com/users/hallahan/orgs","repos_url":"https://api.github.com/users/hallahan/repos","events_url":"https://api.github.com/users/hallahan/events{/privacy}","received_events_url":"https://api.github.com/users/hallahan/received_events","type":"User","site_admin":false},"body":"### Description:\r\n\r\nThis pull request re-vamps how GeoJSON is made in atlas. This new line-delimited GeoJSON functionality serializes entity-by-entity, and provides a predicate and mutator for you to filter and modify features as they are serialized.\r\n\r\nYou can run `LineDelimitedGeoJsonConverter` to convert a directory full of atlases into their corresponding line-delimited GeoJSON. The CLI also concatenates that output into a single file.\r\n\r\nYou can run `TippecanoeExporter`, which subclasses `LineDelimitedGeoJsonConverter`. This will create your line-delimited GeoJSON, and then it will execute [tippecanoe](https://github.com/mapbox/tippecanoe) to ultimately create an MBTiles container file with MapboxVectorTiles. You can then use [mbview](https://github.com/mapbox/mbview) or [tileserver-gl](https://github.com/klokantech/tileserver-gl) to serve and visualize the data.\r\n\r\nAnother key part of this pull request is the ability to add the tippecanoe GeoJSON extension. This adds an extra object into your GeoJSON features called `tippecanoe`. In there, you can declare what layer the feature can be in, as well as the minimum zoom the feature should be in for the vector tiles. The `MinZoom` class provides some defaults, and ultimately we will want to tweak it further. Once we dial in what the various min zooms should be, I don't anticipate having to change that very often, so I haven't gone in and made a GeoJSON configuration, though that's a potential direction we could go in.\r\n\r\n#### TODO\r\n\r\n- [ ] Unit Tests.\r\n- [ ] Include relation metadata in relation members' properties.\r\n\r\nNote that the `LineDelimitedGeoJsonConverter` by default only includes positive ID'd features, as well as only relations that are multipolygons. The rationale is that you will be able to get a hold of the needed relation metadata from the members for everything but multipolygons. Also, edges that are one way can be derived by the `oneway=yes` tag, so finding the positive and negative feature is redundant and wastes space. You can change this predicate if you need these things.\r\n\r\n### Potential Impact:\r\n\r\nThis PR does not change the functionality of the legacy GeoJSON serialization. We should do a future PR where we remove the old non-line-delimited GeoJSON generator, and simply adapt this code to also generate non-line-delimited GeoJSON.\r\n\r\nThe memory footprint of this approach is dramatically lower, as we only create `JsonObject`s on a feature-by-feature basis. The legacy GeoJSON generator would create a `JsonObject` of all of the entity in an atlas first, and this would then explode in size in memory, as this has no compression.\r\n\r\nThe new GeoJSON code handles relations a little bit better. Before, all relations were just GeoJSON features with point geometries pointing at null island. Now, if they are multipolygons, it properly encodes the multipolygon if it has all of the geometries it needs. Otherwise, it will encode the relation as a feature, with properties, and a polygon geometry that is the bounding box of that given relation. This way, you can see where it is on the map.\r\n\r\n### Instructions\r\n\r\nhttps://github.com/hallahan/atlas/blob/tippecanoe/src/main/java/org/openstreetmap/atlas/vectortiles/README.md\r\n\r\n### Unit Test Approach:\r\n\r\nTODO, DNM until I've written some.\r\n\r\n### Test Results:\r\n\r\nI have also manually tested by running both CLIs and reviewed the output. For `TippecanoeExporter`, I have generated MBTiles from atlas files and explored the data in [mbview](https://github.com/mapbox/mbview).\r\n\r\n","created_at":"2018-11-01T15:00:25Z","updated_at":"2018-11-02T21:21:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"282fddae54a82047f2f9beb828ead588815a9f49","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":664543819,"node_id":"MDU6TGFiZWw2NjQ1NDM4MTk=","url":"https://api.github.com/repos/osmlab/atlas/labels/Enhancement","name":"Enhancement","color":"84b6eb","default":false},{"id":664543820,"node_id":"MDU6TGFiZWw2NjQ1NDM4MjA=","url":"https://api.github.com/repos/osmlab/atlas/labels/New%20Feature","name":"New Feature","color":"128A0C","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/osmlab/atlas/pulls/269/commits","review_comments_url":"https://api.github.com/repos/osmlab/atlas/pulls/269/comments","review_comment_url":"https://api.github.com/repos/osmlab/atlas/pulls/comments{/number}","comments_url":"https://api.github.com/repos/osmlab/atlas/issues/269/comments","statuses_url":"https://api.github.com/repos/osmlab/atlas/statuses/e7ddfd0278e3e39ae750166092abbda27b9c6da9","head":{"label":"hallahan:tippecanoe","ref":"tippecanoe","sha":"e7ddfd0278e3e39ae750166092abbda27b9c6da9","user":{"login":"hallahan","id":556367,"node_id":"MDQ6VXNlcjU1NjM2Nw==","avatar_url":"https://avatars3.githubusercontent.com/u/556367?v=4","gravatar_id":"","url":"https://api.github.com/users/hallahan","html_url":"https://github.com/hallahan","followers_url":"https://api.github.com/users/hallahan/followers","following_url":"https://api.github.com/users/hallahan/following{/other_user}","gists_url":"https://api.github.com/users/hallahan/gists{/gist_id}","starred_url":"https://api.github.com/users/hallahan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hallahan/subscriptions","organizations_url":"https://api.github.com/users/hallahan/orgs","repos_url":"https://api.github.com/users/hallahan/repos","events_url":"https://api.github.com/users/hallahan/events{/privacy}","received_events_url":"https://api.github.com/users/hallahan/received_events","type":"User","site_admin":false},"repo":{"id":144186270,"node_id":"MDEwOlJlcG9zaXRvcnkxNDQxODYyNzA=","name":"atlas","full_name":"hallahan/atlas","private":false,"owner":{"login":"hallahan","id":556367,"node_id":"MDQ6VXNlcjU1NjM2Nw==","avatar_url":"https://avatars3.githubusercontent.com/u/556367?v=4","gravatar_id":"","url":"https://api.github.com/users/hallahan","html_url":"https://github.com/hallahan","followers_url":"https://api.github.com/users/hallahan/followers","following_url":"https://api.github.com/users/hallahan/following{/other_user}","gists_url":"https://api.github.com/users/hallahan/gists{/gist_id}","starred_url":"https://api.github.com/users/hallahan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hallahan/subscriptions","organizations_url":"https://api.github.com/users/hallahan/orgs","repos_url":"https://api.github.com/users/hallahan/repos","events_url":"https://api.github.com/users/hallahan/events{/privacy}","received_events_url":"https://api.github.com/users/hallahan/received_events","type":"User","site_admin":false},"html_url":"https://github.com/hallahan/atlas","description":"OSM in memory","fork":true,"url":"https://api.github.com/repos/hallahan/atlas","forks_url":"https://api.github.com/repos/hallahan/atlas/forks","keys_url":"https://api.github.com/repos/hallahan/atlas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hallahan/atlas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hallahan/atlas/teams","hooks_url":"https://api.github.com/repos/hallahan/atlas/hooks","issue_events_url":"https://api.github.com/repos/hallahan/atlas/issues/events{/number}","events_url":"https://api.github.com/repos/hallahan/atlas/events","assignees_url":"https://api.github.com/repos/hallahan/atlas/assignees{/user}","branches_url":"https://api.github.com/repos/hallahan/atlas/branches{/branch}","tags_url":"https://api.github.com/repos/hallahan/atlas/tags","blobs_url":"https://api.github.com/repos/hallahan/atlas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hallahan/atlas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hallahan/atlas/git/refs{/sha}","trees_url":"https://api.github.com/repos/hallahan/atlas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hallahan/atlas/statuses/{sha}","languages_url":"https://api.github.com/repos/hallahan/atlas/languages","stargazers_url":"https://api.github.com/repos/hallahan/atlas/stargazers","contributors_url":"https://api.github.com/repos/hallahan/atlas/contributors","subscribers_url":"https://api.github.com/repos/hallahan/atlas/subscribers","subscription_url":"https://api.github.com/repos/hallahan/atlas/subscription","commits_url":"https://api.github.com/repos/hallahan/atlas/commits{/sha}","git_commits_url":"https://api.github.com/repos/hallahan/atlas/git/commits{/sha}","comments_url":"https://api.github.com/repos/hallahan/atlas/comments{/number}","issue_comment_url":"https://api.github.com/repos/hallahan/atlas/issues/comments{/number}","contents_url":"https://api.github.com/repos/hallahan/atlas/contents/{+path}","compare_url":"https://api.github.com/repos/hallahan/atlas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hallahan/atlas/merges","archive_url":"https://api.github.com/repos/hallahan/atlas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hallahan/atlas/downloads","issues_url":"https://api.github.com/repos/hallahan/atlas/issues{/number}","pulls_url":"https://api.github.com/repos/hallahan/atlas/pulls{/number}","milestones_url":"https://api.github.com/repos/hallahan/atlas/milestones{/number}","notifications_url":"https://api.github.com/repos/hallahan/atlas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hallahan/atlas/labels{/name}","releases_url":"https://api.github.com/repos/hallahan/atlas/releases{/id}","deployments_url":"https://api.github.com/repos/hallahan/atlas/deployments","created_at":"2018-08-09T17:54:43Z","updated_at":"2018-08-09T17:54:48Z","pushed_at":"2018-11-02T20:46:19Z","git_url":"git://github.com/hallahan/atlas.git","ssh_url":"git@github.com:hallahan/atlas.git","clone_url":"https://github.com/hallahan/atlas.git","svn_url":"https://github.com/hallahan/atlas","homepage":null,"size":54327,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"osmlab:dev","ref":"dev","sha":"4f20c144cdf5f46f59a4947410d1aa50d4be5211","user":{"login":"osmlab","id":3856374,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM4NTYzNzQ=","avatar_url":"https://avatars3.githubusercontent.com/u/3856374?v=4","gravatar_id":"","url":"https://api.github.com/users/osmlab","html_url":"https://github.com/osmlab","followers_url":"https://api.github.com/users/osmlab/followers","following_url":"https://api.github.com/users/osmlab/following{/other_user}","gists_url":"https://api.github.com/users/osmlab/gists{/gist_id}","starred_url":"https://api.github.com/users/osmlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/osmlab/subscriptions","organizations_url":"https://api.github.com/users/osmlab/orgs","repos_url":"https://api.github.com/users/osmlab/repos","events_url":"https://api.github.com/users/osmlab/events{/privacy}","received_events_url":"https://api.github.com/users/osmlab/received_events","type":"Organization","site_admin":false},"repo":{"id":99717758,"node_id":"MDEwOlJlcG9zaXRvcnk5OTcxNzc1OA==","name":"atlas","full_name":"osmlab/atlas","private":false,"owner":{"login":"osmlab","id":3856374,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM4NTYzNzQ=","avatar_url":"https://avatars3.githubusercontent.com/u/3856374?v=4","gravatar_id":"","url":"https://api.github.com/users/osmlab","html_url":"https://github.com/osmlab","followers_url":"https://api.github.com/users/osmlab/followers","following_url":"https://api.github.com/users/osmlab/following{/other_user}","gists_url":"https://api.github.com/users/osmlab/gists{/gist_id}","starred_url":"https://api.github.com/users/osmlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/osmlab/subscriptions","organizations_url":"https://api.github.com/users/osmlab/orgs","repos_url":"https://api.github.com/users/osmlab/repos","events_url":"https://api.github.com/users/osmlab/events{/privacy}","received_events_url":"https://api.github.com/users/osmlab/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/osmlab/atlas","description":"OSM in memory","fork":false,"url":"https://api.github.com/repos/osmlab/atlas","forks_url":"https://api.github.com/repos/osmlab/atlas/forks","keys_url":"https://api.github.com/repos/osmlab/atlas/keys{/key_id}","collaborators_url":"https://api.github.com/repos/osmlab/atlas/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/osmlab/atlas/teams","hooks_url":"https://api.github.com/repos/osmlab/atlas/hooks","issue_events_url":"https://api.github.com/repos/osmlab/atlas/issues/events{/number}","events_url":"https://api.github.com/repos/osmlab/atlas/events","assignees_url":"https://api.github.com/repos/osmlab/atlas/assignees{/user}","branches_url":"https://api.github.com/repos/osmlab/atlas/branches{/branch}","tags_url":"https://api.github.com/repos/osmlab/atlas/tags","blobs_url":"https://api.github.com/repos/osmlab/atlas/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/osmlab/atlas/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/osmlab/atlas/git/refs{/sha}","trees_url":"https://api.github.com/repos/osmlab/atlas/git/trees{/sha}","statuses_url":"https://api.github.com/repos/osmlab/atlas/statuses/{sha}","languages_url":"https://api.github.com/repos/osmlab/atlas/languages","stargazers_url":"https://api.github.com/repos/osmlab/atlas/stargazers","contributors_url":"https://api.github.com/repos/osmlab/atlas/contributors","subscribers_url":"https://api.github.com/repos/osmlab/atlas/subscribers","subscription_url":"https://api.github.com/repos/osmlab/atlas/subscription","commits_url":"https://api.github.com/repos/osmlab/atlas/commits{/sha}","git_commits_url":"https://api.github.com/repos/osmlab/atlas/git/commits{/sha}","comments_url":"https://api.github.com/repos/osmlab/atlas/comments{/number}","issue_comment_url":"https://api.github.com/repos/osmlab/atlas/issues/comments{/number}","contents_url":"https://api.github.com/repos/osmlab/atlas/contents/{+path}","compare_url":"https://api.github.com/repos/osmlab/atlas/compare/{base}...{head}","merges_url":"https://api.github.com/repos/osmlab/atlas/merges","archive_url":"https://api.github.com/repos/osmlab/atlas/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/osmlab/atlas/downloads","issues_url":"https://api.github.com/repos/osmlab/atlas/issues{/number}","pulls_url":"https://api.github.com/repos/osmlab/atlas/pulls{/number}","milestones_url":"https://api.github.com/repos/osmlab/atlas/milestones{/number}","notifications_url":"https://api.github.com/repos/osmlab/atlas/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/osmlab/atlas/labels{/name}","releases_url":"https://api.github.com/repos/osmlab/atlas/releases{/id}","deployments_url":"https://api.github.com/repos/osmlab/atlas/deployments","created_at":"2017-08-08T17:14:27Z","updated_at":"2018-11-01T06:44:50Z","pushed_at":"2018-11-02T20:46:21Z","git_url":"git://github.com/osmlab/atlas.git","ssh_url":"git@github.com:osmlab/atlas.git","clone_url":"https://github.com/osmlab/atlas.git","svn_url":"https://github.com/osmlab/atlas","homepage":null,"size":53910,"stargazers_count":90,"watchers_count":90,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":35,"mirror_url":null,"archived":false,"open_issues_count":13,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":35,"open_issues":13,"watchers":90,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/269"},"html":{"href":"https://github.com/osmlab/atlas/pull/269"},"issue":{"href":"https://api.github.com/repos/osmlab/atlas/issues/269"},"comments":{"href":"https://api.github.com/repos/osmlab/atlas/issues/269/comments"},"review_comments":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/269/comments"},"review_comment":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/osmlab/atlas/pulls/269/commits"},"statuses":{"href":"https://api.github.com/repos/osmlab/atlas/statuses/e7ddfd0278e3e39ae750166092abbda27b9c6da9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jklamer"}}