Arcgis10.2+pgsql14开发(非SDE版本)

这篇具有很好参考价值的文章主要介绍了Arcgis10.2+pgsql14开发(非SDE版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起因:最初采用SDE和pgsql11开发,后因数据库升级到pgsql14,sde因和pgsql版本不般配,无法导入要素数据和显示数据,数据库升级又是必然,所以只能另外找解决方案。

参考资料:Spatial Database for Postgres and ArcGis users: how to choose

附加:zigGis, GDAL。传说中的zigGis相当牛,能直接将postgis中的GIS类型显示到ArcGis的控件中,但是版本又比较复杂,也有可能会设计到版本不般配问题,后期我再看看这方面的知识体系。

Pgsql+postgis使用:PostgreSQL+PostGIS的使用(转载) - 无痕客 - 博客园

PostGIS教程一:PostGIS介绍 - 知乎

实现步骤:

在postgis中提供很多函数将wkb转成它的geometry类型,同样也有将geometry转成binary的函数。当然更兴奋的是ArcGis中有针对标准wkb的转换,这样一来,可想而知,这个方案是行的通的。

第一步:从postgreSQL中通过postgis读取GIS数据显示在AxMapControl中

1. C# 连接数据库pg

注意点: 要注意的是因为ArcEngine中对wkb的支持是byte[]之间的转换,所以在进行数据库取数据时用postgis的这个函数将GIS数据转成byte[],这样写 asbinary(the_geom)

2. 将得到的byte[](也就是wkb数据)通过ArcEngine的接口得到IGeometry,如下所示:

 IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
 factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);

3. 将 IGeometry 显示在AxMapControl中。

第二步:将上一步从pg中显示出来的GIS数据进行相应的修改后保存回pg中

1. 修改指定的要素后通过 geometry得到wkb

要对修改操作进行保存,就需要将指定的要素中的geometry再次转回wkb然后通过sql语句修改pg中的指定记录即可,思路很简单,问题在于拼接SQL字符串上面,因为arcengine通过geometry得到的仍然是一个byte[],这个东西是没办法拼到sql语句中的。

2. 用到的ArcEngine接口如下:

IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
byte[] geoBytes = factory.CreateWkbVariantFromGeometry(geometry) as byte[];

3. 拼接SQL时要将上面的byte[]数组转码

    其实postgis处理存到pg中的是一长串的16进制字符串,相信大家打开数据库能看到,要想拼接好SQL串就得这样来一下:geomfromwkb(decode('" + geoByteStr + "', 'hex'))其中的geoByteStr是byte[]转成16进制的字串

上面两步已走通,是完全可以实现的,这样做的话,数据表我们也能自行定义,操作GIS数据,属性等,更灵活。

完整代码

一、读取数据库代码并且显示

private void pgsql加载非SDEToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Byte[] bytes = PgsqlHelper.executeRouteQueryOne("select st_asbinary(st_union(geom)) as route from public.gis_osm_railways_free_1 where name='京沪线'");
            IGeometry geom = null;
            int countin;
            IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
            factory.CreateGeometryFromWkbVariant(bytes, out geom, out countin);
            IMap pMap = axMapControl1.Map;
            IActiveView pActiveView = pMap as IActiveView;
            IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
            IPolyline pLine = (IPolyline)geom;
            geometry = geom;
            ILineElement pLineElement = new LineElementClass();
            //pLineElement.Symbol = pLineSym;
            //添加geom
            pElement = pLineElement as IElement;
            pElement.Geometry = pLine;
            pGraphicsContainer.AddElement(pElement, 0);
            axMapControl1.FullExtent = pElement.Geometry.Envelope;
            axMapControl1.Refresh();
        }

二、编辑Geometry之后再保存进入数据库

 private void apgsql保存非sdeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
            byte[] geoBytes = factory.CreateWkbVariantFromGeometry(geometry) as byte[];
            string sss = ToHexStrFromByte(geoBytes);
            string sql = @"insert into geomfromwkb(decode('" + geoBytes + "', 'hex'))";
            string sql1 = @"INSERT INTO public.gis_osm_railways_free_1(
	 osm_id, code, fclass, name, layer, bridge, tunnel, geom)
	VALUES ( '444', 4444, '3333', '333', 3 ,'3', '3' ,ST_GeomFromText('st_astext(geomfromwkb(decode('" + sss + "', 'hex')))',4326));";
            PgsqlHelper.ExecuteQuery(sql1);
        }
        public  string ToHexStrFromByte( byte[] byteDatas)
        {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < byteDatas.Length; i++)
            {
                builder.Append(string.Format("{0:X2}", byteDatas[i]));
            }
            return builder.ToString().Trim();
        }

资料

读取pgsql数据库

namespace WHUGIS.Classes
{
    class DAO
    {

        private static string connectionString = "User ID=postgres;Password=admin;Server=localhost;Port=5432;Database=GIS_engine;";
        public DAO()
        {

        }
        public static Byte[] executeRouteQuery(string sqlstr)
        {
            NpgsqlConnection sqlConn = new NpgsqlConnection(connectionString);
            try
            {
                sqlConn.Open();
                NpgsqlCommand objCommand = new NpgsqlCommand(sqlstr, sqlConn);
                Byte[] routeWKB = (byte[])objCommand.ExecuteScalar();
                return routeWKB;
            }
            catch(Exception ee)
            {
                MessageBox.Show(ee.Message);
                return null;
            }
            finally
            {
                sqlConn.Close();
            }
            
        }

    }
}

ArcgisEngine Igeometry和WKB转换文章来源地址https://www.toymoban.com/news/detail-469285.html

using System;
using System.Collections.Generic;
using System.Text;
using GisSharpBlog.NetTopologySuite.IO;
using ESRI.ArcGIS.Geometry;

namespace Utils
{
    /// <summary>
    /// This class is used to convert a GeoAPI Geometry to ESRI and vice-versa.
    /// It can also convert a ESRI Geometry to WKB/WKT and vice-versa.
    /// </summary>
    public static class Converters
    {

        public static byte[] ConvertGeometryToWKB(IGeometry geometry)
        {
            IWkb wkb = geometry as IWkb;
            ITopologicalOperator oper = geometry as ITopologicalOperator;
            oper.Simplify();

            IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
            byte[] b = factory.CreateWkbVariantFromGeometry(geometry) as byte[];
            return b;
        }


        public static byte[] ConvertWKTToWKB(string wkt)
        {
            WKBWriter writer = new WKBWriter();
            WKTReader reader = new WKTReader();
            return writer.Write(reader.Read(wkt));
        }

        public static string ConvertWKBToWKT(byte[] wkb)
        {
            WKTWriter writer = new WKTWriter();
            WKBReader reader = new WKBReader();
            return writer.Write(reader.Read(wkb));
        }

        public static string ConvertGeometryToWKT(IGeometry geometry)
        {
            byte[] b = ConvertGeometryToWKB(geometry);
            WKBReader reader = new WKBReader();
            GeoAPI.Geometries.IGeometry g = reader.Read(b);
            WKTWriter writer = new WKTWriter();
            return writer.Write(g);
        }

        public static IGeometry ConvertWKTToGeometry(string wkt)
        {
            byte[] wkb = ConvertWKTToWKB(wkt);
            return ConvertWKBToGeometry(wkb);
        }

        public static IGeometry ConvertWKBToGeometry(byte[] wkb)
        {
            IGeometry geom;
            int countin = wkb.GetLength(0);
            IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
            factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);
            return geom;
        }


        public static IGeometry ConvertGeoAPIToESRI(GeoAPI.Geometries.IGeometry geometry)
        {
            WKBWriter writer = new WKBWriter();
            byte[] bytes = writer.Write(geometry);
            return ConvertWKBToGeometry(bytes);
        }

        public static GeoAPI.Geometries.IGeometry ConvertESRIToGeoAPI(IGeometry geometry)
        {
            byte[] wkb = ConvertGeometryToWKB(geometry);
            WKBReader reader = new WKBReader();
            return reader.Read(wkb);
        }
    }
}

到了这里,关于Arcgis10.2+pgsql14开发(非SDE版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 邮件服务支持Exchange协议,资产历史账号支持设置保留数量,JumpServer堡垒机v3.10.2 LTS版本发布

    2024年1月22日,JumpServer开源堡垒机正式发布v3.10.2 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和维护,并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS版本,以获得更佳的使用体验。 在v3.10.2 LTS版本中,JumpServer的邮件服务功能新增支持Exchange协议。目

    2024年01月24日
    浏览(38)
  • GitLab-ce版本升级(14.0-14.10)

    GitLab 存在命令注入漏洞,该漏洞源于未经授权的用户可能使用以下命令在服务器上执行任意代码 项目导入功能。以下产品版本受到影响:14.10.5 之前的 14.0、15.0.4 之前的 15.0 和 15.1.1 之前的 15.1 开始的所有版本。 因服务器处于内网环境,使用RPM包进行手动升级 创建备份文件

    2024年02月07日
    浏览(47)
  • 加密货币量化交易系统的设计与实现(0.1最初版本,为了应付毕设的版本)

    注意: 写这个程序的目的是进行加密货币投资理财,但是我刚好要毕业了,需要些毕业设计,所以和导师商量了一下把原本的《基于表情识别的人工智能睡眠质量监测助手》换成了我自己的《加密货币量化交易系统的设计与实现》,这个设计里的后端服务模块(基于springbo

    2024年02月02日
    浏览(55)
  • 字符设备驱动开发(最初方式)

    字符设备是Linux中最基本的一类设备驱动,我们常见的点灯、按键、IIC、SPI、LCD等等都是通过字符设备驱动框架来进行开发的。字符设备驱动是通过一个一个字节流的方式来进行读写操作设备,读写数据是分先后顺序的。 通过空间划分的方式来说,Linux系统中分为用户空间和

    2024年02月17日
    浏览(38)
  • CCS10.2入门(一)

    虽然CCS的历史已经算是很悠久了,但是由于CCS10.2版本比较新,所以资料相对较少,版本不一样,虽然操作接近,但是也有一定的区别。   一般打开是点击project,从这里面import。   点击后,继续点击Browse…选择工程所在的文件夹。   点击选择文件夹后再点击Finishi即可

    2024年02月15日
    浏览(44)
  • 10.2 整流电路

    在分析整流电路时,为了突出重点,简化分析过程,一般均假定负载为纯电阻性;整流二极管为理想二极管,即导通时正向压降为零,截止时反向电流为零;变压器无损耗,内部压降为零等。 分析整流电路,就是弄清电路的工作原理(即整流原理),求出主要参数,并确定整

    2024年02月09日
    浏览(40)
  • 问题 B: C语言10.2

    输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。 三个用空格隔开的整数a、b和c。 按先大后小的顺序输出a、b和c,用空格隔开。 请注意行尾输出换行。

    2023年04月09日
    浏览(45)
  • vs2019+ArcEngine10.2安装教程

    因为毕设要用c#和 ArcGIS Engine二次开发,就重新安装了ArcGIS Engine,网络上只有10.2的版本,不能适配vs2019, 所以就做了vs2019适配ArcGIS Engine10.2的教程。 需要环境: ArcGIS 10.2 下载地址 链接:https://pan.baidu.com/s/1y-mpEfubrDmEwmhhb526Yg 提取码:9271 vs2019 下载地址: Visual Studio 较旧的下载

    2023年04月26日
    浏览(42)
  • cuda10.2安装python3.7pytorch

    1.conda创建虚拟环境 2.激活虚拟环境 3.安装 pytorch 去 pytorch 官网找对应的版本: https://pytorch.org/get-started/previous-versions/ 酷酷下载······

    2024年02月01日
    浏览(40)
  • Windows10系统下YOLOv5配置(Tesla P40 24GB、CUDA10.2) 二、安装

    操作系统:Windows10 显卡: Tesla P40  24GB CUDA版本:10.2 YOLOv5版本:4.0 下载相应版本的CUDA按默认一路安装到底 下载相应版本的cuDNN,解压,将bin中、include中、lib中文件分别复制到CUDA相应安装目录 bin中文件  include中文件  lib中文件 Python Releases for Windows | Python.org The official home

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包