¿Qué lenguajes de programación utilizan las diferentes plataformas SIG? [cerrado]

8

Supongamos que un programador no tiene conocimiento de SIG, pero quiere aprovechar sus habilidades de programación para ingresar a SIG. Enumere las diferentes plataformas, paquetes, etc. SIG que usan un idioma en particular.

(Estaba pensando, como se sugirió , en hacer una prueba simple de la capacidad de formateo de código de StackExchange. Me imagino que esto podría hacerse en el contexto de una respuesta útil).

Cuando responda, si el idioma es uno de los que se enumeran a continuación, publique un fragmento de código y pruebe el formato para asegurarse de que funciona. Aquí hay un extracto de la respuesta de Jeff Atwood sobre meta-stackoverflow .

La especificación es:

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

    code goes here

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

    code goes here

Puede usar una etiqueta o un código de idioma de prettify para especificar, aunque siempre se garantiza que los códigos de idioma de prettify funcionarán independientemente del idioma en el que esté configurada la etiqueta.

Use <!-- language-all: lang-or-tag -->para usar el resaltado dado para todos los siguientes bloques de código.

La lista completa de idiomas de código de prettify compatibles es:

  • lang-none
  • lang-default
  • 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
desconocido
fuente

Respuestas:

11

Algunos lenguajes de script geoespaciales:

1) Python / Jython

Python / Jython solo:

Python y Jython se pueden usar solos para procesar datos geoespaciales sin ningún software, utilizando módulos como osgeo (GDAL / OGR), PySAL, Shapely, Fiona, Pyshp, ..., consulte el Índice del paquete de Python, Tema: GIS o Geoscript (Jython) . Hay muchos ejemplos sobre GST

como lenguaje de script en aplicaciones

QGIS, GRASS GIS, GvSIG, OpenJump o Geoserver (y ArcGIS, ver arriba) usan Python / Jython para la secuencia de comandos:

  • Quantum GIS ( Python , 1.8, cambios en la versión maestra)
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()
  • GeoServer ( 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)

y también puede usar otras bibliotecas de Java como 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 utiliza Bash (shell y scripts (.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 (sin lenguaje de código de prettify)

Puede usar R para todos los tratamientos geoespaciales, consulte Vista de tareas CRAN: Análisis de datos espaciales :

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")

pero GRASS GIS también puede usar R directamente:

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 también puede usar Beanshell (consola o script)

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 y JavaScript

Puedes usar estos lenguajes con GeoScript, ver ejemplos

6) Lenguaje de consulta JEQL

Como lo muestra Martin Davis ( etiqueta jeql )

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

SIG de la vieja escuela sin computadoras. lang-none

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

C # se puede usar para programar ArcGIS. Con ArcObjects, esto implica lidiar con una gran cantidad de interoperabilidad COM, por lo que cualquier conocimiento allí sería muy útil.

C # también se puede usar (sin tratar con mucha interoperabilidad) en ArcGIS for WPF y ArcGIS for 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;
}
Kirk Kuykendall
fuente
3

Gran parte del desarrollo de WebGIS se realiza a través de JavaScript. Aquí hay un código de muestra usando 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() );
        }
Devdatta Tengshe
fuente
3

ArcGIS desde 10.0 usa Python a través del arcpymódulo.

Usando el Python que viene con 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

Si esto funciona, entonces deberías estar listo.

Eric Brown
fuente
1

El desarrollo de la plataforma Android se realiza utilizando Java.

Aquí hay un código del proyecto 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();
        }
    }
Devdatta Tengshe
fuente
1

Se desarrollan muchos proyectos en C ++.

Aquí hay un código fuente de 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 ;
}
Devdatta Tengshe
fuente
0

C se puede usar con ArcSDE C API .

Veo que se puede descargar para 10.1 aquí , pero no se menciona en la lista de API en la página de ayuda . No veo ninguna ayuda en línea para 10.1, solo ayuda 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);

}
Kirk Kuykendall
fuente
0

Visual Basic

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
nmtoken
fuente