Những ngôn ngữ lập trình nào được sử dụng bởi các nền tảng GIS khác nhau? [đóng cửa]


8

Giả sử một lập trình viên không có kiến ​​thức về GIS, nhưng muốn tận dụng các kỹ năng lập trình của mình để vào được GIS. Vui lòng liệt kê các nền tảng, gói, v.v. khác nhau sử dụng một ngôn ngữ cụ thể.

(Tôi đã suy nghĩ, như đã đề xuất , về việc thực hiện một bài kiểm tra đơn giản về khả năng định dạng mã của StackExchange. Tôi cho rằng điều này có thể được thực hiện trong bối cảnh của một câu trả lời hữu ích.)

Khi bạn trả lời, nếu ngôn ngữ là một trong những ngôn ngữ được liệt kê dưới đây, vui lòng đăng một đoạn mã và kiểm tra định dạng để đảm bảo nó hoạt động. Đây là một đoạn trích từ câu trả lời của Jeff Atwood về meta-stackoverflow .

Thông số kỹ thuật là:

<!-- language: lang-or-tag-here -->

    code goes here

<!-- language: lang-or-tag-here -->

    code goes here

Bạn có thể sử dụng thẻ hoặc mã ngôn ngữ được chỉ định để chỉ định, mặc dù mã ngôn ngữ được làm đẹp luôn được đảm bảo để hoạt động bất kể ngôn ngữ nào thẻ được đặt thành ngôn ngữ.

Sử dụng <!-- language-all: lang-or-tag -->để sử dụng tô sáng đã cho cho tất cả các khối mã sau.

Danh sách đầy đủ các ngôn ngữ mã được hỗ trợ là:

  • lang-không
  • lang-mặc định
  • lang-bsh
  • lang-c
  • lang-cpp
  • lang-cs
  • lang-csh
  • lang-css
  • lang-hs
  • lang-html
  • lang-java
  • lang-js
  • lang-lisp
  • lang-lua
  • lang-ml
  • lang-perl
  • lang-php
  • lang-py
  • lang-proto
  • lang-rb
  • lang-scala
  • lang-sh
  • lang-sql
  • lang-vb
  • lang-xml

Câu trả lời:


11

Một số ngôn ngữ kịch bản không gian địa lý:

1) Con trăn / Jython

Python / Jython một mình:

Python và Jython có thể được sử dụng một mình để xử lý dữ liệu không gian địa lý mà không cần bất kỳ phần mềm nào, sử dụng các mô-đun như osgeo (GDAL / OGR), PySAL, Shapely, Fiona, Pyshp, ..., xem Chỉ mục gói Python, Chủ đề: GIS hoặc Geoscript (Jython) . Có nhiều ví dụ về GST

như ngôn ngữ kịch bản trong các ứng dụng

QGIS, GRASS GIS, GvSIG, OpenJump hoặc Geoserver (và ArcGIS, xem ở trên) sử dụng Python / Jython để viết kịch bản:

  • Quantum GIS ( Python , 1.8, thay đổi trong phiên bản chính)
from qgis.core import *
layer = qgis.utils.iface.activeLayer()
for elem in layer.selectedFeatures():
        geom= elem.geometry()
        attrs = elem.attributeMap()
  • GRASS GIS ( Python )
from grass.script import raster as grassr
grassr.raster_info('s_newfrst3@moi')
{'north':118869.900569, 'timestamp': '"none"', 'min': -456.08587646484398,
'datatype': 'FCELL', 'max': 265.500732421875, 'ewres':
 14.008076920000001, 'vertical_datum': '', 'west': 164160.653425,
 'units': '', 'title': ' (s_newfrst3)', 'east': 176641.849961, 'nsres':
  13.976472729999999, 'south': 112552.534895}
  • GvSIG ( Jython )
from gvsig import *
layer = currentLayer()
features = layer.features()
for feature in features:
  geom = feature.geometry()
  values = feature.getValues()
  • OpenJump ( Jython )
from org.openjump.util.python.JUMP_GIS_Framework import *
layer = getSelectedLayers()
for i in layer.iterator():
    print layer.name  
# first element of the layer
fc = layer[0].featureCollectionWrapper
for elem in range(fc.size):
    obj = fc.features[elem] 
    geom = obj.getGeometry()
  • Máy chủ địa lý ( Jython )
from geoserver import Catalog
cat = Catalog('aff_geol')
print cat.stores()
[u'affleurements', u'cartes']
st = cat['affleurements']
print st.layers()
[u'affs']
l = st['affs']
print l.count()
3214
print l.bounds()
(107206.74,148102.45,114110.46,157514.40, EPSG:31370)

và bạn cũng có thể sử dụng các thư viện Java khác như Java Topology Suite ( Jython ):

import sys
sys.path.append('.../jts-1.8.0/lib/jts-1.8.jar')   
from com.vividsolutions.jts.geom import Point

2) Bash

GRASS GIS sử dụng Bash (shell và script (.sh))

GRASS 6.4.2 (geol):~ > v.out.ascii in=ligneprofil format=standard | grep '^ '|\r.profile -c in=MNT res=30 output=profil.pts

3) R (không có ngôn ngữ mã chỉnh sửa)

Bạn có thể sử dụng R cho tất cả các phương pháp điều trị không gian địa lý, xem CRAN Nhiệm vụ xem: Phân tích dữ liệu không gian :

library(maptools)
geol <-readShapePoly("cal.shp")
library(rgdal)
geol = readOGR(dsn=".", layer="cal")
library(PBSmapping)
geol = importShapefile("cal.shp")
library(shapefiles)
geol <- read.shapefile("cal")
# PostGIS
geol = readOGR("PG:dbname=test", "cal")

nhưng GRASS GIS cũng có thể sử dụng R trực tiếp:

GRASS 6.4.2 (geol):~ > R
R version ....
> library(spgrass6) 
> G <- gmeta6() # paramètres de Grass, région etc.
> montrait <- readRAST6(c("geologie", "mnt"),cat=c(TRUE, FALSE),  ignore.stderr=TRUE,plugin=NULL)

4) BeanShell (Java)

OpenJump cũng có thể sử dụng Beanshell (bảng điều khiển hoặc tập lệnh)

layer = wc.layerManager .getLayer("road").featureCollectionWrapper;
getLongest() {
    max = -1;
    for (f : layer.features) { length = f.geometry.length; if (f.geometry.length > max) {max = length; result = f;}
}
return result;
print(getLongest().ID);

5) Groovy (Java), Scala và JavaScript

Bạn có thể sử dụng các ngôn ngữ này với GeoScript, xem các ví dụ

6) Ngôn ngữ truy vấn JEQL

Như thể hiện bởi Martin Davis ( nhãn jeql )

shapefileReader t file: "agder/agder_buffer.shp";
t = select geomUnionMem(GEOMETRY) g from t;
ShapefileWriter t file: "result.shp";

6

GIS trường cũ không có máy tính. lang-không

    Overlay acetate on paper maps, buffer with rulers,
    symbolize with dry-erase markers.
    No computers, so no language needed.

3

C # có thể được sử dụng để lập trình ArcGIS. Với ArcObjects, điều này liên quan đến việc xử lý rất nhiều COM interop, vì vậy mọi kiến ​​thức ở đó sẽ rất hữu ích.

C # cũng có thể được sử dụng (mà không phải xử lý nhiều can thiệp) trong ArcGIS cho WPF và ArcGIS cho Silverlight SDK.

public static IPolyline MakePolyline(IPoint p1, IPoint p2)
{
    var polyline = new PolylineClass() as IPolyline;
    ((IZAware)polyline).ZAware = true;
    ((IMAware)polyline).MAware = true;
    polyline.SpatialReference = p1.SpatialReference;
    ((IPointCollection)polyline).AddPoint(p1);
    ((IPointCollection)polyline).AddPoint(p2);
    return polyline;
}

3

Rất nhiều sự phát triển WebGIS được thực hiện thông qua JavaScript. Dưới đây là một số mã mẫu sử dụng OpenLayers:

        var lon = 5;
        var lat = 40;
        var zoom = 5;
        var map, layer;

        function init(){
            map = new OpenLayers.Map( 'map' );
            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
            map.addLayer(layer);

            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
            map.addControl( new OpenLayers.Control.LayerSwitcher() );
        }

3

ArcGIS kể từ 10.0 sử dụng Python thông qua arcpymô-đun.

Sử dụng Python đi kèm với ArcGIS:

import arcpy

# Make dictionary of lookup table
dictCityProvince = {}
rows = arcpy.SearchCursor(r"C:\temp\test.gdb\CityProvinceLookup")
for row in rows:
    dictCityProvince[row.CITY] = row.PROVINCE
del row,rows

Nếu điều này làm việc, thì bạn nên đi.


1

Phát triển cho Nền tảng Android được thực hiện bằng Java.

Đây là một số mã từ dự án OsmDroid:

/**
 * Logs all Location-changes to <code>mRouteRecorder</code>.
 *
 * @author plusminus
 */
private class SampleLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(final Location loc) {
        if (loc != null) {
            if (SampleMapActivity.this.mDoGPSRecordingAndContributing)
                SampleMapActivity.this.mRouteRecorder.add(loc,
                        SampleMapActivity.this.mNumSatellites);

            SampleMapActivity.this.onLocationChanged(loc);
        } else {
            SampleMapActivity.this.onLocationLost();
        }
    }

1

Rất nhiều dự án được phát triển trong C ++.

Đây là một số mã nguồn từ QGis:

/**
  Open the specified project file; prompt to save previous project if necessary.
  Used to process a commandline argument or OpenDocument AppleEvent.
  */
void QgisApp::openProject( const QString & fileName )
{
  // possibly save any pending work before opening a different project
  if ( saveDirty() )
  {
    // error handling and reporting is in addProject() function
    addProject( fileName );
  }
  return ;
}

0

C có thể được sử dụng với các API ArcSDE C .

Tôi thấy rằng nó có thể được tải xuống cho 10.1 tại đây , nhưng không được đề cập trong danh sách API trên trang trợ giúp . Tôi không thấy bất kỳ trợ giúp trực tuyến nào cho 10.1, chỉ trợ giúp 10.0 .

void check_rc_(SE_CONNECTION Connection, SE_STREAM Stream, LONG rc, 
                 char *comment, LONG line_no, char* file_name) ;
static LONG S_create_layer (SE_CONNECTION connection, CHAR *table,CHAR *keyword,LONG precision);
static LONG S_point_cases(SE_CONNECTION connection,const CHAR* table);
static LONG S_line_cases(SE_CONNECTION connection,const CHAR* table);
static LONG S_polygon_cases(SE_CONNECTION connection,const CHAR* table);

LONG  main(int argc, char *argv[]){
    CHAR            *server, 
                    *user, 
                    *passwd, 
                    *database,
                    *instance,
                    *rslt_layer_name;
    SE_CONNECTION   conn;
    SE_ERROR        error;
    LONG            result;
    BOOL            all_step_passed=TRUE;

    if(argc<7){
        printf("usage: %s <server> <instance> <database> <user> <passwd> <result_layer>",argv[0]);
        exit(1);
    }

    server=argv[1];
    instance=argv[2];
    database=argv[3];
    user=argv[4];
    passwd=argv[5];
    rslt_layer_name=argv[6];

    printf("\nConnecting to SDE server %s:%s as %s\n",server,instance,user);
    result = SE_connection_create( server, instance, database, user, passwd, &error, &conn );
    check_rc_return_on_failure(conn,NULL,result,"SE_connection_create");
    printf("\t---Connected");

    /*Create a layer to store results*/
    printf("\n\nCreating a layer to store results......\n");
    result=S_create_layer (conn,rslt_layer_name,"DEFAULTS",64);
    if(result!=SE_SUCCESS)
        return result;
    else
        printf("\tLayer %s created.\n",rslt_layer_name);

    /*point shapes*/
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for point shapes......                                *\n");
    printf("***************************************************************************\n");
    result=S_point_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    /* line shapes */
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for line shapes......                                 *\n");
    printf("***************************************************************************\n");
    result=S_line_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    /* polygon shapes */
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for polygon shapes......                              *\n");
    printf("***************************************************************************\n");
    result=S_polygon_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    SE_connection_free(conn);

}

0

Ngôn ngữ lập trình

Sub SelectByBufferedLine()
    Dim xy As String
    xy = InputBox("Enter x,y coordinates for line in metres. x1,y1 x2,y2 ...xn,yn e.g. 200000,200000 250000,200000 280000,250000", "Select by buffered line (keyboard input)")
    If (xy = "") Then Exit Sub
    xy = Replace(xy, " ", ",")
    xy = Replace(xy, ",,", ",")
    Dim arr As Object
    arr = Split(xy, ",")
    Dim numvals As Integer, n As Object
    numvals = (UBound(arr, 1) - LBound(arr, 1)) + 1
    If (numvals < 4) Or ((numvals Mod 2) <> 0) Then Exit Sub
    For Each n In arr
        If (Not IsNumeric(n)) Then Exit Sub
    Next
    '
    ' Create polyline from array of x,y's
    '
    Dim pt As IPoint
    pt = New Geometry.Point
    Dim pGeometry As IGeometry
    pGeometry = New Polyline
    Dim thePointCollection As IPointCollection
    thePointCollection = pGeometry
    Dim i As Long
    For i = LBound(arr, 1) To UBound(arr, 1) - 1 Step 2
        pt.PutCoords(arr(i), arr(i + 1))
        thePointCollection.AddPoint(pt)
    Next
    '
    ' Buffer the line
    '
    Dim topoOP As ITopologicalOperator
    Dim theBufferPoly As IPolygon
    topoOP = pGeometry
    topoOP.Simplify()
    Dim bufdist As String
    bufdist = InputBox("Enter buffer distance(m)", "Select by buffered line", 0)
    If (Not IsNumeric(bufdist)) Then Exit Sub
    theBufferPoly = topoOP.Buffer(bufdist)
    pGeometry = theBufferPoly
    '
    ' Query the Active Layer
    '
    Call SpatialQuery(My.ArcMap.Application, pGeometry)
    '
    ' Set Visible Extent
    '
    Dim pDoc As IMxDocument = My.ArcMap.Document
    Dim theExtent As IEnvelope
    theExtent = pGeometry.Envelope
    theExtent.Expand(2, 2, True)
    pDoc.ActiveView.Extent = theExtent
    pDoc.ActiveView.Refresh()
End Sub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.