最近在研究关于GIS的信息,通过配置地图时,会生成四个点,而这些点,是由两个值,即经纬组成的,这个和之前做的框选交互是十分类似的,
鼠标框选逻辑
面积经纬算法
JS通过输入对应的GIS坐标点,生成边界值
<!DOCTYPE html>
<html>
<head>
<title>Calculate Rectangle Corners</title>
</head>
<body>
<textarea id="inputText" rows="10" cols="50">
#CRS: GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
mapX,mapY,sourceX,sourceY,enable,dX,dY,residual
106.10301125185782212,21.21701205775816845,0.05582922824301306,0.10262725780084025,1,3.63904872003217772,-3.27289894361088729,4.89433785938987764
106.11201304173776805,21.21700022886213688,5152.14942528735809901,-0.10262725779858783,1,-0.042713389149867,3.27306687765685833,3.27334556978438851
106.10299942296178699,21.2099975224115056,0.56896551724354794,-4000.10262725779966786,1,-3.63941192579220862,-0.00449373144783749,3.63941470008858392
106.11201304173776805,21.2099975224115056,5152.06363531402257649,-4000.09380772783288194,1,0.04307658418565552,0.00432579851894843,0.04329324009508186
</textarea><br>
<button onclick="calculateCorners()">计算角点</button>
<pre id="output"></pre>
<script>
function calculateCorners() {
const input = document.getElementById('inputText').value;
const lines = input.split('\n');
const points = [];
// Skip the header and first line
for (let i = 2; i < lines.length; i++) {
const parts = lines[i].trim().split(/,\s*/);
if (parts.length === 8) {
const mapX = parseFloat(parts[0]);
const mapY = parseFloat(parts[1]);
points.push({ lon: mapX, lat: mapY });
}
}
if (points.length === 0) {
document.getElementById('output').textContent = '没有找到有效的坐标数据';
return;
}
let minLat = Infinity, maxLat = -Infinity;
let minLon = Infinity, maxLon = -Infinity;
points.forEach(point => {
if (point.lat < minLat) minLat = point.lat;
if (point.lat > maxLat) maxLat = point.lat;
if (point.lon < minLon) minLon = point.lon;
if (point.lon > maxLon) maxLon = point.lon;
});
const corners = {
NE: { lon: maxLon, lat: maxLat },
SE: { lon: maxLon, lat: minLat },
SW: { lon: minLon, lat: minLat },
NW: { lon: minLon, lat: maxLat }
};
document.getElementById('output').textContent = JSON.stringify(corners, null, 2);
}
</script>
</body>
</html>
PY通过输入对应的GIS坐标点,生成边界值
def calculate_corners(input_text):
lines = input_text.strip().split('\n')
points = []
# Skip the header and first line
for line in lines[2:]:
parts = [p.strip() for p in line.split(',')]
if len(parts) == 8:
try:
mapX = float(parts[0])
mapY = float(parts[1])
points.append({'lon': mapX, 'lat': mapY})
except ValueError:
continue
if not points:
return "没有找到有效的坐标数据"
minLat = min(point['lat'] for point in points)
maxLat = max(point['lat'] for point in points)
minLon = min(point['lon'] for point in points)
maxLon = max(point['lon'] for point in points)
corners = {
'NE': {'lon': maxLon, 'lat': maxLat},
'SE': {'lon': maxLon, 'lat': minLat},
'SW': {'lon': minLon, 'lat': minLat},
'NW': {'lon': minLon, 'lat': maxLat}
}
import json
return json.dumps(corners, ensure_ascii=False, indent=2)
# 示例用法
if __name__ == "__main__":
input_text = """
#CRS: GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
mapX,mapY,sourceX,sourceY,enable,dX,dY,residual
106.10301125185782212,21.21701205775816845,0.05582922824301306,0.10262725780084025,1,3.63904872003217772,-3.27289894361088729,4.89433785938987764
106.11201304173776805,21.21700022886213688,5152.14942528735809901,-0.10262725779858783,1,-0.042713389149867,3.27306687765685833,3.27334556978438851
106.10299942296178699,21.2099975224115056,0.56896551724354794,-4000.10262725779966786,1,-3.63941192579220862,-0.00449373144783749,3.63941470008858392
106.11201304173776805,21.2099975224115056,5152.06363531402257649,-4000.09380772783288194,1,0.04307658418565552,0.00432579851894843,0.04329324009508186
"""
print(calculate_corners(input_text))