Java解析GeoJSON为Polygon遇类型识别异常的解决请求
解决GeoJSON解析为Polygon的问题
问题根源
你的GeoJSON数据并不是直接的Polygon几何对象,而是一个自定义类型的GeoJSON Feature——它包含业务属性(如name、cityId)和一个geometry字段(真正的Polygon数据)。但你设置的type: "relocationzone"不是标准GeoJSON类型,geojson-jackson只识别官方定义的类型(Feature、Point、Polygon等),因此抛出类型解析异常。
解决方案
我们需要先把整个对象解析为Feature(因为它符合Feature的结构),再从中提取内部的Polygon几何对象,或者创建自定义类映射整个结构。
方案1:用Feature解析后提取Polygon
修改代码,先解析为Feature数组,再获取geometry进行判断:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.geojson.Feature; import org.geojson.GeoJsonObject; import org.geojson.Polygon; import org.geojson.jackson.GeoJsonModule; import java.io.File; public class GeoJsonParser { public static void main(String[] args) throws Exception { String fileLocation = "your-file-path.geojson"; ObjectMapper mapper = new ObjectMapper(); // 忽略未知属性,避免业务字段导致解析失败 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 注册GeoJSON模块 mapper.registerModule(new GeoJsonModule()); // 解析为Feature数组 Feature[] features = mapper.readValue(new File(fileLocation), Feature[].class); // 获取第一个Feature的几何对象 GeoJsonObject geometry = features[0].getGeometry(); if (geometry instanceof Polygon) { System.out.println("yes"); Polygon polygon = (Polygon) geometry; // 在这里处理Polygon的坐标等数据 } else { System.out.println("No"); } } }
方案2:创建自定义类映射完整结构
如果需要直接获取所有业务属性,可以创建一个继承自Feature的自定义类,精准映射你的数据结构:
import org.geojson.Feature; import org.geojson.Polygon; import java.util.Date; import java.util.List; public class RelocationZone extends Feature { private String _id; private Date updatedAt; private Date createdAt; private int __v; private String name; private String cityId; private String legacyId; private String type; private List<Feature> geoFeatures; private Options options; private List<TimedOption> timedOptions; private Polygon geometry; private int version; private Computed computed; // 生成所有字段的getter和setter // 内部类映射嵌套结构 public static class Options { private boolean active; private boolean is_excluded; private double area; // getter和setter } public static class TimedOption { private String key; private List<List<Integer>> changesOverTime; // getter和setter } public static class Computed { private ActiveTimedOptions activeTimedOptions; // getter和setter } public static class ActiveTimedOptions { private int min; private int max; private int idle_time; private int revenue; private int walking_range1; private int walking_range2; // getter和setter } }
然后解析为自定义类数组:
RelocationZone[] zones = mapper.readValue(new File(fileLocation), RelocationZone[].class); if (zones[0].getGeometry() instanceof Polygon) { System.out.println("yes"); }
关键说明
- 标准GeoJSON的
Feature结构包含type(必须为"Feature")、properties和geometry,你的数据只是把type改成了自定义的"relocationzone",但整体结构符合Feature,因此可以用Feature类解析。 - 关闭
FAIL_ON_UNKNOWN_PROPERTIES是为了忽略那些geojson-jackson不认识的业务字段(如_id、cityId),避免解析失败。
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

