【问题标题】:bulk conversion of gis points into lat/long [duplicate]将 gis 点批量转换为纬度/经度 [重复]
【发布时间】:2019-09-20 09:25:26
【问题描述】:

我有一个包含数千条记录的数据库,每条记录都包含几个 GIS 格式的坐标。 我需要将所有这些点转换为经纬度点。

我怎样才能做到这一点?

  • php?
  • mysql?-->sql
  • 脚本?

我已经手动尝试过这个online gis converter 但使用前几个数据 gis: lat_gis: 40°29'02,70'' long_gis: 16°28'60,00'' 给出关于秒数的错误,那必须小于 60 (

哪种方式更聪明、更快捷?

【问题讨论】:

  • 40°29'02,70 中的70 是什么意思?
  • 在意大利十进制格式中“,”类似于“。”如果在这种情况下有意义的话,秒小数也是如此
  • @JayBlanchard:这个问题是关于将度-分-秒转换为十进制数字。 The question you marked是关于GIS地理投影转换的。这个问题当然不是那个问题的重复。

标签: php mysql database gis latitude-longitude


【解决方案1】:

您可能需要这样的字符串转换函数:

<?php

function gis2dec(string $string): string {
    $string = str_replace(',', '.', $string);
    if (preg_match('#^((\d+(\.\d+|))°)((\d+(\.\d+|))(′|\')|)((\d+(\.\d+|))(″|"|′′|\'\')|)(|\s*([NESW]))$#', $string, $matches)) {
        $sign = 1;
        switch (strtoupper($matches[13])) {
            case 'S':
            case 'W':
                $sign = -1;
                break;
        }
        return $sign * ($matches[2] + ((float) ($matches[5] ?? 0)) / 60 + ((float) ($matches[9] ?? 0)) / 3600);
    }
    return (string) $string;
}

var_dump(gis2dec("40°29'02,70''"));
var_dump(gis2dec("16°28'60,00''"));
var_dump(gis2dec("40°29'02,70'' S"));
var_dump(gis2dec("16°28'60,00'' W"));

输出:

string(15) "40.484083333333"
string(15) "16.483333333333"
string(16) "-40.484083333333"
string(16) "-16.483333333333"

【讨论】:

  • 你为什么要设置一个固定的偏移量“13”?
  • 13 是匹配 N / E / S / W 扇区的正则表达式的子组。如果是南或西,则需要将坐标转换为负坐标,以便 Google 地图等地图服务正常工作。
  • preg_match 调用之后只需var_dump$matches 即可查看其中的内容。
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多