更改 addMouseCoordinates 以显示十进制分钟秒而不是十进制度?
Posted
技术标签:
【中文标题】更改 addMouseCoordinates 以显示十进制分钟秒而不是十进制度?【英文标题】:Change addMouseCoordinates to display decimal minutes seconds instead of decimal degrees? 【发布时间】:2022-01-16 14:57:16 【问题描述】:我需要能够以闪亮的方式显示传单地图,用户可以在地图上看到鼠标在地图上的位置(以度分秒为单位)。
addMouseCoordinates 添加鼠标坐标,但格式为十进制度。有没有办法改变它以度分秒显示?
library(leaflet)
library(leafem)
leaflet() %>%
addProviderTiles("OpenStreetMap") %>%
addMouseCoordinates()
【问题讨论】:
根据官方文档, >默认情况下只显示'lat'、'lon'和'zoom'。要显示有关 epsg 的详细信息,proj4 按住“Ctrl”并移动鼠标。 'Ctrl' + 单击会将地图顶部框/条的当前内容复制到剪贴板,但目前仅支持复制'lon'、'lat'和'zoom',不支持'epsg'和' proj4',因为这些不会随平移和缩放而改变。 您可以在这里找到文档:cran.r-project.org/web/packages/leafem/leafem.pdf 我试过改变 epsg 但它仍然没有改变纬度/经度的格式,它仍然以十进制度而不是 DMS 显示 【参考方案1】:我已经编辑了leafem (addMouseCoordinates) 中的函数,将纬度和经度转换为度分秒。我还更改了框中的标签。
现在鼠标位置显示为“经度:dd°mm ss.sss E | 纬度:dd°mm ss.sss S” 当 ctrl + hover 时,仅显示十进制度的 lat 和 lon。
注意:我要展示的区域是澳大利亚西南部。所以我手动添加了“S”和“E”,但如果你想显示多个半球,则需要调整代码。
clipboardDependency = function()
list(
htmltools::htmlDependency(
name = "clipboard",
version = "0.0.1",
src = system.file("htmlwidgets/lib/clipboard", package = "leafem"),
script = "setClipboardText.js"
)
)
addMouseCoordinates <- function(map,
epsg = NULL,
proj4string = NULL,
native.crs = FALSE)
if (inherits(map, "mapview")) map <- mapview2leaflet(map)
stopifnot(inherits(map, c("leaflet", "leaflet_proxy", "mapdeck")))
if (native.crs)
txt_detailed <- paste0("
' x: ' + (e.latlng.lng).toFixed(5) +
' | y: ' + (e.latlng.lat).toFixed(5) +
' | epsg: ", epsg, " ' +
' | proj4: ", proj4string, " ' +
' | zoom: ' + map.getZoom() + ' '")
else
txt_detailed <- paste0("
'Longitude: ' + (e.latlng.lng).toFixed(5) +
' | Latitude: ' + ((e.latlng.lat).toFixed(5)) +
' (Decimal Degrees)'")
txt_basic <- paste0("
'Longitude: ' + [0|(e.latlng.lng)] +
'° ' +
[0|((e.latlng.lng)<0?(e.latlng.lng)=-(e.latlng.lng):(e.latlng.lng))%1*60] +
' ' +
((e.latlng.lng)*60%1*60).toFixed(3) +
' E' +
' | Latitude: ' + [0|(e.latlng.lat)] +
'° ' +
[0|((e.latlng.lat)<0?(e.latlng.lat)=-(e.latlng.lat):(e.latlng.lat))%1*60] +
' ' +
((e.latlng.lat)*60%1*60).toFixed(3) +
' S (Degrees Minutes Seconds) '")
map$dependencies = c(
map$dependencies,
clipboardDependency()
)
map <- htmlwidgets::onRender(
map,
paste0(
"
function(el, x, data)
// get the leaflet map
var map = this; //HTMLWidgets.find('#' + el.id);
// we need a new div element because we have to handle
// the mouseover output separately
// debugger;
function addElement ()
// generate new div Element
var newDiv = $(document.createElement('div'));
// append at end of leaflet htmlwidget container
$(el).append(newDiv);
//provide ID and style
newDiv.addClass('lnlt');
newDiv.css(
'position': 'relative',
'bottomleft': '0px',
'background-color': 'rgba(255, 255, 255, 0.7)',
'box-shadow': '0 0 2px #bbb',
'background-clip': 'padding-box',
'margin': '0',
'padding-left': '5px',
'color': '#333',
'font': '9px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif',
'z-index': '700',
);
return newDiv;
// check for already existing lnlt class to not duplicate
var lnlt = $(el).find('.lnlt');
if(!lnlt.length)
lnlt = addElement();
// grab the special div we generated in the beginning
// and put the mousmove output there
map.on('mousemove', function (e)
if (e.originalEvent.ctrlKey)
if (document.querySelector('.lnlt') === null) lnlt = addElement();
lnlt.text(", txt_detailed, ");
else
if (document.querySelector('.lnlt') === null) lnlt = addElement();
lnlt.text(", txt_basic, ");
);
// remove the lnlt div when mouse leaves map
map.on('mouseout', function (e)
var strip = document.querySelector('.lnlt');
if( strip !==null) strip.remove();
);
;
//$(el).keypress(67, function(e)
map.on('preclick', function(e)
if (e.originalEvent.ctrlKey)
if (document.querySelector('.lnlt') === null) lnlt = addElement();
lnlt.text(", txt_basic, ");
var txt = document.querySelector('.lnlt').textContent;
console.log(txt);
//txt.innerText.focus();
//txt.select();
setClipboardText('\"' + txt + '\"');
);
"
)
)
map
【讨论】:
以上是关于更改 addMouseCoordinates 以显示十进制分钟秒而不是十进制度?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写我的 HTML 登录表单以显式启用 LastPass?
如何更改 Visual Studio 10 中的编译器选项?
React Native 中的 flex vs flexGrow vs flexShrink vs flexBasis?