понедельник, 11 июля 2011 г.

Получение центроида объекта из БД MS SQL Server без использования ArcSDE

Существует БД MS SQL Server с установленным ArcSDE и Spatial слоями. Требуется в веб-приложении без использования ArcSDE получить координаты точечного объекта по его идентификатору и имени таблицы.
Задача решена на C# созданием следующего метода:
    private int[] getCoordinates(SqlConnection connection, string tablename, int shape) 
    {
        int[] coord = new int[2];
        string g_table_name = "";
        SqlCommand command1 = new SqlCommand("select g_table_name from" +
            " M10_DATABASE.dbo.SDE_geometry_columns where f_table_name='" + 
            tablename + "'", connection);
        SqlDataReader reader1;
        reader1 = command1.ExecuteReader();
        if (reader1.Read())
            g_table_name = reader1["g_table_name"].ToString();
        reader1.Close();
        if (!String.IsNullOrEmpty(g_table_name))
        {
            SqlCommand command2 = new SqlCommand("select eminx, eminy, emaxx, emaxy" +
                " from M10_DATABASE.dbo." + 
                g_table_name + " where fid=" + shape, connection);
            SqlDataReader reader2 = command2.ExecuteReader();
            if (reader2.Read())
            {
                double x = ((Double)reader2["eminx"] + (Double)reader2["emaxx"]) / 2;
                double y = ((Double)reader2["eminy"] + (Double)reader2["emaxy"]) / 2;
                coord[0] = (int)Math.Round(x);
                coord[1] = (int)Math.Round(y);
            }
            reader2.Close();
        }
        return coord;
    }

понедельник, 4 июля 2011 г.

Как понизить размерность геометрического поля таблицы в PostGIS

В таблице PostGIS имеем размерность 4 (x, y, z, m). Запрос
SELECT f_geometry_column, coord_dimension, srid, type FROM geometry_columns WHERE f_table_name='main';
возвращает:
geom      4      60000      POINT
При запросе геометрических данных этой таблицы
SELECT ST_AsEWKT(geom), ST_AsText(geom), ST_NDims(geom) FROM main WHERE gid=1;
получаем:
SRID=60000;POINT(-4290.34 7248.45 0 -1.79e+308)      POINT(-4290.34 7248.45)      4
Требуется преобразовать поле geom таблицы main к размерности 2.
Для этого выполним:
ALTER TABLE main DROP CONSTRAINT enforce_dims_geom;
UPDATE geometry_columns SET coord_dimension=2 WHERE f_table_name='main';
UPDATE main SET geom=ST_GeomFromEWKT('SRID='||ST_SRID(geom)||';'||ST_AsText(geom))
        WHERE ST_NDims(geom)=4;
ALTER TABLE main ADD CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2);
Всё. Задача решена. Размерность понижена с четырёх до двух.