# Geographic Coordinates and Java API Client in 8.6

**URL:** https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613
**Category:** Elasticsearch
**Tags:** language-clients
**Created:** [February 3, 2023, 8:27am UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613 "2023-02-03T08:27:28Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 3, 2023, 8:27am UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/1 "2023-02-03T08:27:28Z")

</div>

Hello.  
I'm trying to create documents from a Java app. Those documents includes geographic coordinates (lat and lon in decimal form).  
Both Elasticsearch and the java client are in 8.6.0.  
In the beginning, no index exists in ES.  
If I only insert data, the index is created but the coordinates are not typed as coordinates.  
I tried several types in my Java object : GeoPoint, GeoHash, GeoLocation.  
I also tried to create the index at first with a specific mapping :

```auto
            CreateIndexResponse response = client.indices().create(c -> c
                    .index("my_index")
                    .mappings(map -> map
                            .properties("position", p -> p.geoPoint(g -> g))));

```

And then, I have errors when inserting data with a bulk request.  
How can I do that operation ?  
Thanks for your help.

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 3, 2023, 9:36am UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/2 "2023-02-03T09:36:58Z")

</div>

Bonjour Benjamin 😊

Could you provide more information?

- A typical document meant to be indexed
- The exact error message

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 3, 2023, 2:18pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/3 "2023-02-03T14:18:07Z")

</div>

Hello David !  
I have a  
`com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: ch.hsr.geohash.GeoHash[0]`

My documents are Java objects with String attributes and, on my last try, a Geohash for the position.  
Each attribute has a getter and a setter.  
The source data provides lat and lon.  
I try to convert it with

`GeoHash.withBitPrecision(lat, lon, 10);`

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 3, 2023, 4:14pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/4 "2023-02-03T16:14:35Z")

</div>

Could you share your bean definition please?

In case it helps, this is how I'm doing this:

> <https://github.com/dadoonet/injector/blob/main/src/main/java/fr/pilato/elasticsearch/injector/bean/Address.java#L22-L28>

> <https://github.com/dadoonet/injector/blob/main/src/main/java/fr/pilato/elasticsearch/injector/bean/GeoPoint.java#L22-L24>

> <https://github.com/dadoonet/injector/blob/main/src/main/java/fr/pilato/elasticsearch/injector/injector/ElasticsearchInjector.java#L116-L122>

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 3, 2023, 4:28pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/5 "2023-02-03T16:28:26Z")

</div>

My first object looks like :

```auto
public class ElasticObject {

    private String id;
    private String num;
    private String streetName;
    private String postCode;
    private String city;
    private GeoHash position;

    public ElasticObject(String id, String num, String streetName, String postCode, String city, double lat, double lon) {
        this.id = id;
        this.num = num;
        this.streetName = streetName;
        this.postCode = postCode;
        this.city = city;
        this.position = GeoHash.withBitPrecision(lat, lon, 10);
    }

```

The bulk request looks like :

```auto
        BulkRequest.Builder br = new BulkRequest.Builder();

        for (ElasticObject esObject : data) {
            br.operations(op -> op
                    .index(idx -> idx.index("bano").id(esObject.getId()).document(esObject)));
        }
        BulkResponse result = client.bulk(br.build());

```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 3, 2023, 4:45pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/6 "2023-02-03T16:45:03Z")

</div>

Could you try with a similar data structure I shared?  
I don't think it's possible to have other inner fields than `lat` and `lon` in the JSON sent to Elasticsearch.

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 6, 2023, 8:07am UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/7 "2023-02-06T08:07:25Z")

</div>

I succedded in what I wanted to do by using an ingest pipeline.  
At first, I created it from a CSV import in Kibana.  
And then, I saw how to recreate it programatically with the Java API client.

```auto
        ConvertProcessor latProcessor =
                new ConvertProcessor.Builder().field("lat").type(ConvertType.Double).build();
        ConvertProcessor lonProcessor =
                new ConvertProcessor.Builder().field("lon").type(ConvertType.Double).build();
        SetProcessor positionProcessor = new SetProcessor.Builder().field("location").copyFrom("{{lat}},{{lon}}").build();
        List<Processor> processors = List.of(new Processor.Builder().convert(cpProcessor).build(),
                new Processor.Builder().convert(latProcessor).build(),
                new Processor.Builder().convert(lonProcessor).build(),
                new Processor.Builder().set(positionProcessor).build());

        PutPipelineRequest pipelineRequest =
                new PutPipelineRequest.Builder().id("myPipeline").processors(processors).build();
        ElasticsearchIngestClient ingestClient = new ElasticsearchIngestClient(transport);
        PutPipelineResponse pipelineResponse = ingestClient.putPipeline(pipelineRequest);

        BulkRequest.Builder br = new BulkRequest.Builder();
        br.pipeline("myPipeline");

```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 6, 2023, 10:49am UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/8 "2023-02-06T10:49:36Z")

</div>

Why are you doing that server side (in Elasticsearch) and not Client side (in your application)?

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 6, 2023, 12:50pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/9 "2023-02-06T12:50:22Z")

</div>

I didn't find out how to do it on the client side.

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 6, 2023, 1:14pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/10 "2023-02-06T13:14:20Z")

</div>

Just change the ElasticObject. And use a data structure as I shared in my previous answer. Look at the GeoPoint class.

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 6, 2023, 2:40pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/11 "2023-02-06T14:40:50Z")

</div>

When I do as you did, the data is created but as double and distinct values :  
In the mapping of the index, the location looks like (the index does not exist before I run the code, that's why I performed operations on the server side, to tell him how to create the index)

```auto
"location": {
        "properties": {
          "lat": {
            "type": "float"
          },
          "lon": {
            "type": "float"
          }
        }
      },

```

And after creating the data view, if I try to use it in a map, I have a message saying  
`Data view does not contain any geospatial fields`

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 6, 2023, 3:09pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/12 "2023-02-06T15:09:54Z")

</div>

It's because you need to create the mapping before indexing any data.

Look at:

> <https://github.com/dadoonet/injector/blob/main/src/main/java/fr/pilato/elasticsearch/injector/injector/ElasticsearchInjector.java#L100-L107>

and

> <https://github.com/dadoonet/injector/blob/main/src/main/resources/template.json#L17-L19>

---

<div class="post-metadata">

### Author: ![BenjaminD](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/benjamind/32/4866_2.png) [@BenjaminD](https://discuss.elastic.co/u/BenjaminD)
#### Post date: [February 6, 2023, 4:24pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/13 "2023-02-06T16:24:51Z")

</div>

Now that works.  
Thanks !

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [March 6, 2023, 4:24pm UTC](https://discuss.elastic.co/t/geographic-coordinates-and-java-api-client-in-8-6/324613/14 "2023-03-06T16:24:55Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
