怎样成为艺术家?又该如何赚钱?
0 2025-07-03
上周和做土地规划的朋友聊天,他吐槽:“用JTS画个多边形,文档翻半天还是报错!” 这场景我可太熟了——刚接触地理空间开发时,我也被GeometryFactory
和坐标点顺序折腾得够呛。今天咱们就用最直白的代码+避坑指南,手把手教你用JTS生成多边形,连坐标系转换的雷都帮你标清楚!
为什么多边形创建是JTS入门的第一道坎?
举个例子:你想在地图上标出北京五环范围,理论上五个坐标点就能搞定。但实际敲代码时,如果坐标点顺序没按逆时针排(JTS的强制要求),直接抛出
TopologyException
——错误提示像天书,新手当场懵圈。更头疼的是坐标系问题:比如你用高德地图的GCJ-02坐标,但JTS默认用WGS-84,不转换的话多边形直接飘到外太空。
分三步搞定基础多边形(附避坑代码):
准备坐标点:记住“逆时针闭合”原则!比如画个矩形,坐标顺序必须是左下→右下→右上→左上→回到左下。我常用的偷懒方法是先用GeoJSON.io画个草图,自动生成合规坐标串。
java运行复制// 正确示例:闭合逆时针坐标 Coordinate[] coords = new Coordinate[]{ new Coordinate(0, 0), // 左下 new Coordinate(10, 0), // 右下 new Coordinate(10, 10), // 右上 new Coordinate(0, 10), // 左上 new Coordinate(0, 0) // 回起点闭合! };
选对GeometryFactory:
新手常忽略工厂类的坐标系参数。如果是国内项目,强烈建议用CoordinateReferenceSystem
指定GCJ-02或BD-09,否则叠加到地图API上全错位:
java运行复制// 指定坐标系(需引入jts-coordinatesystem扩展包) CRSFactory crsFactory = new CRSFactory(); CoordinateReferenceSystem crs = crsFactory.createFromName("EPSG:4610"); // 中国专用 GeometryFactory factory = new GeometryFactory(new PrecisionModel(), crs);
生成多边形+验证合法性:
用isValid()
快速检测,比如顶点交叉、未闭合等问题一秒定位:
java运行复制Polygon polygon = factory.createPolygon(coords); if (!polygon.isValid()) { System.out.println("错误原因:" + polygon.getValidationError()); }
实际应用场景:土地权属标注
去年帮农业部门做地块管理系统,需要根据农户合同生成耕地多边形。遇到个典型坑:用户上传的坐标文件里混了孔洞多边形(比如地块中有个鱼塘)。这时要用LinearRing
区分外圈和内圈:
java运行复制// 外圈是耕地,内圈是鱼塘 LinearRing outerRing = factory.createLinearRing(outerCoords); LinearRing innerRing = factory.createLinearRing(innerCoords); Polygon landWithPond = factory.createPolygon(outerRing, new LinearRing[]{innerRing});
个人心得:JTS文档虽然全,但新手直接啃容易漏细节。不如先跑通一个多边形生成流程,再逐步加缓冲区分析、空间关系判断——地理开发的成就感,往往从画出第一个正确图形开始。
遇到报错别慌,90%的问题出在坐标顺序或参考系。建议装个JTS TestBuilder(官网可下),把坐标粘贴进去实时调试,比反复编译省心多了。搞定了多边形,JTS的其他功能就像解锁新地图,越用越上头~