起因:最初采用SDE和pgsql11開發(fā),后因數(shù)據(jù)庫升級到pgsql14,sde因和pgsql版本不般配,無法導入要素數(shù)據(jù)和顯示數(shù)據(jù),數(shù)據(jù)庫升級又是必然,所以只能另外找解決方案。
參考資料:Spatial Database for Postgres and ArcGis users: how to choose
附加:zigGis, GDAL。傳說中的zigGis相當牛,能直接將postgis中的GIS類型顯示到ArcGis的控件中,但是版本又比較復雜,也有可能會設計到版本不般配問題,后期我再看看這方面的知識體系。
Pgsql+postgis使用:PostgreSQL+PostGIS的使用(轉載) - 無痕客 - 博客園
PostGIS教程一:PostGIS介紹 - 知乎
實現(xiàn)步驟:
在postgis中提供很多函數(shù)將wkb轉成它的geometry類型,同樣也有將geometry轉成binary的函數(shù)。當然更興奮的是ArcGis中有針對標準wkb的轉換,這樣一來,可想而知,這個方案是行的通的。
第一步:從postgreSQL中通過postgis讀取GIS數(shù)據(jù)顯示在AxMapControl中
1. C# 連接數(shù)據(jù)庫pg
注意點:?要注意的是因為ArcEngine中對wkb的支持是byte[]之間的轉換,所以在進行數(shù)據(jù)庫取數(shù)據(jù)時用postgis的這個函數(shù)將GIS數(shù)據(jù)轉成byte[],這樣寫 asbinary(the_geom)
2. 將得到的byte[](也就是wkb數(shù)據(jù))通過ArcEngine的接口得到IGeometry,如下所示:
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
?factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);
3. 將 IGeometry 顯示在AxMapControl中。
第二步:將上一步從pg中顯示出來的GIS數(shù)據(jù)進行相應的修改后保存回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[]數(shù)組轉碼
??? 其實postgis處理存到pg中的是一長串的16進制字符串,相信大家打開數(shù)據(jù)庫能看到,要想拼接好SQL串就得這樣來一下:geomfromwkb(decode('" + geoByteStr + "', 'hex'))其中的geoByteStr是byte[]轉成16進制的字串
上面兩步已走通,是完全可以實現(xiàn)的,這樣做的話,數(shù)據(jù)表我們也能自行定義,操作GIS數(shù)據(jù),屬性等,更靈活。
完整代碼
一、讀取數(shù)據(jù)庫代碼并且顯示
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之后再保存進入數(shù)據(jù)庫
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數(shù)據(jù)庫文章來源:http://www.zghlxwxcb.cn/news/detail-469285.html
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轉換文章來源地址http://www.zghlxwxcb.cn/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開發(fā)(非SDE版本)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!