Issue 1:
Elasticsearch generates an InvalidShapeException from polygons generated by PostGIS:

MapperParsingException[failed to parse [catchment_mpoly]]; nested: InvalidShapeException[Provided shape has duplicate consecutive coordinates at: (145.105506775, -37.791859504, NaN)]

This particular check seems overzealous.

It's also surprising, given that the polygons are being fed through ST_SimplifyPreserveTopology. It is generating errors after its own precision is applied?

Issue 2:
This is a duplicate of #15880

To replicate, copy the config directory to a new location and add a simple tribe config, eg:

cp -a elasticsearch-2.2.0/config tribe
echo "tribe.t1.cluster.name: foo" >> tribe/elasticsearch.yml

Start the tribe node as follows:

./elasticsearch-2.2.0/bin/elasticsearch --path.conf tribe

The process dies with:

Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "/Users/clinton/workspace/servers/elasticsearch-2.2.0/config/hunspell" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
at sun.nio.fs.UnixPath.checkRead(UnixPath.java:795)
at sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:49)
at sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:144)
at java.nio.file.Files.readAttributes(Files.java:1737)
at java.nio.file.Files.isDirectory(Files.java:2192)
at org.elasticsearch.indices.analysis.HunspellService.scanAndLoadDictionaries(HunspellService.java:127)
at org.elasticsearch.indices.analysis.HunspellService.<init>(HunspellService.java:102)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at <<<guice>>>
at org.elasticsearch.node.Node.<init>(Node.java:200)
at org.elasticsearch.tribe.TribeClientNode.<init>(TribeClientNode.java:35)
at org.elasticsearch.tribe.TribeService.<init>(TribeService.java:141)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at <<<guice>>>
at org.elasticsearch.node.Node.<init>(Node.java:200)
at org.elasticsearch.node.Node.<init>(Node.java:128)
at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.java:145)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:178)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:285)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)

The reason for this is that, when the tribe node tries to create a client to connect to the cluster, it doesn't pass on the path.conf setting to the client, so that when HunspellService tries to resolve the hunspell directory it uses path.home instead of the custom path.conf.

Adding the absolute config path to the tribe node configuration works around this:

echo "tribe.t1.path.conf: /Users/clinton/workspace/servers/tribe/" >> tribe/elasticsearch.yml