手动构建磁贴服务器(16.04.2 LTS)

转载: https://switch2osm.org/manually-building-a-tile-server-16-04-2-lts/


本页介绍如何安装,设置和配置操作您自己的磁贴服务器所需的所有软件。逐步说明是为Ubuntu Linux16.04.2 LTS(Xenial Xerus)编写的

软件安装

OSM切片服务器堆栈是程序和库的集合,它们一起工作以创建切片服务器。与OpenStreetMap一样,有很多方法可以实现这一目标,而且几乎所有组件都有其他具有各种特定优点和缺点的替代方案。本教程描述了主OpenStreetMap.org磁贴服务器上也使用的最标准版本。

它由5个主要组件组成:Mod_tile,renderd,mapnik,osm2pgsql和postgresql / postgis数据库。Mod_tile是一个apache模块,它为缓存的tile提供服务并决定哪些tile需要重新渲染 - 要么是因为它们尚未缓存,要么是因为它们已过时。Renderd提供了一个优先级排队系统,用于呈现请求以管理和平滑渲染请求的负载。Mapnik是执行实际渲染并由renderd使用的软件库。

请注意,这些说明是针对新安装的Ubuntu 16.04服务器编写和测试的。如果您已经安装了某些软件的其他版本(可能是从早期的Ubuntu版本升级,或者您设置了一些PPA来加载),那么您可能需要进行一些调整。

为了构建这些组件,需要首先安装各种依赖项:

sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos ++  -  dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c -compiler libfreetype6-dev libpng12-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff- EPSG

说是安装。这需要一段时间,所以去喝一杯茶。此列表包括各种实用程序和库,Apache Web服务器和“carto”,用于将Carto-CSS样式表转换为地图渲染器可以理解的“mapnik”。完成后,安装第二组先决条件:

安装postgresql / postgis

在Ubuntu上有postgis和postgresql的预打包版本,所以这些只需通过Ubuntu包管理器安装即可。

sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2

这里“postgresql”是我们要存储地图数据的数据库,“postgis”为它添加了一些额外的图形支持。再次说,是安装。

现在您需要创建一个postgis数据库。各种程序的默认值假设数据库被称为gis,我们将在本教程中使用相同的约定,尽管这不是必需的。将您的用户名替换为renderaccount,在下面使用。这应该是用Mapnik呈现地图的用户名。

sudo -u postgres -i
createuser renderaccount#为超级用户回答yes(尽管这不是严格必要的)
createdb -E UTF8 -O renderaccount gis

在仍然作为“postgres”用户工作时,在PostgreSQL数据库上设置PostGIS(再次,用下面的用户名替换renderaccount):

PSQL

(那会让你进入“postgres =#”提示)

\ c gis

(它将回答'您现在已连接到数据库“gis”作为用户“postgres”。')

CREATE EXTENSION postgis;

(它会回答CREATE EXTENSION)

CREATE EXTENSION hstore;

(它会回答CREATE EXTENSION)

ALTER TABLE geometry_columns OWNER TO renderaccount;

(它会回答ALTER TABLE)

ALTER TABLE spatial_ref_sys OWNER to renderaccount;

(它会回答ALTER TABLE)

\ q

(它将退出psql并返回正常的Linux提示符)

出口

(退出回到我们之前做过“sudo -u postgres -i”之前的用户)

如果您还没有为此用户创建一个Unix用户,请在出现提示时选择密码:

sudo useradd -m renderaccount
sudo passwd renderaccount

同样,上面用您选择的非root用户名替换“renderaccount”。

安装osm2pgsql

我们需要从源代码安装各种软件。第一个是“osm2pgsql”。存在各种工具来将OpenStreetMap数据导入和管理到数据库中。在这里,我们将使用“osm2pgsql”,这可能是最受欢迎的。

mkdir〜/ src
cd〜/ src
git clone git://github.com/openstreetmap/osm2pgsql.git
cd osm2pgsql

osm2pgsql使用的构建机制自旧版本以来已发生变化,因此我们需要为此安装更多先决条件:

sudo apt install make cmake g ++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos ++  -  dev libproj-dev lua5.2 liblua5.2-dev

再次说,是安装。

mkdir build && cd build
cmake ..

(该输出应以“构建文件已写入...”结束

使

(该输出应该以“[100%]建立目标osm2pgsql”结束)

sudo make install

Mapnik的

接下来,我们将安装Mapnik。我们将在Ubuntu 16.04中使用默认版本:

sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos ++  -  dev libproj-dev gdal-bin libgdal1-dev libmapnik-dev mapnik-utils python-mapnik

我们将检查Mapnik是否已正确安装:

蟒蛇
>>>导入mapnik
>>>

如果python用第二个chevron提示回复>>>并且没有错误,那么Python就找到了Mapnik库。恭喜!你可以用这个命令离开Python:

>>>退出()

安装mod_tile和renderd

接下来,我们将安装mod_tile和renderd。“mod_tile”是一个Apache模块,用于处理tile的请求; “renderd”是一个守护进程,它实际上在“mod_tile”请求它们时渲染了tile。我们将使用mod_tile的“switch2osm”分支:https//github.com/SomeoneElseOSM/mod_tile,它本身是从https://github.com/openstreetmap/mod_tile派生的,但经过修改以便它支持Ubuntu 16.04,并且还有一些其他更改可以在标准的Ubuntu服务器上工作,而不是在OSM的渲染服务器上工作。

编译mod_tile源代码:

cd〜/ src
git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git
cd mod_tile
./autogen.sh

(应该以“autoreconf:Leaving directory`。”结束)

。/配置

(应该以“config.status:执行libtool命令”结束)

使

请注意,一些“令人担忧”的消息将在此处向上滚动屏幕。但是它应该以“make [1]:离开目录'/ home / renderaccount / src / mod_tile'”结束。

sudo make install

(应完成“make [1]:离开目录'/ home / renderaccount / src / mod_tile'”)

sudo make install-mod_tile

(应该以“chmod 644 /usr/lib/apache2/modules/mod_tile.so”结束)

sudo ldconfig

(不应该回复任何东西)

样式表配置

现在已经安装了所有必需的软件,您需要下载并配置样式表。

我们在这里使用的样式是openstreetmap.org网站上“标准”地图使用的样式。它的选择是因为它有很好的文档记录,并且应该在世界任何地方工作(包括在非拉丁地名的地方)。但是有一些缺点 - 这是一个旨在全球工作的妥协方案,如果您需要这样做,理解和修改就会非常复杂。

网站上的“OpenStreetMap Carto”的主页是https://github.com/gravitystorm/openstreetmap-carto/,并在https://github.com/gravitystorm/openstreetmap-carto/blob/master上有它自己的安装说明/INSTALL.md虽然我们将涵盖这里需要完成的所有事情。

这里我们假设我们将样式表详细信息存储在“renderaccount”用户(或者您正在使用的任何其他用户)的主目录下面的“src”下面的目录中

cd〜/ src
git clone git://github.com/gravitystorm/openstreetmap-carto.git
cd openstreetmap-carto

接下来,我们将安装合适版本的“carto”编译器。这比Ubuntu附带的版本要晚,所以我们需要这样做:

sudo apt install npm nodejs-legacy
sudo npm install -g carto
carto -v 

这应该回应一个至少与以下一样高的数字:

carto 0.18.1(Carto地图样式表编译器)

然后我们将carto项目转换为Mapnik可以理解的东西:

carto project.mml> mapnik.xml

您现在在/home/renderaccount/src/openstreetmap-carto/mapnik.xml上有一个Mapnik XML样式表。

加载数据中

最初,我们只会加载少量测试数据。其他下载位置可用,但“ download.geofabrik.de ”有多种选择。在这个例子中,我们将下载阿塞拜疆的数据,大约25Mb。

浏览到http://download.geofabrik.de/asia/azerbaijan.html并注意“此文件是上次修改”的日期(例如“2017-02-26T21:43:02Z”)。如果我们想要通过人们对OpenStreetMap的后续更改来更新数据库,我们将在以后需要它。下载它如下:

mkdir~ / data
cd~ / data
wget http://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf

以下命令将先前下载的OpenStreetMap数据插入数据库。这一步非常磁盘I / O密集; 进口整个星球可能需要数小时,数天或数周,具体取决于硬件。对于较小的提取,相应的导入时间要快得多,您可能需要尝试使用不同的-C值来适应机器的可用内存。

osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script~ / src / openstreetmap-carto / openstreetmap-carto.lua -C 2500 --number-processes 1 -S~ / src / openstreetmap-carto / openstreetmap-carto.style~ / data / azerbaijan-latest.osm.pbf

有必要解释一下这些选项的含义:

-d gis

要使用的数据库(“gis”曾经是默认值;现在必须指定它)。

 - 创建

将数据加载到空数据库中,而不是尝试附加到现有数据库。

 - 瘦

osm2pgsql可以使用不同的表格布局; “slim”表适用于渲染。

-G

确定如何处理多边形。

--hstore

允许没有显式数据库列的标签用于渲染。

--tag变换脚本

定义用于标记处理的lua脚本。这很容易在样式本身处理它们之前处理OSM标记,使得样式逻辑可能更加简单。

-C 2500

将2.5 Gb的内存分配给osm2pgsql以进行导入过程。如果你有较少的内存,你可以尝试一个较小的数字,如果导入过程因内存不足而被杀死,你需要尝试较小的数字或较小的OSM提取。

 - 数字处理1

使用1个CPU。如果您有更多可用内核,则可以使用更多内核。

-S

在此文件中创建数据库列(实际上这些数据库与“openstreetmap-carto”保持一致)

最后一个参数是要加载的数据文件。

该命令将完成类似“Osm2pgsql整体上花了238s”。

Shapefile下载

虽然用于创建地图的大部分数据都是直接来自您上面下载的OpenStreetMap数据文件,但仍然需要一些用于低缩放国家/地区债券的形状文件。要下载和索引这些:

cd~ / src / openstreetmap-carto /
脚本/ get-shapefiles.py

此过程涉及大量下载,可能需要一些时间。完成后,它将显示“...脚本已完成”。

字体

用于世界各地的名字并不总是用拉丁字符(西班牙字母表中的az)编写的。要安装必要的字体,请执行以下操作:

sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont

OpenSteetMap Carto自己的安装说明还建议从源代码安装“Noto Emoji Regular”。显然,这是美国商店名称中的表情符号所必需的。所有其他可能需要的国际字体(包括通常不支持的字体)都包含在刚刚安装的列表中。

设置您的网络服务器

配置renderd

“renderd”的配置文件是“/usr/local/etc/renderd.conf”。使用文本编辑器(如nano)编辑它:

sudo nano /usr/local/etc/renderd.conf

这里有几行可能需要改变。在“渲染”部分中:

NUM_THREADS = 4

如果您只有2Gb左右的内存,则需要将其减少为2. 
“ajt”部分对应于名为“ajt”的“命名地图样式”。如果需要,您可以拥有多个这些部分,前提是每个部分的URI不同。“XML”行需要更改为:

XML = /家庭/ renderaccount / src目录/ OpenStreetMap的-CARTO / mapnik.xml

您需要将“renderaccount”更改为您在上面使用的任何非root用户名。

URI = /热/

选择该选项是为了使此处生成的图块可以更容易地用于OpenStreetMap.org上的HOT图块图层。你可以在这里使用别的东西,但“/ hot /”和其他东西一样好。

配置Apache

sudo mkdir / var / lib / mod_tile
sudo chown renderaccount / var / lib / mod_tile

sudo mkdir / var / run / renderd
sudo chown renderaccount / var / run / renderd

我们现在需要告诉Apache关于“mod_tile”,所以使用nano(或其他编辑器):

sudo nano /etc/apache2/conf-available/mod_tile.conf

将以下行添加到该文件:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

并保存,然后运行:

sudo a2enconf mod_tile

那就是说你需要运行“service apache2 reload”来激活新的配置; 我们不会那样做。

我们现在需要告诉Apache关于“渲染”。使用nano(或其他编辑器):

sudo nano /etc/apache2/sites-available/000-default.conf
并在“ServerAdmin”和“DocumentRoot”行之间添加以下内容:
LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
#在放弃要呈现的图块之前超时
ModTileRequestTimeout 0
#在放弃要渲染的tile之前超时,否则会丢失
ModTileMissingRequestTimeout 30

并重新加载apache两次:

sudo服务apache2重新加载
sudo服务apache2重新加载

(我怀疑它需要做两次,因为Apache在运行时重新配置时会“混淆”)

如果您将Web浏览器指向:http://yourserveripaddress/index.html,您应该获得Ubuntu / apache的“It works!”页面。

(如果您不知道将分配了哪个IP地址,则可以使用“ifconfig”查找 - 如果网络配置不太复杂,可能是“inet addr”不是“127.0”。 0.1” )。如果您在托管服务提供商处使用服务器,那么服务器的内部地址很可能与已分配给您的外部地址不同,但该外部IP地址已经发送给您,并且很可能是当前正在访问服务器的那个人。

请注意,这只是“http”(端口80)站点 - 如果要启用https,则需要进行更多的Apache配置,但这超出了这些说明的范围。但是,如果您使用“让我们加密”来颁发证书,那么设置它的过程也可以配置Apache HTTPS站点。

第一次运行renderd

接下来,我们将运行renderd来尝试渲染一些tile。最初我们将在前台运行它,以便我们可以看到发生的任何错误:

renderd -f -c /usr/local/etc/renderd.conf

你可能会在这里看到一些警告 - 暂时不用担心。你不应该得到任何错误。如果这样做,请将完整输出保存在pastebin中,并在某个地方询问有关问题的问题,例如help.openstreetmap.org(链接到pastebin - 不包括问题中的所有文本)。

将Web浏览器指向:http://yourserveripaddress/hot/0/0/0.png

您应该在浏览器中看到世界地图,并在命令行上看到更多调试,包括“DEBUG:START TILE”和“DEBUG:DONE TILE”。忽略任何“DEBUG:无法读取fd上的cmd”消息 - 这不是错误。如果您没有获得拼贴,并再次获取其他错误,请将完整输出保存在pastebin中,然后在help.openstreetmap.org等问题上提出问题。

如果这一切正常,请按control-c停止前景渲染过程。

在后台运行渲染

接下来我们将设置“renderd”以在后台运行。首先,编辑“〜/ src / mod_tile / debian / renderd.init”文件,以便将“RUNASUSER”设置为您之前使用过的非root帐户,例如“renderaccount”,然后将其复制到系统目录:

nano〜/ src / mod_tile / debian / renderd.init
sudo cp~ / src / mod_tile / debian / renderd.init /etc/init.d/renderd
sudo chmod u + x /etc/init.d/renderd
sudo cp~ / src / mod_tile / debian / renderd.service / lib / systemd / system /

“renderd.service”文件是“systemd”服务文件。这里使用的版本只调用旧式init命令。为了测试启动命令的工作原理:

sudo /etc/init.d/renderd start

(应该回复“[ok]开始渲染(通过systemctl):renderd.service。”)

要使其每次都自动启动:

sudo systemctl启用renderd

查看瓷砖

为了查看图块,我们会欺骗并将“Switcheroo Redirector”扩展名添加到Chrome(或Chromium)浏览器中:

https://chrome.google.com/webstore/detail/switcheroo-redirector/cnmciclhnghalnpfhhleggldniplelbg?hl=en

我们将“https://tile-a.openstreetmap.fr/hot/”添加为“From”,将“http:// yourserveripaddress / hot /”添加为“To”,并对“tile-b”执行相同操作“和”tile-c“。

从ssh连接做:

tail -f / var / log / syslog | grep“TILE”

(注意“TILE”周围的空格)

这将在每次请求切片时显示一条线,并且每次完成一个切片时显示一条线。

在您配置了switchheroo的Chrome / Chromium浏览器中,请访问:https//www.openstreetmap.org/#map=13/40.3743/49.7134

并切换到OSM中的“人道主义”层。你应该看到一些瓦片请求。逐渐缩小。您将看到在ssh连接中显示对新磁贴的请求。一些低缩放图块可能需要很长时间(几分钟)才能首次渲染,但一旦完成,它们将在下次需要时准备就绪。

恭喜。转到使用图块部分以创建使用新图块服务器的地图。

致谢

最初基于Ian Dees的flossmanuals.net指南Richard Weait的更老的教程Richard Fairhurst编辑和更新,由Andy Townsend和Paul Norman撰写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C[泊车管理系统]

// // main.c // 泊车管理系统 // // Created by 丁小未 on 13-7-14. // Copyright (c) 2013年 dingxiaowei. All rights reserved. // //题目:泊车管理系统 //(1)管理人员根据口令进入系统 //(2)管理车位信息&…

使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的项去了。但是做过安装程序开发人员可能遇到过“需要去掉重定向”的问题&#xff0c…

【51单片机快速入门指南】4.4.2:Mahony AHRS 九轴姿态融合获取四元数、欧拉角

目录传感器的方向源码Mahony_9.cMahony_9.h使用方法测试main.c效果STC15F2K60S2 22.1184MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机:Vofa 1.3.10 移植自MPU6050 获取角度理论推导(三)—9轴融合算法 —— shao15232_1 传感器…

BZOJ 2160 拉拉队排练

2160: 拉拉队排练 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要…

React Native获取设备信息组件

转载 https://www.jianshu.com/p/907b003835dc本文原创首发于公众号:ReactNative开发圈,转载需注明出处。这次介绍的获取移动设备信息的组件名叫:react-native-device-info,兼容IOS和安卓双平台,可以获取设备ID、设备品…

UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)level指定…

【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角

目录传感器的方向源码Madgwick_9.cMadgwick_9.h使用方法测试main.c效果STC15F2K60S2 22.1184MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机:Vofa 1.3.10 移植自AHRS —— LOXO,算法作者:SOH Madgwick 传…

室内定位 - 资料收集

微信小程序API——获取定位 微信小程序定位权限开启或关闭怎么控制 小蜜引路:室内定位导航微信小程序 自己动手 IBeacon 室内定位 完整体验(超详细过程) 10种室内定位技术原理深度解析

关于json格式字符串解析并用mybatis存入数据库

园子里面找了很多关于json解析后存入数据库的方法,不是太乱,就是没有写完,我下面的主题代码多是受下面两位的启发,请按顺序查看 http://www.cnblogs.com/tian830937/p/6364622.html,我沿用了这个例子中的json数据格式,…

网络软件的组成

在计算机网络系统中,除了各种网络硬件设备外,还必须具有网络软件 1、网络操作系统 网络操作系统是网络软件中最主要的软件,用于实现不同主机之间的用户通信,以及全网硬件和软件资源的共享,并向用户提供统一的、方便的网络接口,便于…

【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)

配置文件hibernate.cfg.xml中引入&#xff1a;<mapping class"com.bjsxt.hibernate.Teacher"/> <hibernate-configuration><session-factory><!-- Database connection settings --><property name"connection.driver_class"&g…

室内定位 -- 资料收集

室内定位系列&#xff08;一&#xff09;——WiFi位置指纹&#xff08;译&#xff09;

【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展

目录硬知识IO 扩展芯片 TCA6416ATAC6416A 的寄存器IO 输入寄存器IO 输出寄存器IO 反相寄存器IO 方向寄存器TCA6416A 的操作TCA6416A 写数据TCA6416A 读数据TCA6416A 的 IO 输入寄存器硬件布局示例程序TCA6416A.cTCA6416A.h测试程序main.c实验现象普中51-单核-A2 STC89C52 MSP43…

linux/window 下 solr5.1 tomcat7.x 环境搭建即简单功能测试

2019独角兽企业重金招聘Python工程师标准>>> 之所以想使用solr来进行学习&#xff0c;很大一部分原因就是&#xff0c;solr能够在某种程度上提供RESTFUL相关的URL请求连接&#xff0c;可以把它理解为 以搜索引擎为基础的存储服务系统 &#xff0c;由于他的搜索可以是…

【Java基础总结】多线程

1. 实现多线程的两种方式 1 //第一种&#xff1a;继承Thread类&#xff0c;重写run()方法2 class ThreadTest1 extends Thread{3 public void run(){4 String threadName Thread.currentThread().getName();5 for(int i0;i<10;i){6 System…

C++类分号(;)问题

环境&#xff1a;vs2010 问题&#xff1a;今天编代码过程中发现好多很奇怪的错误&#xff0c;我以为昨天调了下编译器才出问题了。搞了好久&#xff0c;代码注释掉很多还是不行,并且错误还一直在变化。问题大概如下&#xff1a; &#xff08;照片上传不了&#xff09; 1.error …

PHP远程连接MYSQL数据库非常慢的解决方法

不知道如何解决&#xff0c;所以把他空间所在的服务器上也装了个MYSQL,才解决问题&#xff0c;今天又有个这个问题&#xff0c;不能也在这服务器上装一个MYSQL吧&#xff0c;Search: PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题…

【51单片机快速入门指南】5:软件SPI

目录硬知识SPI协议简介SPI接口介绍SPI接口连接图SPI数据传输方向SPI传输模式软件SPI程序源码Soft_SPI.cSoft_SPI.h普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 源于软件模拟SPI接口程序代码&…

svn搭建本地服务端

使用VisualSVN Server来完成,下载地址:https://www.visualsvn.com/server/download/ 我安装的版本是3.3.1,安装的时候选择了标准版本&#xff0c;另外一个版本需要付费(日志跟踪、VDFS等功能)更多可以参考https://www.visualsvn.com/server/licensing/安装完成之后&#xff0c;…

hdu 4612 边连通度缩点+树的最长路径

思路&#xff1a;将以桥为分界的所有连通分支进行缩点&#xff0c;得到一颗树&#xff0c;求出树的直径。再用树上的点减去直径&#xff0c;再减一 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #incl…