Logo

GIS信息转换

20250113T1126310800

最近在研究关于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))