You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PTV Vector Map街道小标签显示异常技术排查请求

PTV矢量地图街道小标签位置异常排查求助

环境信息

  • 前端:Java + JavaFx
  • 后端:WildFly + Keycloak
  • 地图实现:通过ol.js、olms.js、require.js及PTV/MapBox加载PTV矢量地图

问题现象

部分街道名称小标签显示位置异常,其定位中心与地图其他元素(如道路线)不符,但其余地图元素均显示正常(示例图可见标签偏离对应道路位置)。

相关样式配置

经排查,standard.json中以下配置块负责渲染异常标签:

{"id": "TSP_RoadLocal_Label","type": "symbol","source": "ptv","source-layer": "LayerTransport","minzoom": 13,"filter": ["all",["==","$type","LineString"],["==","display_class",5]],"layout": {"icon-rotation-alignment": "auto","symbol-placement": "line","text-font": ["Noto Sans Regular"],"text-size": {"stops": [[10,8],[20,14]]},"text-letter-spacing": 0.1,"text-field": "{street_name}"},"paint": {"text-color": "#1B1C1F","text-opacity": {"stops": [[13,0],[14,1]]},"text-halo-color": "hsl(0, 0%, 100%)","text-halo-width": 2}}

相关实现代码

HTML代码

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" charset='utf-8' />
<meta name="viewport" content="width= 100, initial-scale=1.0, user-scalable=no" />
<style type="text/css">
html {height: 100%}
body {height: 100%; margin: 0; padding: 0}
#map_canvas {position:absolute; top:0; bottom:0; width:100%; height: 100%}
</style>
<script src="libraries/ol.js"></script>
<script src="libraries/olms.js"></script>
<script src="libraries/require.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<div id="map_canvas" style="height: 100%; width: 100%"></div>
<script>
var fromProjection; var toProjection; var zoom;
var apiUrl = 'https://api.myptv.com/maps/v1/vector-tiles/{z}/{x}/{y}?apiKey='; var apiKey; var urlTemplate = apiUrl + apiKey; var jsonStyle;
var map;
function setApiKey(api) {apiKey = api; urlTemplate = apiUrl + apiKey;}
function init() {try {if (map != null) {return;} map = new ol.Map({target: 'map_canvas', view: new ol.View({ center: ol.proj.transform([8.7528, 50.377], 'EPSG:4326', 'EPSG:3857'), zoom: 18}), controls:[]}); const layer = new ol.layer.VectorTile({source: new ol.source.VectorTile({format: new ol.format.MVT(), url:urlTemplate, maxZoom: 18,}),}); fetch('./libraries/standard.json').then((response) => response.json()).then((json) => layer.setStyle(olms.stylefunction(layer,json, 'ptv'))); map.addLayer(layer);} catch (e) {console.log(e);}}
function getMap() {init(); return map;}
function getZoom() {return zoom;}
function setZoom(zoomLvl) {zoom = zoomLvl; getMap().getView().setZoom(zoom);}
function getCenterLat() {return ol.proj.transform(getMap().getView().getCenter(), 'EPSG:3857', 'EPSG:4326')[1];}
function getCenterLng() {return ol.proj.transform(getMap().getView().getCenter(), 'EPSG:3857', 'EPSG:4326')[0];}
function setCenter(lat, lng) {try {getMap().getView().setCenter(ol.proj.transform([lng, lat], 'EPSG:4326', 'EPSG:3857'));} catch (e) {console.log(e)}}
</script>
</body>
</html>

Java渲染类代码

import java.net.URL; import java.util.Vector; import javafx.application.Platform;
public class PTVDevVectorMapRenderer extends AbstractHtmlInteractiveMapRenderer {
private static final long serialVersionUID = 1L; public String apiKey = KonstantenCache.getWertGCW("PTV_DEVELOPER", "PTV_API_KEY");
public PTVDevVectorMapRenderer() {super(); initializeMap();}
/** Initialize PTV Map */
public void initializeMap() {final URL urlPTVMaps = getClass().getResource("PTVDevVectorMap.html"); htmlRenderer.setContent(urlPTVMaps.toExternalForm()); refresh(); Platform.runLater(new Runnable() {@Override public void run() {setApiKey(); String scriptInit = "init()"; htmlRenderer.execute(scriptInit);}});}
public void setApiKey() {String apiKey = KonstantenCache.getWertGCW("PTV_DEVELOPER", "PTV_API_KEY"); String scriptApiKey = "setApiKey('" + apiKey + "')"; htmlRenderer.execute(scriptApiKey);}
@Override public void setCenter(double lat, double lng) {String scriptCenter = "setCenter(" + lat + "," + lng + ")"; htmlRenderer.execute(scriptCenter);}
@Override public double getCenterLat() {double centerLat = (double) htmlRenderer.executeAndReturn("getCenterLat()"); return centerLat;}
@Override public double getCenterLng() {double centerLng = (double) htmlRenderer.executeAndReturn("getCenterLng()"); return centerLng;}
@Override public int getZoom() {Object obj = htmlRenderer.executeAndReturn("getZoom()"); if (obj instanceof String) {return 13;} return (int) obj;}
@Override public void setZoom(int zoom) {String script = "setZoom(" + zoom + ")"; htmlRenderer.execute(script);}
@Override public int getMaxZoomLvl() {return 19;}
@Override public int getMinZoomLvl() {return 3;}
@Override public double getDistance(double[] objectPoint, double[] objectPoint2) {String script = "calcDistance(" + objectPoint[0] + "," + objectPoint[1] + "," + objectPoint2[0] + "," + objectPoint2[1] + ")"; double distance = (double) htmlRenderer.executeAndReturn(script); return distance;}
@Override public void setRoute(double[] objectPoint, double[] objectPoint2) {}
@Override public Vector<?> getRoutePoints(double[] objectPoint, double[] objectPoint2) {return null;}
@Override public Vector<double[]> getFahrtgebiet() {return null;}
@Override public double[] getFahrtgebietPoint() {return null;}
}

恳请协助排查部分街道名称小标签显示异常的原因,感谢支持!

内容的提问来源于stack exchange,提问作者Jordi Segura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:17:06