计算多边形 kml 的质心
calculate centorid of the polygon kml
当点分布不均匀时如何计算多边形的中心?
在下面的 kml
文件中,30% 的 lat/lons
都在一侧,因此平均值不会产生好的结果。有谁知道有什么好的库可以实现它吗?
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/kml/2.2
http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd
http://www.google.com/kml/ext/2.2
http://code.google.com/apis/kml/schema/kml22gx.xsd">
<Document id="DLS_Parcels">
<name>DLS_Parcels</name>
<Snippet/>
<Folder id="FeatureLayer0">
<name>DLS_Parcels</name>
<Snippet/>
<Placemark id="ID_00000">
<name>189</name>
<Snippet/>
<description><![CDATA[<html><body><table border="1"><tr><th>Field Name</th><th>Field Value</th></tr><tr><td>OBJECTID</td><td>240106</td></tr><tr><td>SBPI_ID_NO</td><td>1076078</td></tr><tr><td>District Code</td><td>6</td></tr><tr><td>Municipality/Community Code</td><td>343</td></tr><tr><td>Quarter Code</td><td>1</td></tr><tr><td>Block Code</td><td>0</td></tr><tr><td>Parcel Number</td><td>189</td></tr><tr><td>Sheet</td><td>26</td></tr><tr><td>Plan</td><td>50</td></tr><tr><td>SRC_SL_CODE</td><td>5</td></tr><tr><td>SOURCE</td><td>DCDB</td></tr><tr><td>Parcel Area</td><td>2516</td></tr><tr><td>CadastralPlan</td><td>Null</td></tr></table></body></html>]]></description>
<styleUrl>#PolyStyle00</styleUrl>
<MultiGeometry>
<Polygon>
<extrude>0</extrude>
<altitudeMode>clampToGround</altitudeMode>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates> 32.394743,35.040539,0.000000
32.394946,35.040474,0.000000 32.395228,35.040376,0.000000
32.395274,35.040366,0.000000 32.395306,35.040379,0.000000
32.395318,35.040406,0.000000 32.395308,35.040847,0.000000
32.394855,35.040830,0.000000 32.394861,35.040659,0.000000
32.394642,35.040669,0.000000 32.394506,35.040674,0.000000
32.394505,35.040673,0.000000 32.394505,35.040672,0.000000
32.394505,35.040671,0.000000 32.394504,35.040670,0.000000
32.394504,35.040669,0.000000 32.394504,35.040668,0.000000
32.394503,35.040667,0.000000 32.394503,35.040666,0.000000
32.394503,35.040666,0.000000 32.394503,35.040665,0.000000
32.394502,35.040664,0.000000 32.394502,35.040663,0.000000
32.394502,35.040662,0.000000 32.394502,35.040661,0.000000
32.394502,35.040660,0.000000 32.394502,35.040659,0.000000
32.394501,35.040658,0.000000 32.394501,35.040657,0.000000
32.394501,35.040656,0.000000 32.394501,35.040655,0.000000
32.394501,35.040654,0.000000 32.394501,35.040653,0.000000
32.394501,35.040652,0.000000 32.394501,35.040651,0.000000
32.394501,35.040650,0.000000 32.394501,35.040649,0.000000
32.394502,35.040649,0.000000 32.394502,35.040648,0.000000
32.394502,35.040647,0.000000 32.394502,35.040646,0.000000
32.394502,35.040645,0.000000 32.394502,35.040644,0.000000
32.394503,35.040643,0.000000 32.394503,35.040642,0.000000
32.394503,35.040641,0.000000 32.394503,35.040640,0.000000
32.394504,35.040639,0.000000 32.394504,35.040638,0.000000
32.394504,35.040637,0.000000 32.394505,35.040636,0.000000
32.394505,35.040636,0.000000 32.394505,35.040635,0.000000
32.394506,35.040634,0.000000 32.394506,35.040633,0.000000
32.394507,35.040632,0.000000 32.394507,35.040631,0.000000
32.394508,35.040630,0.000000 32.394508,35.040629,0.000000
32.394509,35.040629,0.000000 32.394509,35.040628,0.000000
32.394510,35.040627,0.000000 32.394510,35.040626,0.000000
32.394511,35.040625,0.000000 32.394512,35.040624,0.000000
32.394512,35.040624,0.000000 32.394513,35.040623,0.000000
32.394514,35.040622,0.000000 32.394514,35.040621,0.000000
32.394515,35.040621,0.000000 32.394516,35.040620,0.000000
32.394516,35.040619,0.000000 32.394517,35.040618,0.000000
32.394518,35.040618,0.000000 32.394519,35.040617,0.000000
32.394519,35.040616,0.000000 32.394520,35.040616,0.000000
32.394521,35.040615,0.000000 32.394522,35.040614,0.000000
32.394523,35.040614,0.000000 32.394524,35.040613,0.000000
32.394624,35.040579,0.000000 32.394743,35.040539,0.000000</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</MultiGeometry>
</Placemark>
</Folder>
<Style id="PolyStyle00">
<LabelStyle>
<color>00000000</color>
<scale>0.000000</scale>
</LabelStyle>
<LineStyle>
<color>ff0000e6</color>
<width>3.000000</width>
</LineStyle>
<PolyStyle>
<color>00000000</color>
<outline>1</outline>
</PolyStyle>
</Style>
</Document>
</kml>
您可以利用geoPHP
这是一个例子
$kml = '<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>The Pentagon</name>
<Polygon>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-77.05788457660967,38.87253259892824,100
-77.05465973756702,38.87291016281703,100
-77.05315536854791,38.87053267794386,100
-77.05552622493516,38.868757801256,100
-77.05844056290393,38.86996206506943,100
-77.05788457660967,38.87253259892824,100
</coordinates>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>
-77.05668055019126,38.87154239798456,100
-77.05542625960818,38.87167890344077,100
-77.05485125901024,38.87076535397792,100
-77.05577677433152,38.87008686581446,100
-77.05691162017543,38.87054446963351,100
-77.05668055019126,38.87154239798456,100
</coordinates>
</LinearRing>
</innerBoundaryIs>
</Polygon>
</Placemark>
</kml>';
$polygon = geoPHP::load($kml, 'kml');
$centroid = $polygon->getCentroid();
$centX = $centroid->getX();
$centY = $centroid->getY();
当点分布不均匀时如何计算多边形的中心?
在下面的 kml
文件中,30% 的 lat/lons
都在一侧,因此平均值不会产生好的结果。有谁知道有什么好的库可以实现它吗?
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/kml/2.2
http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd
http://www.google.com/kml/ext/2.2
http://code.google.com/apis/kml/schema/kml22gx.xsd">
<Document id="DLS_Parcels">
<name>DLS_Parcels</name>
<Snippet/>
<Folder id="FeatureLayer0">
<name>DLS_Parcels</name>
<Snippet/>
<Placemark id="ID_00000">
<name>189</name>
<Snippet/>
<description><![CDATA[<html><body><table border="1"><tr><th>Field Name</th><th>Field Value</th></tr><tr><td>OBJECTID</td><td>240106</td></tr><tr><td>SBPI_ID_NO</td><td>1076078</td></tr><tr><td>District Code</td><td>6</td></tr><tr><td>Municipality/Community Code</td><td>343</td></tr><tr><td>Quarter Code</td><td>1</td></tr><tr><td>Block Code</td><td>0</td></tr><tr><td>Parcel Number</td><td>189</td></tr><tr><td>Sheet</td><td>26</td></tr><tr><td>Plan</td><td>50</td></tr><tr><td>SRC_SL_CODE</td><td>5</td></tr><tr><td>SOURCE</td><td>DCDB</td></tr><tr><td>Parcel Area</td><td>2516</td></tr><tr><td>CadastralPlan</td><td>Null</td></tr></table></body></html>]]></description>
<styleUrl>#PolyStyle00</styleUrl>
<MultiGeometry>
<Polygon>
<extrude>0</extrude>
<altitudeMode>clampToGround</altitudeMode>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates> 32.394743,35.040539,0.000000
32.394946,35.040474,0.000000 32.395228,35.040376,0.000000
32.395274,35.040366,0.000000 32.395306,35.040379,0.000000
32.395318,35.040406,0.000000 32.395308,35.040847,0.000000
32.394855,35.040830,0.000000 32.394861,35.040659,0.000000
32.394642,35.040669,0.000000 32.394506,35.040674,0.000000
32.394505,35.040673,0.000000 32.394505,35.040672,0.000000
32.394505,35.040671,0.000000 32.394504,35.040670,0.000000
32.394504,35.040669,0.000000 32.394504,35.040668,0.000000
32.394503,35.040667,0.000000 32.394503,35.040666,0.000000
32.394503,35.040666,0.000000 32.394503,35.040665,0.000000
32.394502,35.040664,0.000000 32.394502,35.040663,0.000000
32.394502,35.040662,0.000000 32.394502,35.040661,0.000000
32.394502,35.040660,0.000000 32.394502,35.040659,0.000000
32.394501,35.040658,0.000000 32.394501,35.040657,0.000000
32.394501,35.040656,0.000000 32.394501,35.040655,0.000000
32.394501,35.040654,0.000000 32.394501,35.040653,0.000000
32.394501,35.040652,0.000000 32.394501,35.040651,0.000000
32.394501,35.040650,0.000000 32.394501,35.040649,0.000000
32.394502,35.040649,0.000000 32.394502,35.040648,0.000000
32.394502,35.040647,0.000000 32.394502,35.040646,0.000000
32.394502,35.040645,0.000000 32.394502,35.040644,0.000000
32.394503,35.040643,0.000000 32.394503,35.040642,0.000000
32.394503,35.040641,0.000000 32.394503,35.040640,0.000000
32.394504,35.040639,0.000000 32.394504,35.040638,0.000000
32.394504,35.040637,0.000000 32.394505,35.040636,0.000000
32.394505,35.040636,0.000000 32.394505,35.040635,0.000000
32.394506,35.040634,0.000000 32.394506,35.040633,0.000000
32.394507,35.040632,0.000000 32.394507,35.040631,0.000000
32.394508,35.040630,0.000000 32.394508,35.040629,0.000000
32.394509,35.040629,0.000000 32.394509,35.040628,0.000000
32.394510,35.040627,0.000000 32.394510,35.040626,0.000000
32.394511,35.040625,0.000000 32.394512,35.040624,0.000000
32.394512,35.040624,0.000000 32.394513,35.040623,0.000000
32.394514,35.040622,0.000000 32.394514,35.040621,0.000000
32.394515,35.040621,0.000000 32.394516,35.040620,0.000000
32.394516,35.040619,0.000000 32.394517,35.040618,0.000000
32.394518,35.040618,0.000000 32.394519,35.040617,0.000000
32.394519,35.040616,0.000000 32.394520,35.040616,0.000000
32.394521,35.040615,0.000000 32.394522,35.040614,0.000000
32.394523,35.040614,0.000000 32.394524,35.040613,0.000000
32.394624,35.040579,0.000000 32.394743,35.040539,0.000000</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</MultiGeometry>
</Placemark>
</Folder>
<Style id="PolyStyle00">
<LabelStyle>
<color>00000000</color>
<scale>0.000000</scale>
</LabelStyle>
<LineStyle>
<color>ff0000e6</color>
<width>3.000000</width>
</LineStyle>
<PolyStyle>
<color>00000000</color>
<outline>1</outline>
</PolyStyle>
</Style>
</Document>
</kml>
您可以利用geoPHP
这是一个例子
$kml = '<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>The Pentagon</name>
<Polygon>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-77.05788457660967,38.87253259892824,100
-77.05465973756702,38.87291016281703,100
-77.05315536854791,38.87053267794386,100
-77.05552622493516,38.868757801256,100
-77.05844056290393,38.86996206506943,100
-77.05788457660967,38.87253259892824,100
</coordinates>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>
-77.05668055019126,38.87154239798456,100
-77.05542625960818,38.87167890344077,100
-77.05485125901024,38.87076535397792,100
-77.05577677433152,38.87008686581446,100
-77.05691162017543,38.87054446963351,100
-77.05668055019126,38.87154239798456,100
</coordinates>
</LinearRing>
</innerBoundaryIs>
</Polygon>
</Placemark>
</kml>';
$polygon = geoPHP::load($kml, 'kml');
$centroid = $polygon->getCentroid();
$centX = $centroid->getX();
$centY = $centroid->getY();