sql >> データベース >  >> RDS >> PostgreSQL

SpringBootでHibernateを使用してPostGISジオメトリポイントフィールドをマッピングします

    最後に、自分の構成に問題がなく、ジャクソンである可能性があることを発見しました。 Pointを管理できない データ型が正しくあります。そこで、JSONのシリアル化と逆シリアル化をカスタマイズしました:

    • これらのアノテーションをcoordinatesに追加します フィールド:

      @JsonSerialize(using = PointToJsonSerializer.class)
      @JsonDeserialize(using = JsonToPointDeserializer.class)
      
    • そのようなシリアライザーを作成します:

      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<Point> {
      
          @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);
          }
      
      }
      
    • そのようなデシリアライザーを作成します:

      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<Point> {
      
          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;
              }
          }
      
      }
      

    たぶん、ここで入手できるこのシリアライザーとこのデシリアライザーを使用することもできます。



    1. MySqlCountは0の値を表示できません

    2. postgresqlシングルインスタンスインストール

    3. OrmliteでForeignCollectionフィールドをカーソルに入れる方法

    4. AndroidでSqLiteデータベースをリセットする方法は?