HeyWhatsThat:可计算地球任意点的视域和全景
来源标题:HeyWhatsThat – Calculate viewshed and panorama for any point on Earth (2022)
HeyWhatsThat 工具可计算地球上任意位置的视域(viewshed)与全景图,相关页面可追溯到 2022 年。其功能代码显示支持磁北/真北指向切换、按方位角列出可见山峰及其距离与海拔,并可打印布局输出。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
(方位角显示为“磁北;若要看真北”或“真北;若要看磁北”,当前打印布局?方位角:方位角,加上或减去|result.declination|°,或点击此处)
显示海拔 var s = ''; current.show_alts_in_peak_list = document.getElementById("show_alts_in_peak_list") && document.getElementById("show_alts_in_peak_list").checked; for (var i = 0; i = 40? '' : ''; 否则 s += ''; s += '' + format_bearing(p.az)
- (current.show_alts_in_peak_list? '/' + format_altitude(p.alt) : '')
- ''
- '' + p.name + ''
- '' + miles_or_km(p.range, 1) + ''
- '' + ft_or_m0(p.true_elev, 1) + ''
- ''; if (current.print_layout) { document.getElementById("list_print_div").innerHTML = '' + s + '' + footer; } else { set_list_div_style('375px', peaks.length > 38); list_div.innerHTML = '' + s + '' + footer; document.getElementById("show_alts_in_peak_list").checked = current.show_alts_in_peak_list;
function peak_marker_msg(m) { var p = m._element; if (!p) return null; var gazetteer = ''; var where = format_latlon(p.lat, p.lon, settings.degrees_format, 1) + ' ' + ft_or_m0(p.elev, 1); if (p.true_lat != p.lat || p.true_lon != p.lon) where = '山峰标记位于 ' // + '' // 用户将看到球面方位角和距离
- '' // 用户将看到 WGS84 方位角和距离
- where + ' '
- '(地名录位置 '
- format_latlon(p.true_lat, p.true_lon, settings.degrees_format, 1) + ' ' + ft_or_m0(p.true_elev, 1) + ')'; else if (p.true_elev != p.elev) where = where + ' (地名录海拔 ' + ft_or_m0(p.true_elev, 1) + ')'; return '' + p.name + ' '
- format_bearing(p.az) + ' '
- miles_or_km(p.range, 1) + ' '
- '' + where + '';
function add_viewer_marker() { remove_from_map(current.viewer_marker); current.viewer_marker = new $m.Marker({ map: map, position: result.latlng, icon: icon_x, anchorPoint: icon_x.anchorpoint, title: result.name }); current.viewer_marker._msg_f = viewer_marker_msg; $m.event.addListener(current.viewer_marker, 'click', function() { select_home(0, 1); });
function viewer_marker_msg() { return '' + (result.name || 'Home') + ' '
- format_latlon(result.lat, result.lon, settings.degrees_format, 1) + ' '
- '视野来自地面以上 ' + ft_or_m0(result.elev_agl, 1) + ' '
- '(海拔 ' + ft_or_m0(result.elev_amsl, 1) + ')'; // 你可以覆盖方位角/高度/距离,例如使用山峰数据中的值,而不是点击地图时计算的值 // 问题:这是否应该与 set_lat_lon() 集成,并进行适当的测试(例如不在观察者位置、不显示查询……)
function draw_lines(az, alt, range, az_for_silmarker) { // alt 在 show_bearing() 中设置 if (az == null || range == null) { var a = bearing_and_range(result.lat, result.lon, current.lat, current.lon); if (az == null) az = adjust_for_declination(a[0]); if (range == null) range = a[1]; remove_from_map(current.centerline); current.centerline = new $m.Polyline({ path: [result.latlng, current.latlng], strokeColor: '#8B6914', strokeWeight: 3, strokeOpacity: .5, clickable: true, geodesic: true }); $m.event.addListener(current.centerline, 'click', function(e) { transect_map_click(round6(e.latLng.lat()), round6(e.latLng.lng())); }); // 不能在这里直接 current.centerline.setMap(map),因为如果线条延伸到 // 当前鼠标位置下方,会干扰双击检测 // 注意我们只在调用 set_lat_lon 之后才调用 draw_lines,所以我们会利用 // 在那里设置的定时器 draw_centerline_too = 1; var x = (az_for_silmarker != null? az_for_silmarker : az) - sil_parms.first_segment * 360 / sil_parms.n_segments; if (x 计算视线' : current.bearing.has_los? ' 有视线' : (current.bearing.viewer_agl_for_los = 360) az -= 360; return az;
function sil_div_alt(y) { return (sil_parms.height - y) / sil_parms.alt_scale + sil_parms.alt_min;
function silhouetteclick(pane, event) { if (current.show_all) return; var az = sil_div_az(is_msie? event.x : event.layerX); var az_spread = 3 / sil_parms.az_scale; var alt_below = -4 / sil_parms.alt_scale; var alt_above = 7 / sil_parms.alt_scale; // 如果标记非常近,就用它 for (var i = 0; i az + az_spread) break; // 点击在标记的几个像素范围内 //(注意倒三角形的热点是标记的底部) if (Math.abs(az - peaks[i].az) 0) azlimits = limits.slice(result.declination).concat(limits.slice(0, result.declination - 1)); else azlimits = limits.slice(360 + result.declination).concat(limits.slice(0, 360 + result.declination - 1)); else azlimits = limits; reset_display(); current.show_all = false; current.query_is_visible = false; current.sponsor_is_visible = false; current.print_layout = _print_layout; set_panes(); set_tabs(); update_allsummits(); upintheair_widget.set_state(BoxControl.OFF); write_cookie('last_result', id); result.latlng = new $m.LatLng(result.lat, result.lon); result.ground_amsl = result.elev_amsl - result.elev_agl; if (current.print_layout) { $$('scale_print_status_div').innerHTML = '(垂直比例 夸大 ' + round1(sil_parms.alt_scale / sil_parms.az_scale) + '倍)'; } else { $$('scale_status_div').innerHTML = '(垂直比例夸大 ' + round1(sil_parms.alt_scale / sil_parms.az_scale) + '倍)'; silmarkerstyle.height = sil_parms.headroom + sil_parms.alt_scale * (sil_parms.alt_max - sil_parms.alt_min) + 'px'; cloak_widget.set_state(BoxControl.ON); show_silhouette(); set_sil_alt_scale(current.sil_alt_scale); write_result_title(); add_viewer_marker(); map.setZoom(11); // 默认缩放级别 write_peak_list_div_and_markers(); recenter_text.innerHTML = result.name; wtbutton_show($$('north_widget'), settings.use_magnetic? 1 : 0); set_view_menus_to(id); set_lat_lon(result.lat, result.lon, result.elev_amsl, 1); if (!_print_layout) {
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。