读取shp的几何坐标

// gdal_sample.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "gdal_version.h"
#include "gdal_priv.h"
#include "gdal.h"
#include <iostream>
#include "ogrsf_frmts.h"
#include "ogrsf_frmts/shape/ogrshape.h"

#define DYZ_DEBUG_SWITCH "ON"
#if 1
#define DYZ_TEST_FILE_PATH  "D:\\code\\gdal-2.3.0\\x64\\Debug\\"
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "jiaju.shp"
#else
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "jiaju.shp"
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "shoudongjiaju.dxf"
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "renwutu.dxf"
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "wolunxiang.dwg"
#endif

int main()
{
    GDALAllRegister();

    CPLSetConfigOption("CPL_DEBUG", DYZ_DEBUG_SWITCH);
    CPLSetConfigOption("GDAL_DATA", DYZ_TEST_FILE_PATH);
    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
    CPLSetConfigOption("SHAPE_ENCODING", "CP936");

    GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
    //GDALDataset* cInDS = GDALDataset::FromHandle(hInDS);
    OGRShapeDataSource* cInDS = (OGRShapeDataSource*)(hInDS);
    if (NULL == cInDS)
    {    
        return -1;
    }

    const char* pcDrvName = cInDS->GetDriverName();
    if (NULL != pcDrvName)
    {
        std::cout << "Driver Name:" << pcDrvName  << std::endl;
    }

    int nLayerCnt = cInDS->GetLayerCount();
    int nLayerIdx = 0;
    for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
    {
        OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
        GIntBig nFtrCount = curLayer->GetFeatureCount();

        if (NULL != curLayer->GetName())
        {
            std::cout << curLayer->GetName() << " 's FeatureCount :" << nFtrCount << std::endl;
        }
        OGRFeature * ftr = curLayer->GetNextFeature();
        while (ftr)
        {
            OGRGeometry * poGeom = ftr->GetGeometryRef();
            switch (wkbFlatten(poGeom->getGeometryType()))
            {
                case wkbPoint:
                case wkbPoint25D:
                {
                    OGRPoint* poPS = poGeom->toPoint();
                    double dfDeltaX = poPS->getX();
                    double dfDeltaY = poPS->getY();
                }
                break;
                case wkbLineString:
                {
                    OGRLineString* poLS = static_cast<OGRLineString*>(poGeom);
                    const  char* pGeoName = poLS->getGeometryName();
                    if (NULL != pGeoName)
                    {
                        std::cout << " Geo name:" << pGeoName << std::endl;
                    }
                    int iPnum = poLS->getNumPoints();
                    std::cout << " Point Count:" << iPnum;
                    double iLen = poLS->get_Length();
                    std::cout << " Len :" << iLen;
                    for (int i = 0; i < iPnum;i++)
                    {
                        double dfX = poLS->getX(i);
                        double dfY = poLS->getY(i);
                        std::cout << " X : " << dfX << " , Y : " << dfY;
                    }
                    std::cout << std::endl;
                }
                break;
                case wkbPolygon:
                {
                    OGRPolygon* poPoly = static_cast<OGRPolygon*>(poGeom);
                    for (int i = 0; i < poPoly->getNumInteriorRings();i++)
                    {
                        poPoly->getInteriorRing(i);
                    }
                }
                break;
                case wkbMultiPolygon:
                {
                    OGRMultiPolygon* poMP = static_cast<OGRMultiPolygon*>(poGeom);
                    for (int i = 0; i < poMP->getNumGeometries();i++)
                    {
                        poMP->getGeometryRef(i);
                    }
                }
                break;
                default:
                    break;
            }
            
            ftr = curLayer->GetNextFeature();
        }

        //delete curLayer;
    }

    GDALClose(hInDS);

    return 0;
}


### 实现 SHP 文件坐标转换 在 JavaScript 中实现 SHP 文件的坐标转换通常依赖于特定的地理空间处理库。以下是几种常用的方法和库: #### 使用 Proj4js 库进行坐标系转换 Proj4js 是一个广泛使用的开源库,专门用于执行各种投影变换操作。 ```javascript // 加载 proj4.js 和 shpjs.js 脚本文件之后使用如下代码 proj4.defs("EPSG:4326","+title=WGS 84 +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"); proj4.defs("EPSG:3857","+title=WGS 84 / Pseudo-Mercator"); function transformCoordinates(coordinates) { const transformedCoords = coordinates.map(coord => proj4('EPSG:4326', 'EPSG:3857', coord)); return transformedCoords; } ``` 此函数 `transformCoordinates` 将输入坐标的 EPSG:4326 投影转换为 Web Mercator (EPSG:3857)[^1]。 #### 利用 ShpJs 处理 Shapefile 并结合 GeoTools 进行转换 ShpJs 可以读取并解析 shapefiles 数据,在此基础上可进一步利用 geotools 或类似的工具来进行更复杂的几何运算以及坐标系统的转换工作[^3]。 ```javascript shp("./path/to/your/file.zip").then(function(geojson){ console.log(JSON.stringify(geojson)); // 输出 GEOJSON 对象 // 假设 geojson.features[i].geometry.coordinates 存储着要被转换的数据点集 let coords = geojson.features[0].geometry.coordinates; // 执行实际的坐标转换逻辑... }); ``` 需要注意的是,上述例子仅展示了基本概念;具体实施细节取决于应用程序的具体需求和技术栈的选择。 #### 结合 ArcGIS API for JavaScript 的 GeometryService 类 ArcGIS 提供了一个强大的服务类 GeometryService 来帮助开发者完成多种类型的几何计算任务,其中包括重新投影功能[^2]。 ```javascript require(["esri/tasks/GeometryService"], function(GeometryService) { var geometryService = new GeometryService("https://utility.arcgisonline.com/ArcGIS/rest/services/Utilities/Geometry/GeometryServer"); geometryService.project([inputPoint], outSpatialReference).then( function(projectedPoints){ /* 成功后的回调 */ }, function(errorInfo){ /* 错误处理 */ } ); }); ``` 这段代码片段说明了如何通过调用远程的服务接口来异步获取经过重投影的结果集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值