Map a PostGIS geometry point field with Hibernate on Spring Boot

前端 未结 5 660
忘掉有多难
忘掉有多难 2020-12-24 07:30

In my PostgreSQL 9.3 + PostGIS 2.1.5 I have a table PLACE with a column coordinates of type Geometry(Point,26910).

I want to m

5条回答
  •  梦谈多话
    2020-12-24 07:57

    Finally I discovered that my configuration is ok and might be Jackson that cannot manage Point data type correctly. So I customized its JSON serialization and deserialization:

    • add these annotations to our coordinates field:

      @JsonSerialize(using = PointToJsonSerializer.class)
      @JsonDeserialize(using = JsonToPointDeserializer.class)
      
    • create such serializer:

      import java.io.IOException;
      import com.fasterxml.jackson.core.JsonGenerator;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.JsonSerializer;
      import com.fasterxml.jackson.databind.SerializerProvider;
      import com.vividsolutions.jts.geom.Point;
      
      public class PointToJsonSerializer extends JsonSerializer {
      
          @Override
          public void serialize(Point value, JsonGenerator jgen,
                  SerializerProvider provider) throws IOException,
                  JsonProcessingException {
      
              String jsonValue = "null";
              try
              {
                  if(value != null) {             
                      double lat = value.getY();
                      double lon = value.getX();
                      jsonValue = String.format("POINT (%s %s)", lat, lon);
                  }
              }
              catch(Exception e) {}
      
              jgen.writeString(jsonValue);
          }
      
      }
      
    • create such deserializer:

      import java.io.IOException;
      import com.fasterxml.jackson.core.JsonParser;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.DeserializationContext;
      import com.fasterxml.jackson.databind.JsonDeserializer;
      import com.vividsolutions.jts.geom.Coordinate;
      import com.vividsolutions.jts.geom.GeometryFactory;
      import com.vividsolutions.jts.geom.Point;
      import com.vividsolutions.jts.geom.PrecisionModel;
      
      public class JsonToPointDeserializer extends JsonDeserializer {
      
          private final static GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 26910); 
      
          @Override
          public Point deserialize(JsonParser jp, DeserializationContext ctxt)
                  throws IOException, JsonProcessingException {
      
              try {
                  String text = jp.getText();
                  if(text == null || text.length() <= 0)
                      return null;
      
                  String[] coordinates = text.replaceFirst("POINT ?\\(", "").replaceFirst("\\)", "").split(" ");
                  double lat = Double.parseDouble(coordinates[0]);
                  double lon = Double.parseDouble(coordinates[1]);
      
                  Point point = geometryFactory.createPoint(new Coordinate(lat, lon));
                  return point;
              }
              catch(Exception e){
                  return null;
              }
          }
      
      }
      

    Maybe you can also use this serializer and this deserializer, available here.

提交回复
热议问题