<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Boris</id>
	<title>GIS-Lab - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Boris"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Boris"/>
	<updated>2026-04-03T20:50:52Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_ogr2ogr&amp;diff=26733</id>
		<title>Примеры использования ogr2ogr</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_ogr2ogr&amp;diff=26733"/>
		<updated>2021-06-23T14:26:54Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Опубликована|ogr2ogr-examples}}&lt;br /&gt;
{{Аннотация|Перечь примеров для справки}}&lt;br /&gt;
&lt;br /&gt;
С библиотекой gdal поставляется утилита ogr2ogr, предназначнная для конвертации векторных данных. В данной статье приводятся примеры использования этой утилиты.&lt;br /&gt;
&lt;br /&gt;
[http://www.gdal.org/index.html GDAL/OGR] - библиотека для работы с географическими форматами данных. GDAL представляет собой набор утилит для обработки растровых данных, в то время, как OGR предназначена для работы с векторными форматами. В статье рассматриваются некоторые практические примеры применения одной из утилит этой библиотеки: программы ogr2ogr. Примеры использования утилит для растровых данных приводятся в [http://gis-lab.info/qa/gdal-examples.html другой статье].&lt;br /&gt;
&lt;br /&gt;
== Общие сведения ==&lt;br /&gt;
&lt;br /&gt;
Программа ogr2ogr предназначена для конвертации векторных данных из одного формата в другой. Поддерживаемые форматы и используемые ключи можно узнать просто набрав в коммандной строке&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате будет получена справка по использованию этой программы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr [--help-general] [-skipfailures] [-append] [-update] [-gt n]&lt;br /&gt;
               [-select field_list] [-where restricted_where]&lt;br /&gt;
               [-sql ]&lt;br /&gt;
               [-spat xmin ymin xmax ymax] [-preserve_fid] [-fid FID]&lt;br /&gt;
               [-a_srs srs_def] [-t_srs srs_def] [-s_srs srs_def]&lt;br /&gt;
               [-f format_name] [-overwrite] [[-dsco NAME=VALUE] ...]&lt;br /&gt;
               [-segmentize max_dist]&lt;br /&gt;
               dst_datasource_name src_datasource_name&lt;br /&gt;
               [-lco NAME=VALUE] [-nln name] [-nlt type] [layer [layer ...]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также список поддерживаемых форматов (список может отличаться как в большую, так и в меньшую сторону, поскольку зависит от того, были ли подключены/отключены соответствующие модули при компиляции программы):&lt;br /&gt;
&lt;br /&gt;
*ESRI Shapefile&lt;br /&gt;
*MapInfo File&lt;br /&gt;
*TIGER&lt;br /&gt;
*S57&lt;br /&gt;
*DGN&lt;br /&gt;
*Memory&lt;br /&gt;
*BNA&lt;br /&gt;
*CSV&lt;br /&gt;
*GML&lt;br /&gt;
*GPX&lt;br /&gt;
*KML&lt;br /&gt;
*GeoJSON&lt;br /&gt;
*Interlis 1&lt;br /&gt;
*Interlis 2&lt;br /&gt;
*GMT&lt;br /&gt;
*SQLite&lt;br /&gt;
*ODBC&lt;br /&gt;
*PostgreSQL&lt;br /&gt;
*MySQL&lt;br /&gt;
*Geoconcept&lt;br /&gt;
&lt;br /&gt;
==Специфика работы с кириллицей==&lt;br /&gt;
&lt;br /&gt;
Чтобы ogr2ogr корректно работал с файлами в названии которых есть кириллица, необходимо, перед выполнением команд установить переменную среды:&lt;br /&gt;
&amp;lt;pre&amp;gt;SET GDAL_FILENAME_IS_UTF8=OFF&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если исходные данные в кодировке UTF-8, то необходимо явным образом указывать, что выходные данные также будут в UTF-8, с помощью опции &amp;lt;code&amp;gt;-lco ENCODING=UTF-8&amp;lt;/code&amp;gt;, например:&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -lco ENCODING=UTF-8 output.shp input.vrt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Использование конфигурационных опций==&lt;br /&gt;
Для ряда форматов через конфигурационные опции можно задать дополнительные настройки. Так, например, для формата SXF можно указать местоположение классификатора (файл RSC). Конфигурационные опции можно задавать через переменные окружения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;export SXF_RSC_FILENAME=map50.rsc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или в командной строке утилит (использование RSC из файла с другим именем):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo --config SXF_RSC_FILENAME map50.rsc N-36-045.sxf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
несколько опций задаются каждая со своим ключём (использование RSC из файла с другим именем и полные названия слоёв):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo --config SXF_RSC_FILENAME map50.rsc --config SXF_LAYER_FULLNAME TRUE N-36-045.sxf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Конвертация==&lt;br /&gt;
&lt;br /&gt;
В примерах ниже будет использоваться shape-файл [http://gis-lab.info/data/topogrid/topo2km-rus.7z topo2km-rus.shp] со следующими характеристиками:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Layer name: topo2km-rus&lt;br /&gt;
Geometry: Polygon&lt;br /&gt;
Feature Count: 10368&lt;br /&gt;
Extent: (-180.000000, 36.000000) - (180.000000, 88.000000)&lt;br /&gt;
Layer SRS WKT:&lt;br /&gt;
GEOGCS[&amp;quot;GCS_Pulkovo_1942&amp;quot;,&lt;br /&gt;
    DATUM[&amp;quot;Pulkovo_1942&amp;quot;,&lt;br /&gt;
        SPHEROID[&amp;quot;Krasovsky_1940&amp;quot;,6378245.0,298.3]],&lt;br /&gt;
    PRIMEM[&amp;quot;Greenwich&amp;quot;,0.0],&lt;br /&gt;
    UNIT[&amp;quot;Degree&amp;quot;,0.0174532925199433]]&lt;br /&gt;
HEMISPHERE: String (1.0)&lt;br /&gt;
INDEXROMAN: String (21.0)&lt;br /&gt;
INDEXNUM: String (12.0)&lt;br /&gt;
UNIQUE: String (25.0)&lt;br /&gt;
ZONE: String (1.0)&lt;br /&gt;
I10KM: Integer (4.0)&lt;br /&gt;
I10KMZSTR: String (2.0)&lt;br /&gt;
INDEXFULL: String (50.0)&lt;br /&gt;
I2KM: Integer (4.0)&lt;br /&gt;
I2KMZSTR: String (50.0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Конвертировать ESRI Shapefile в формат MapInfo TAB можно следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; topo2km-rus.tab topo2km-rus.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате в текущем каталоге появится 4 файла topo2km-rus.* --- результат конвертации.&lt;br /&gt;
&lt;br /&gt;
Теперь конвертируем только некоторые объекты из файла topo2km-rus (в поле ZONE которых содержится строка &amp;quot;s&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; -where &amp;quot;ZONE=s&amp;quot;  topo2km-rus.tab topo2km-rus.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аналогично можно воспользоваться параметрами:&lt;br /&gt;
     &lt;br /&gt;
-select для выбора определенных полей таблицы атрибутов. Например скопировать набор данных убрав все поля кроме name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f GeoJSON -select name output.geojson input.geojson&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#-spat для выбора объектов, лежащих в определенных пространственных границах&lt;br /&gt;
&lt;br /&gt;
Конвертация из CSV в shape-файл и обратно подробно рассмотрена в [http://gis-lab.info/qa/csv2shp.html отдельной статье].&lt;br /&gt;
&lt;br /&gt;
==Работа с комплексными наборами данных==&lt;br /&gt;
Существуют форматы позволяющие хранить несколько слоёв с разными геометриями. Например SXF. Для экстракции всех слоёв в формат ESRI Shape в качестве цели указывается папка, а не имя файла:&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr output_dir input.sxf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Адресация конкретного слоя в таких наборах данных из нескольких слоёв адресация каждого слоя в этом случае осуществляется через пробел, например:&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr output_dir input.sxf layer_name&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Конвертация из форматов не ограниченных по типу геометрии==&lt;br /&gt;
&lt;br /&gt;
Для форматов, которые позволяют хранить в одном слое сразу несколько типов геометрий нужен нестандартный подход, так, чтобы конвертировать MIF/MID в формат ESRI Shape нужно указать тип геометрии, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -skipfailures input_POINT.shp input.mif -nlt &amp;quot;POINT&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или, чтобы получить все типы геометрий, можно использовать цикл (Windows):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for %n in (POINT POLYGON) do ogr2ogr -skipfailures output_%n.shp input.mif -nlt &amp;quot;%n&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этот подход может не подойти, так как при конвертации может происходить конвертация типов геометрии, что приведет к появлению копии данных с другой геометрией. Например, такая команда: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt &amp;quot;LINESTRING&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Приведет к созданию линейного shape-файла, несмотря на то, что в исходном файле вообще может не быть линий, а только полигоны. Следует отметить, что преобразования между одинаковыми типами с составными объектами, наоборот, не произойдет. Т.е. MULTILINESTRING не переведется в LINESTRING, а MULTIPOLYGON в POLYGON.&lt;br /&gt;
&lt;br /&gt;
В связи с этим, более правильным подходом будет явным образом указать тип данных через -sql запрос, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -skipfailures output_LINESTRING.shp input.mif -nlt &amp;quot;LINESTRING&amp;quot; -sql &amp;quot;SELECT * FROM Input WHERE OGR_GEOMETRY='LINESTRING'&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полностью обработать данные для всех файлов с определенным расширением и всех типов геометрии можно так (цикл для командного интерпретатора Windows):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for %i in (*.mif) do for %n in (POINT LINESTRING POLYGON MULTIPOLYGON MULTIPOINT MULTILINESTRING) do ogr2ogr -skipfailures %~ni_%n.shp %i -nlt &amp;quot;%n&amp;quot; -sql &amp;quot;SELECT * FROM '%~ni' WHERE OGR_GEOMETRY='%n'&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае если в исходнике нет линий, то они не будут сконвертированы из полигонов, будет создан пустой shape-файл.&lt;br /&gt;
&lt;br /&gt;
== Использование OGR SQL ==&lt;br /&gt;
===Выборка===&lt;br /&gt;
Можно построить и более сложные условия для выборки данных с помощью [http://www.gdal.org/ogr_sql.html OGR SQL] и параметра &amp;quot;-sql&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Выбрать при конвертации только объекты из таблицы &amp;quot;topo2km-rus&amp;quot;, поле ZONE которых содержит 'PERVOMAYSK'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; -sql &amp;quot;SELECT * FROM topo2km-rus WHERE ZONE='PERVOMAYSK'&amp;quot; topo2km-rus.tab topo2km-rus.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выбрать отдельные поля в определённом порядке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; topo2km-rus.tab topo2km-rus.shp -sql &amp;quot;SELECT I2KMZSTR, I2KM, INDEXNUM FROM topo2km-rus)&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выбрать и переименовать &amp;quot;на лету&amp;quot; отдельные поля в таблице&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; topo2km-rus.tab topo2km-rus.shp -sql &amp;quot;SELECT I2KMZSTR AS 'i2kmzstr', I2KM AS '2km', INDEXNUM FROM topo2km-rus&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сменить тип поля &amp;quot;на лету&amp;quot; у выбранных полей (можно совмещать смену полей с их переименованием)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; topo2km-rus.tab topo2km-rus.shp -sql &amp;quot;SELECT CAST (I10KM AS CHARACTER(4)), CAST (I2KM AS FLOAT) FROM topo2km-rus)&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что в SQL запросы не будут выполнены если в названиях файлов содержатся пробелы, знаки -. В этом случае название файла нужно брать в одинарные кавычки.&lt;br /&gt;
&lt;br /&gt;
Значительно упростить команду можно использовав вместо ключа -sql ключ -where, его использование делает ненужным указание конструкции &amp;lt;code&amp;gt;SELECT * FROM 'filename' WHERE&amp;lt;/code&amp;gt;. Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -skipfailures output_MULTIPOINT.shp input.MIF -nlt &amp;quot;MULTIPOINT&amp;quot; -where &amp;quot;OGR_GEOMETRY='MULTIPOINT'&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
вместо:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -skipfailures output_MULTIPOINT.shp input.MIF -nlt &amp;quot;MULTIPOINT&amp;quot; -sql &amp;quot;SELECT * FROM input WHERE OGR_GEOMETRY='MULTIPOINT'&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание:&lt;br /&gt;
&lt;br /&gt;
* что в паре &amp;lt;fieldname&amp;gt;=&amp;lt;значение&amp;gt;, если значение - строка, то она должна браться в одинарные кавычки, как в примере выше, т.е.: -where &amp;quot;HIGHWAY = 'motorway'&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* после FROM требуется указать название таблицы и здесь может идти как название слоя (для ESRI Shape) так и, что-то иное для форматов с гибридными геометриями, например OGRGeoJSON (для GeoJSON).&lt;br /&gt;
&lt;br /&gt;
При выборке можно производить проверку значений на предмет равенства или неравенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -sql &amp;quot;SELECT * FROM %~ni WHERE field1 NOT IN (0,12,13,15,16,254,255) AND field2 != -1&amp;quot; output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя диалект SQLITE можно производить выборку определенного количества случайных точек:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -sql &amp;quot;SELECT * FROM input WHERE field1 NOT IN (0,12,13,15,16,254,255) AND field2 != -1 ORDER BY RANDOM() LIMIT 10000&amp;quot; -dialect SQLITE output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Работа с полями и значениями ===&lt;br /&gt;
Добавить поле можно следующим образом (нового слоя не создаётся):&lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo input.shp -sql &amp;quot;ALTER TABLE input ADD COLUMN newfield integer(3)&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно добавить значение в существующее поле, то нужна команда UPDATE, но она не поддерживается OGR SQL, поэтому нужно использовать диалект. Заполнить поле значениями можно вот так:&lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo input.shp -dialect SQLite -sql &amp;quot;UPDATE input SET textfield = 'sometext'&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Драйвер SQLite должен быть скомпилирован с поддержкой [http://www.gdal.org/ogr_sql_sqlite.html диалекта SQLite SQL], иначе будет выводиться сообщение об ошибке: &amp;quot;ERROR 6: The SQLite driver needs to be compiled to support the SQLite SQL dialect&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Использование диалекта [https://gdal.org/user/sql_sqlite_dialect.html#sql-sqlite-dialect &amp;quot;SQLite&amp;quot;] делает возможным применение огромного набора функций и операций, реализованной в данной СУБД, включая пространственное расширение [http://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html &amp;quot;SpatiaLite&amp;quot;].&lt;br /&gt;
Например, операция по присвоению полю таблицы Mapinfo значения идентификатора UUID/GUID может быть легко реализована следующей командой: &lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo -so myTab.TAB -dialect SQLite -sql &amp;quot;UPDATE myTab SET GLOBALID=CreateUUID()&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пространственные операции===&lt;br /&gt;
&lt;br /&gt;
Используя ExecuteSQL можно выполнять и пространственные операции. Допустим есть два слоя - полигоны и точки и мы хотим посчитать количество точек в каждом полигоне.&lt;br /&gt;
&lt;br /&gt;
Создаем файл vrt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;OGRVRTDataSource&amp;gt;&lt;br /&gt;
&amp;lt;OGRVRTLayer name=&amp;quot;pol&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;SrcDataSource&amp;gt;pol.shp&amp;lt;/SrcDataSource&amp;gt;&lt;br /&gt;
    &amp;lt;SrcLayer&amp;gt;pol&amp;lt;/SrcLayer&amp;gt;&lt;br /&gt;
&amp;lt;/OGRVRTLayer&amp;gt;&lt;br /&gt;
&amp;lt;OGRVRTLayer name=&amp;quot;pnt&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;SrcDataSource&amp;gt;pnt.shp&amp;lt;/SrcDataSource&amp;gt;&lt;br /&gt;
    &amp;lt;SrcLayer&amp;gt;pnt&amp;lt;/SrcLayer&amp;gt;&lt;br /&gt;
&amp;lt;/OGRVRTLayer&amp;gt;&lt;br /&gt;
&amp;lt;/OGRVRTDataSource&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И выполним запрос с привлечением функции ST_Intesects:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogrinfo -sql &amp;quot;SELECT COUNT(*) FROM pol, pnt WHERE ST_Intersects(pol.geometry,pnt.geometry) GROUP BY pol.id&amp;quot; -dialect SQLITE input.vrt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Работа с системами координат==&lt;br /&gt;
===Переназначение системы координат===&lt;br /&gt;
Если вам нужно просто перепрописать систему координат, без пересчета самого набора данных:&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Перепроецирование ===&lt;br /&gt;
&lt;br /&gt;
Для перевода данных из одной системы координат в другую могут использоваться следующие параметры:&lt;br /&gt;
&lt;br /&gt;
#-a_srs, назначение системы координат набору данных, без создания нового набора (фактически, это не перепроецирование)&lt;br /&gt;
#-s_srs, указание исходной системы координат (если у набора данных уже прописана система координат - она игнорируется)&lt;br /&gt;
#-t_srs, требуемая система координат в которую будет осуществляться пересчет.&lt;br /&gt;
&lt;br /&gt;
Например, мы знаем, что файл topo2km-rus.shp содержит данные в географической системе координат Пулково 1942, но в комплекте с topo2km-rus.shp нет файла описания проекции (*.prj). Мы можем сгенерировать этот файл, воспользовавшись командой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -a_srs &amp;quot;EPSG:4284&amp;quot; -f &amp;quot;ESRI Shapefile&amp;quot; topo2km-rus2.shp topo2km-rus.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Команда:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -s_srs &amp;quot;EPSG:4326&amp;quot; -t_srs &amp;quot;EPSG:900913&amp;quot; -f &amp;quot;ESRI Shapefile&amp;quot; topo2km-rus3.shp topo2km-rus2.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
берет созданный на предыдущем этапе файл topo2km-rus2.shp и перепроецирует его в систему координат Google Mercator (epsg 900913), при этом опция -s_srs &amp;quot;epsg:4326&amp;quot; говорит о том, что при перепроецировании не нужно обращать внимания на исходную проекцию файла topo2km-rus2.shp, т.е. вести себя так, будто проекция источника - широта/долгота WGS84 (epsg 4326).&lt;br /&gt;
&lt;br /&gt;
В приведенных примерах система координат указывалась на основе кодов epsg, но ее можно указывать и непосредственно в формате WKT или же передавать имя файла, в котором хранится ее описание. Например, если необходимо использовать описания систем координат, хранящихся в файлах input.prj и output.prj, то нужно использовать следующую конструкцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -s_srs ESRI::Input.prj -t_srs ESRI::output.prj  shapeout.shp shapein.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перепроецировать данные с указанием набора параметров перехода из одной системы координат в другую можно следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -t_srs &amp;quot;+proj=latlong +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0,0,0&amp;quot; shapeout.shp shapein.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Обрезка ==&lt;br /&gt;
&lt;br /&gt;
Можно обрезать данные по нужному охвату, углы задаются в формате мин X, мин Y, макс X, макс Y.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -clipsrc 41.4 46.4 41.6 46.6 output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вместо координат можно обрезать и по сложной форме заданной другим shape-файлом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -clipsrc clipbound.shp output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
пакетно (Win):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for %n in (*.shp) do ogr2ogr -clipsrc clipbound.shp output_folder/%n %n&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
пакетно (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for f in *.shp; do ogr2ogr -lco ENCODING=UTF-8 -clipsrc clipbound.shp output_folder/${f} ${f}; done&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Объединение==&lt;br /&gt;
Суть объединения по ogr'овски в том, что сначала создается копия первого источника данных, а потом к этой копии добавляются данные из второго, и т.д.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr result.shp input1.shp&lt;br /&gt;
ogr2ogr -update -append result.shp input2.shp -nln result&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Объединение по общему полю==&lt;br /&gt;
В OGR можно использовать операцию JOIN:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -sql &amp;quot;select input.*, table.* from input LEFT JOIN 'table.csv'.table ON input.id = table.IDINT&amp;quot; output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере выше используется input.shp в качестве shape-файла и table.csv - в качестве присоединяемой таблицы. Присоединяемая таблица должна иметь расширение CSV. Обе таблицы разумеется должны иметь общее поле по которому будет происходить объединение, в данном случае это: id - поле в input.shp и IDINT - поле в table.csv. Ключом может быть и целочисленное и текстовое поле.&lt;br /&gt;
&lt;br /&gt;
Следует учесть, в новом shape-файле названия полей будут изменены на новые, вида input.field1, input.field2,..., table.field1, table.field2 и т.д., т.е. в новой таблице названия полей будут указывать и источник. Так как существует ограничение на длину названия поля, то это может привести к ухудшению читаемости названия поля. Для начала можно укоротить названия входного shape-файла и таблицы и самих названий полей.&lt;br /&gt;
&lt;br /&gt;
Более правильным решением является переназначение названий полей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -sql &amp;quot;select input.field1 AS FIELD1, table.field2 AS FIELD2 from input LEFT JOIN 'table.csv'.table ON input.id = table.IDINT&amp;quot; output.shp input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Генерализация==&lt;br /&gt;
Один из самых простых вариантов упрощения - отбрасывание разрядов значений координат после запятой. Ключ &amp;lt;code&amp;gt;-lco COORDINATE_PRECISION=1&amp;lt;/code&amp;gt; сколько оставить разрядов после запятой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;GeoJSON&amp;quot; -lco COORDINATE_PRECISION=1 output.json input.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результирующие координаты будут приведены к форме DD.D, например: 75.158028 -&amp;gt; 75.200000, оставшиеся нули (если нужна минификация) нужно убирать уже в текстовом представлении, например таким регулярным выражением:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Find: &amp;quot;\.0([,\]])&amp;quot;&lt;br /&gt;
Replace: &amp;quot;$1&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Работа с PostreSQL/PostGIS ==&lt;br /&gt;
&lt;br /&gt;
Вставка (добавление) записей в таблицу PostgreSQL данных из файла data.shp. Таблица должна существовать и иметь такие же поля, как и shp-файл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -append  -t_srs &amp;quot;+init=epsg:4326&amp;quot; -f PostgreSQL PG:&amp;quot;host=адрес user=имя_пользователя dbname=имя_базы&amp;quot; data.shp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перезаписывает test таблицу PostgreSQL данными из файла test.tab Таблица не обязана существовать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -append -overwrite -s_srs &amp;quot;+init=epsg:4326&amp;quot; -f PostgreSQL PG:&amp;quot;host=адрес user=имя_пользователя dbname=имя_базы&amp;quot; test.tab&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перезаписывает данные из файла data в таблицу PostgreSQL. Таблица будет носить имя не data, а test1. Таблица test1 не обязана существовать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -append -overwrite -t_srs &amp;quot;+init=epsg:4326&amp;quot; -f &amp;quot;PostgreSQL&amp;quot;  PG:&amp;quot;host=адрес user=имя_пользователя dbname=test&amp;quot; data.shp -nln test1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наоборот: из таблицы PostgreSQL &amp;quot;adm&amp;quot; базы ipc конвертирует в allei.tab формата MapInfo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;MapInfo File&amp;quot; allei.tab  PG:&amp;quot;host=адрес user=пользователь dbname=ipc&amp;quot; &amp;quot;adm&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из таблицы PostgreSQL &amp;quot;adm&amp;quot; базы ipc конвертирует в shape-файл с использованием выражения sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ogr2ogr -f &amp;quot;ESRi Shapefile&amp;quot; output.shp PG:&amp;quot;host=адрес user=пользователь dbname=ipc&amp;quot; -sql &amp;quot;SELECT * from adm&amp;quot;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17069</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17069"/>
		<updated>2013-12-18T23:07:56Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
{{Аннотация|Утилиты GDAL/OGR и русские буквы в именах файлов и путей Windows. Рецепт использования кодировки UTF-8.}}&lt;br /&gt;
== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
=== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
=== Продолжаем исследование ===&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
=== Вывод ===&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры: ===&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* === Py-скрипт ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Итог ==&lt;br /&gt;
Решение найдено. Но т.к. костыли не заменяют ног, то кроме неудобства связанно с необходимостью для всех утилит создать Bat-Файлы со специальными настройками, и помнить внесенные изменения на случай выхода новой версии утилит или библиотеки в целом, при таком подходе мы лишились возможности в ряде случаев использовать команды, начинающиеся с двойного тире &amp;quot;--&amp;quot;, описанные в [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html [Gdal-dev] GDAL General Command Line Processor], т.к. эти опции несовместны с опцией '''--optfile filename''' .&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17068</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17068"/>
		<updated>2013-12-18T23:03:16Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
=== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
=== Продолжаем исследование ===&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
=== Вывод ===&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры: ===&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* === Py-скрипт ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Итог ==&lt;br /&gt;
Решение найдено. Но т.к. костыли не заменяют ног, то кроме неудобства связанно с необходимостью для всех утилит создать Bat-Файлы со специальными настройками, и помнить внесенные изменения на случай выхода новой версии утилит или библиотеки в целом, при таком подходе мы лишились возможности в ряде случаев использовать команды, начинающиеся с двойного тире &amp;quot;--&amp;quot;, описанные в [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html [Gdal-dev] GDAL General Command Line Processor], т.к. эти опции несовместны с опцией '''--optfile filename''' .&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17067</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17067"/>
		<updated>2013-12-18T22:58:00Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Итог */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
=== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
=== Продолжаем исследование ===&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
=== Вывод ===&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры: ===&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* === Py-скрипт ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Итог ==&lt;br /&gt;
Решение найдено. Но т.к. костыли не заменяют ног, то кроме неудобства связанно с необходимостью для всех утилит создать Bat-Файлы со специальными настройками, и помнить внесенные изменения на случай выхода новой версии утилит или библиотеки в целом, при таком подходе мы лишились возможности в ряде случаев использовать команды, начинающиеся с двойного тире &amp;quot;--&amp;quot;, описанные в [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html [Gdal-dev] GDAL General Command Line Processor], т.к. эти опции несовместны с опцией '''--optfile filename''' .&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17066</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17066"/>
		<updated>2013-12-18T22:47:05Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
=== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
=== Продолжаем исследование ===&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
=== Вывод ===&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Решение ===&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры: ===&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ==== EXE-файл ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* === Py-скрипт ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Итог ==&lt;br /&gt;
Решение найдено. Но т.к. костыли не заменяют ног, то кроме неудобства связанно с необходимостью для всех утилит создать Bat-Файлы со специальными настройками, и помнить внесенные изменения на случай выхода новой версии утилит или библиотеки в целом, при таком подходе мы лишились возможности в ряде случаев использовать команды, начинающиеся с двойного тире &amp;quot;--&amp;quot;, описанные в [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html [Gdal-dev] GDAL General Command Line Processor], т.к. эти опции несрвместны с опцией '''--optfile filename''' .&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17065</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17065"/>
		<updated>2013-12-18T22:44:25Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
==== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
==== Продолжаем исследование ====&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
==== Вывод ====&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Решение ====&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Просмотр результатов: ====&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ===== EXE-файл =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ===== EXE-файл =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Итог ===&lt;br /&gt;
Решение найдено. Но т.к. костыли не заменяют ног, то кроме неудобства связанно с необходимостью для всех утилит создать Bat-Файлы со специальными настройками, и помнить внесенные изменения на случай выхода новой версии утилит или библиотеки в целом, при таком подходе мы лишились возможности в ряде случаев использовать команды, начинающиеся с двойного тире &amp;quot;--&amp;quot;, описанные в [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html [Gdal-dev] GDAL General Command Line Processor], т.к. эти опции несрвместны с опцией '''--optfile filename''' .&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17064</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17064"/>
		<updated>2013-12-18T22:38:24Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 ==&lt;br /&gt;
=== Анализ ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
==== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
==== Продолжаем исследование ====&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
==== Вывод ====&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Решение ====&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;оболочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемые из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через параметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot;&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  @python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %~1&lt;br /&gt;
if &amp;quot;%2&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  @ogrinfo&lt;br /&gt;
if &amp;quot;%1&amp;quot;==&amp;quot;&amp;quot;  goto iExit&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
:iExit&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Просмотр результатов: ====&lt;br /&gt;
Приведенный выше BAT файлы сработали одинаково и в случае верных данных, &lt;br /&gt;
&lt;br /&gt;
* ===== EXE-файл =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.TAB&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
Had to open data source read-only.&lt;br /&gt;
INFO: Open of `f:\20 набор тестовых файлов\tsp.TAB'&lt;br /&gt;
      using driver `MapInfo File' successful.&lt;br /&gt;
1: tsp (Point)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
0...10...20...30...40...50...60...70...80...90...100 - done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и в случае, когда входные данные породили сообщение об ошибке:&lt;br /&gt;
* ===== EXE-файл =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;ogrinfoF.bat &amp;quot;f:\20 набор тестовых файлов\tsp.T__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
FAILURE:&lt;br /&gt;
Unable to open datasource `f:\20 набор тестовых файлов\tsp.T__' with the following drivers.&lt;br /&gt;
  -&amp;gt; FileGDB&lt;br /&gt;
  -&amp;gt; ESRI Shapefile&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ==== Py-скрипт ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdal_mergeF.bat -o &amp;quot;результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Active code page: 65001&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.t__' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17063</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17063"/>
		<updated>2013-12-18T21:56:26Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 (для правой и левой ноги - разные) ==&lt;br /&gt;
=== Костыль №3 ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
==== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
==== Исследование ====&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
==== Вывод ====&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без искажений на стыке &amp;quot;операционная система&amp;quot; - &amp;quot;оболочка командной строки&amp;quot; - &amp;quot;прикладаня программа&amp;quot;/&amp;quot;прикладная среда&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Решение ====&lt;br /&gt;
Оно показалось очевидным:&lt;br /&gt;
# устанавливаем кодировку &amp;quot;приятную&amp;quot; нам и &amp;quot;облочке командной строки&amp;quot;. я выбрал UTF-8 или CP65001 ( космополитизм, однако ...);&lt;br /&gt;
# сохраняем параметры программы, получаемыек из командной строки в выбранный файл в выбранной кодировке;&lt;br /&gt;
# считываем это файл через праметр '''--optfile filename'''&lt;br /&gt;
# и исправив только BAT файлы, что IMHO проще и безопасней для будущего, чем править скрипты, получаем весь спектр симовлов UTF-8 в именах файлов и других праметрах.&lt;br /&gt;
&lt;br /&gt;
В результате получился для '''dal_merge.py''' вот такой BAT-Файл '''dal_mergeF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo off&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@rem echo %iTmp%&lt;br /&gt;
@echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше того, и скомпилированные в EXE-файлы утилиты то же через это способ можно перевести на общение через UTF-8. Для '''ogrinfo.exe''' получился вот такой BAT-Файл '''ogrinfoF.bat'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
@echo on&lt;br /&gt;
@chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
set ARGV=%*&lt;br /&gt;
set iTmp=%tmp%\%RANDOM%_%~n0_%RANDOM%.tmp&lt;br /&gt;
@echo %iTmp%&lt;br /&gt;
echo %ARGV%&amp;gt;&amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@rem chcp 1251&lt;br /&gt;
ogrinfo  --optfile &amp;quot;%iTmp%&amp;quot;&lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17062</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17062"/>
		<updated>2013-12-18T21:40:24Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 (для правой и левой ноги - разные) ==&lt;br /&gt;
=== Костыль №3 ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
==== Решение получено, но ... . Опять &amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
==== Исследование ====&lt;br /&gt;
Пришлось искать смысл этой функции. Кода не нашел, но нашел описание идеи [http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] и указание на то, что она входит во все утилиты (естественно все проверить мне не удалось) и задумана она для облегчения обработки сложных входных строк!&lt;br /&gt;
И что гораздо важней, есть порождаемый этой функцией параметр &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--optfile filename: expand an option file into the argument list.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
который должны понимать все утилиты GDAL/ORG, и который согласно писанию предназначен для считывания параметров командной строки из файла.&lt;br /&gt;
&lt;br /&gt;
==== Вывод ====&lt;br /&gt;
И этот параметр позволяет поместить в файл параметры в полностью контролируемой кодировке, а потом программе считать их без&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17061</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17061"/>
		<updated>2013-12-18T21:31:07Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В примере видно, что при установленной по умолчанию кодировке командной строки (CP866), вывод на экран функциями печати производится в кодировке '''CP1251''', которая является кодировкой Windows, установленной в системных настройках. Этот интересный факт, пригодится нам для позже.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №1 ==&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
===Вывод:===&lt;br /&gt;
Установите переменную окружения '''GDAL_FILENAME_IS_UTF8''' в значение '''NO''', и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Технические детали: ===&lt;br /&gt;
В процессе обсуждения такого прискорбного для русско-пишущих факта, всплыло указание на то, что эта переменная дана не от хорошей жизни, а как подпорка для тех, кто живет &amp;quot;неправедной&amp;quot; жизнью с вредными кодировками (во вредных ОС), в то время как &amp;quot;прогрессивное человечество&amp;quot; использует кодировку [http://ru.wikipedia.org/wiki/Utf-8 UTF-8], которая и встроена как основная в библиотеку GDAL/OGR. По мнению обсуждавших тему (я сам исходные коды не читал, и тут все принимаю на веру), внутренние функции GDAL/OGR оперируют строками в UTF-8, и этими же строками UTF-8 пытаются открывать файлы, если переменная  окружения '''GDAL_FILENAME_IS_UTF8''' не установлена или имеет значение '''YES'''. &lt;br /&gt;
&lt;br /&gt;
Так же было высказано обоснованное предположение, что Windows скорее всего имена файлов хранит в кодировке [http://ru.wikipedia.org/wiki/UTF-16 UTF-16], но потом, для пользователя, они оказывают в разных кодировках, в зависимости от места и ситуации обращения к ним. Для игрищ с кодировками консоли Windows ( [http://ru.wikipedia.org/wiki/Cmd.exe командный процессор '''cmd''']) служит команда &amp;lt;code&amp;gt;CHCP&amp;lt;/code&amp;gt;. Которая как оказалось, позволяет устанавливать кодировку UTF-8 командой &amp;lt;code&amp;gt;CHCP 65001&amp;lt;/code&amp;gt;. К стати, Windows 7 кодировки UTF-16 c номерами 1200 и 1201, устанавливать не позволяет.&lt;br /&gt;
&lt;br /&gt;
Что можно утверждать точно, так это то, что интерпретатор языка [ Python 2.7], оперирует строками в кодировке UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== И все бы было хорошо, если бы не ... : ===&lt;br /&gt;
==== Общая неудовлетворенность запретом UTF-8: ====&lt;br /&gt;
Ну в самом деле, у всех (видимо англоязычных) есть, а нам - нельзя. А вдруг к русскому языку захочется еще немецких [http://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BB%D0%B0%D1%83%D1%82_(%D0%B4%D0%B8%D0%B0%D0%BA%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B7%D0%BD%D0%B0%D0%BA) умляутов] или другой какой UNICODE экзотики, а тут нельзя - оставайтесь только в пределах одной кодовой страницы, к тому же неизвестно где выставленной. &lt;br /&gt;
&lt;br /&gt;
==== Проблемы со скриптами на языке Python: ====&lt;br /&gt;
Если предыдущий абзац - это блаж, без которой можно обойтись в работе, то вот такой неприятный сюрприз с вызовом утилиты ''''gdal_merge.bat''' из настроенной казалось системы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;set GDAL_FILENAME_IS_UTF8&lt;br /&gt;
GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&lt;br /&gt;
C:\OSGeo4W64\bin&amp;gt;al_merge.bat -o &amp;quot;F:\21\результат.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot; &amp;quot;F:\20 набор тестовых файлов\x2_9140_N-37-28-Г.tif&amp;quot;&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
ERROR 4: `F:\20   \x2_9140_N-37-28-.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 509, in &amp;lt;module&amp;gt;&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
  File &amp;quot;C:\OSGEO4~1\bin\gdal_merge.py&amp;quot;, line 392, in main&lt;br /&gt;
    ulx = file_infos[0].ulx&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
огорчает. И &amp;quot;танцы с бубном&amp;quot;: как то установка всех пришедших в голову кодовых страниц, комбинация кодовой страницы '''65001''' и переменной окружения '''GDAL_FILENAME_IS_UTF8=YES''' результата не дают:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
@setlocal&lt;br /&gt;
chcp 65001&lt;br /&gt;
Set GDAL_FILENAME_IS_UTF8=YES&lt;br /&gt;
@python &amp;quot;%OSGEO4W_ROOT%\bin\gdal_merge.py&amp;quot; %*  &lt;br /&gt;
@endlocal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не работает приведенный вариант, хоть ты тресни. При этом, если вывести результат командной строки в файл, видно, что текст создается в кодировке UTF-8 (65001).&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №2 (надпиленный) ==&lt;br /&gt;
Как видно выше, на самом деле BAT-файл '''dal_merge.bat''' - это всего навсего обертка на python-скриптом '''dal_merge.py'''. Достаточно исправить имя файла, так что бы не было злосчастных русских букв, и вперед - все заработает как было задумано. Хоть с '''GDAL_FILENAME_IS_UTF8=YES''', хоть '''GDAL_FILENAME_IS_UTF8=NO'''.&lt;br /&gt;
Очевидное решение для этого - скопировать русский файл во временный каталог с именем без русских букв, а потом использовать эту копию.&lt;br /&gt;
&lt;br /&gt;
Еще более очевидный вариант переименовать файл на время работы с ним, а потом восстановить исходное имя. &lt;br /&gt;
Не очевидный вариант - переместить файл в пределах одного диска, так что бы ни в имени, ни в пути к каталогу, где лежит файл не было русских букв. Потому как русские буквы в имени каталога то же бывают, а переименовывать весь каталог это совсем неудобно.&lt;br /&gt;
&lt;br /&gt;
=== Описание решаемой задачи ===&lt;br /&gt;
которая показала, что так просто с этой проблемы не обойтись. &lt;br /&gt;
Так сложилось, что надо было мне сперва создать очень много файлов с русскими буквами, а потом еще и обработать их по всякому:&lt;br /&gt;
# Были исходные данные в виде 10 больших GTIFF файлов, размером от 3 до 9 Гигабайт.&lt;br /&gt;
# Файлы немного перекрывались, поскольку были результатом обработки многих сцен, собранных для трансформации.&lt;br /&gt;
# Надо было разложить фрагменты этих растров по стандартным планшетам М1:50000. &lt;br /&gt;
# В названиях планшетов есть русская буквы. Замена этой русской буквы на латинскую или цифру всегда приводила к путанице, да и основной пользователь продукта высказал мнение, что &amp;quot;русская буква есть принятый стандарт, от которого отойти - нельзя&amp;quot;.&lt;br /&gt;
# После того как все было нарезано, естественно оказалось, что отдельные планшеты, вырезанные только из одного большого растра - не полны, т.к. их фрагмент пришелся на другой растр. И эти фрагменты необходимо объединить в одни планшет.&lt;br /&gt;
# Для полноты безобразия, ряд пользователей (из особо продвинутых) затребовал, что бы полученные планшеты были слиты в один растр, покрывающий некоторую область, а то ихний ...кад много мелких файлов (по 200 МБ) не понимает.&lt;br /&gt;
&lt;br /&gt;
Вот для таких ритуальных танцев пришлось использовать GDAL/OGR в автономном режиме, потому как экранные ГИС умирали еще на стадии открытия одного TIF файла. И все удавалось победить, пока не дошло утилит, которые использовали скрипты на python'е. Тут работа крепко встала. Пока не было найдено решение с переименованием.&lt;br /&gt;
&lt;br /&gt;
=== Костыль №2 (надпиленный) ===&lt;br /&gt;
Какое-то время казалось, что все хорошо. Пока не пришло время смотреть промежуточный результат. И тут стало ясно, что при сбое в утилите '''gdal_merge''', переименованные файлы назад к своим именам не возвращаются. Больше того и понять как они раньше назывались дело не простое. Так что костыль оказался &amp;quot;надпиленный&amp;quot; и навернуться, опираясь на него, можно очень больно.&lt;br /&gt;
&lt;br /&gt;
Вариант с копированием конечно был более безопасным, но гонять туда-сюда 60 ГБ промежуточных файлов, вышло по времени столько же, сколько работали сами программы.&lt;br /&gt;
&lt;br /&gt;
Отсюда возникла задача победить таки этот зловредный UTF-8. Чему и посвящен остаток статьи.&lt;br /&gt;
&lt;br /&gt;
== Решение проблемы. Костыль №3 (для правой и левой ноги - разные) ==&lt;br /&gt;
=== Костыль №3 ===&lt;br /&gt;
В результате обсуждений на форуме, упомянутых выше, стало ясно, что придется смотреть коды программ, что бы понять чего там не срастается с этими русскими буквами. Началось все со скрипта '''dal_merge.py''', как наиболее актуального. И быстро стало ясно, что предположение о том, что путаница начинается в момент открытия файла через функции GDAL верна только отчасти. Функция &amp;lt;pre&amp;gt;gdal.Open( filename )&amp;lt;/pre&amp;gt; была готова открывать файлы в системной кодировке CP1251, если '''GDAL_FILENAME_IS_UTF8=NO''', или в кодировке UFT-8, если '''GDAL_FILENAME_IS_UTF8=YES'''. Кодировку CP866, стандартную для консоли не хотела видеть ни в каком случае. Но как оказалось на вход этой функции всегда приходила строка кодированная в UTF-8, даже если по факту данные в ней не имели ничего общего с этой кодировкой.&lt;br /&gt;
&lt;br /&gt;
Анализ показал, что в упомянутом скрипте, это работа вот такого кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if argv is None:&lt;br /&gt;
        argv = sys.argv&lt;br /&gt;
    argv = gdal.GeneralCmdLineProcessor( argv )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не зависимо от настроек функция [http://www.sourcecodebrowser.com/gdal/1.6.2/namespacegdal.html#a1103e0dd344e3912067a908915d0814f gdal.GeneralCmdLineProcessor] считала, что разбирает строку в UTF-8. Попытки найти, что же она такое там делает, и как ее убедить так не делать, не увенчались успехом. &lt;br /&gt;
&lt;br /&gt;
Но стало очевидно, что если строку с ней закомментировать, то дальше обработка полученных параметров командной строки строится на значении переменной '''GDAL_FILENAME_IS_UTF8''':&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=NO'''  - кодовая страница должна быть CP1251;&lt;br /&gt;
# '''GDAL_FILENAME_IS_UTF8=YES''' - кодовая страница должна быть UTF-8;&lt;br /&gt;
&lt;br /&gt;
==== Решение получено, но ... Опять &amp;quot;&amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Решение получено  - надо закомментировать строку с '''gdal.GeneralCmdLineProcessor'''. Но тут есть пара &amp;quot;но&amp;quot;:&lt;br /&gt;
# ведь скрипты могут из измениться в новых версиях, и вспомнить такие подробности, именно эту строку надо &amp;quot;извести&amp;quot; - это не так просто. Хотя бы только для этого надо оставить память в виде статьи.&lt;br /&gt;
# gdal.GeneralCmdLineProcessor - что-то ведь должен делать, кроме как портить входные строки. Для чего то он был задуман.&lt;br /&gt;
&lt;br /&gt;
==== Костыль №3 ====&lt;br /&gt;
==== Решение получено, но ... Опять &amp;quot;&amp;quot;но&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://lists.osgeo.org/pipermail/gdal-dev/2004-April/002369.html gdal.GeneralCmdLineProcessor]&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17060</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17060"/>
		<updated>2013-12-18T18:55:48Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GDAL и русские буквы в именах файлов и путей Windows =&lt;br /&gt;
== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими буквами, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тема обсуждалась на нашем форуме и закончилась [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=9182&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p54406 диагнозом]. Расширенная версии обсуждения русских букв: [http://gis-lab.info/forum/viewtopic.php?f=30&amp;amp;t=15093&amp;amp;hilit=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5+gdal#p100080 GDAL и русские буквы в именах файлов Windows].&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
Установите переменную окружения &amp;lt;/b&amp;gt;GDAL_FILENAME_IS_UTF8&amp;lt;/b&amp;gt; в значение NO, и при работе в пределах одной кодовой страницы - будет вам счастье:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set GDAL_FILENAME_IS_UTF8=NO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17059</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17059"/>
		<updated>2013-12-18T18:32:33Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* GDAL и русские буквы в именах файлов Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GDAL и русские буквы в именах файлов и путей Windows =&lt;br /&gt;
== Вступление: ==&lt;br /&gt;
=== Утилиты GDAL/OGR краткие сведения: ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Богатство форматов, поддерживаемых библиотекой, позволяет использовать с огромным количеством ГИС-данных. Библиотека GDAL/OGR используется в [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal] коммерческих, свободных и открытых продуктах для операций над ГИС-файлами. Не упомянутый на странице [http://trac.osgeo.org/gdal/wiki/SoftwareUsingGdal Software Using GDAL] очень достойный (хотя и не очень дешевый ;) ) российский продукт [http://www.scanex.ru/ru/software/default.asp?submenu=imageprocessor&amp;amp;id=index SCANEX IMAGE PROCESSOR®], так же использует библиотеки GDAL/OGR. &lt;br /&gt;
&lt;br /&gt;
Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в инсталяционном пакете присутствует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векторными данными. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
&lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Для специалиста, умеющего общаться с командной строкой, набор утилит представляет огромные возможности, часто не сопоставимые с многими пакетами &amp;quot;ГИС&amp;quot;. Сильной стороной пакета является отсутствие необходимости визуализовать файлы во время работы, что сказывается на быстродействии его операций, а так же позволяет работать с файлами, размеры которых &amp;quot;убивают&amp;quot; многие графические редакторы и ГИС-программы. &lt;br /&gt;
&lt;br /&gt;
=== Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows: ===&lt;br /&gt;
Это все были плюсы, к которым несомненно стоит отнести тот факт, что библиотека и утилиты открыты и бесплатны. Больше того библиотека находится в постоянном развитии. Вот с этого момента начинаются небольшие, но очень &amp;quot;кусачие&amp;quot; минусы. Останавливаться на перманентном изменении поведения отдельных частей библиотеки не имеет смысла, поскольку статья не про это. Есть люди, которые живут с этой библиотекой и ее развитием дружно, и к ним можно всегда постучаться за помощью. Проблемой является то, что часть нетривиальных случаев в поведении библиотеки приходится на пользователей Windows, которые стоят в стороне от тех, кто пишет &amp;quot;кросс-платформенные&amp;quot; библиотеки на Lunix. Из этого факта вырос неприятный сюрприз, что утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах путей и файлов Windows. Такая особенность возникла не сразу, а где то в процессе перехода от версии 1.6 к версии 1.9. С тех пор попытки передать программам имена с русскими, а скорее всего и символами любых других национальных алфавитов, выходящих за рамки [http://ru.wikipedia.org/wiki/ASCII ACSII], заканчивались как то так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
ERROR 4: `Ёхчєы№ЄрЄ.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'Ёхчєы№ЄрЄ.tif'.&lt;br /&gt;
&lt;br /&gt;
F:\21&amp;gt;chcp 1251&lt;br /&gt;
&lt;br /&gt;
F:\21&amp;gt;gdalinfo результат.tif&lt;br /&gt;
ERROR 4: `результат.tif' does not exist in the file system,&lt;br /&gt;
and is not recognised as a supported dataset name.&lt;br /&gt;
&lt;br /&gt;
gdalinfo failed - unable to open 'результат.tif'.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17058</id>
		<title>GDAL и кириллица в именах файлов Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL_%D0%B8_%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D1%85_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_Windows&amp;diff=17058"/>
		<updated>2013-12-18T17:48:08Z</updated>

		<summary type="html">&lt;p&gt;Boris: Новая страница: «== GDAL и русские буквы в именах файлов Windows == === Вступление: Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские б…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GDAL и русские буквы в именах файлов Windows ==&lt;br /&gt;
=== Вступление: Утилиты GDAL/OGR не &amp;quot;любят&amp;quot; русские буквы в именах файлов Windows ===&lt;br /&gt;
[http://ru.wikipedia.org/wiki/GDAL GDAL/OGR] - это кросс-платформенная библиотека для обработки ГИС-информации, и растров, и векторов. Для программистов она представляет серьезный инструмент для создания ГИС-приложений. Кроме самих библиотек [http://www.gdal.org/index_ru.html GDAL] и [http://www.gdal.org/ogr/index.html OGR] в существует набор уже созданных утилит [http://www.gdal.org/gdal_utilities.html GDAL]/[http://www.gdal.org/ogr_utilities.html OGR], запускаемых из командной строки, которые позволяют выполнять многие операции над растровыми и векорными данными. Богатство форматов, поддерживаемых библиотекой, позволяет использовать ее к огромному количеству ГИС-данных. Часть утилит представлена в виде исполнимых (EXE) файлов, а часть в виде скриптов на языке Python. &lt;br /&gt;
О GDAL/OGR можно узнать на форуме в разделе [http://gis-lab.info/forum/viewforum.php?f=30 Программное обеспечение ‹ Свободные, бесплатные, открытые ГИС ‹ GDAL/OGR]. Один из вариантов установки дан в этой [http://gis-lab.info/qa/qgis-osgeo4w.html статье]. Мне известно, что утилиты командной строки так же входят состав ГИС [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8575</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8575"/>
		<updated>2012-10-05T23:01:47Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Создание контура изображения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю размера планшета приблизительно на 5%, для простоты создания буфера я перед созданием буфера пересчитываю их в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что нам необходимо было получить:&lt;br /&gt;
&lt;br /&gt;
- 4 координаты 2-х углов сетки, которые лежат только в пределах обрезаемого (скорее разбираемого) растра и имеют ту же СК, что и обрезаемый растр. &lt;br /&gt;
Если это у нас есть, то вперед - интерационо разберем растр на части.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл '''Q1.MID''' (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог '''&amp;quot;root\1\&amp;quot;''', исходный файл находится по адресу '''&amp;quot;f:\test\test.tif&amp;quot;''':&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8574</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8574"/>
		<updated>2012-10-05T23:01:11Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Создание контура изображения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю размера планшета приблизительно на 5%, для простоты создания буфера я перед созданием буфера пересчитываю их в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что нам необходимо было получить:&lt;br /&gt;
- 4 координаты 2-х углов сетки, которые лежат только в пределах обрезаемого (скорее разбираемого) растра и имеют ту же СК, что и обрезаемый растр. &lt;br /&gt;
Если это у нас есть, то вперед - интерационо разберем растр на части.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл '''Q1.MID''' (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог '''&amp;quot;root\1\&amp;quot;''', исходный файл находится по адресу '''&amp;quot;f:\test\test.tif&amp;quot;''':&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8573</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8573"/>
		<updated>2012-10-05T22:57:27Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Обрезка растра */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю размера планшета приблизительно на 5%, для простоты создания буфера я перед созданием буфера пересчитываю их в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл '''Q1.MID''' (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог '''&amp;quot;root\1\&amp;quot;''', исходный файл находится по адресу '''&amp;quot;f:\test\test.tif&amp;quot;''':&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8572</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8572"/>
		<updated>2012-10-05T22:43:32Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Обрезка растра */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю размера планшета приблизительно на 5%, для простоты создания буфера я перед созданием буфера пересчитываю их в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл Q1.MID (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог root\1\, исходный файл находится по адресу '''&amp;quot;f:\test\test.tif&amp;quot;''':&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8571</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8571"/>
		<updated>2012-10-05T22:40:39Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Создание контура изображения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю размера планшета приблизительно на 5%, для простоты создания буфера я перед созданием буфера пересчитываю их в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл Q1.MID (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог root\1\, в нем же должна быть воссоздана структура исходных каталогов:&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8570</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8570"/>
		<updated>2012-10-05T22:38:12Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Небольшое отступление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
Идея нашей обработки - извлечение прямоугольных участков растра, заданных двумя вершинами. Для этого у '''gdal_translate''' есть два механизма - задать координаты растра и задать координаты в проекции растра, а программа сама пересчитает эти координаты в координаты растра (и выведет их нам при работе).&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю на 5% от размера планшета, пересчитанных в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл Q1.MID (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог root\1\, в нем же должна быть воссоздана структура исходных каталогов:&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8569</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8569"/>
		<updated>2012-10-05T22:35:16Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Постановка задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL 1.9.1 версии и MapInfo актуальной (9.5) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю на 5% от размера планшета, пересчитанных в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл Q1.MID (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог root\1\, в нем же должна быть воссоздана структура исходных каталогов:&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8568</id>
		<title>GDAL+MapInfo: разрезаем изображение прямоугольной сеткой</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=GDAL%2BMapInfo:_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%B5%D0%BC_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%BA%D0%BE%D0%B9&amp;diff=8568"/>
		<updated>2012-10-05T22:34:21Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Допустим, что есть большое изображение и есть векторная сетка (полигоны), по которой бы хотелось это изображение разрезать. Сетка должна совпадать с изображением по проекции (или системе координат). Может и не совпадать, но это потребует дополнительных действий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для решения задачи будет использоваться следующее ПО: утилиты GDAL ??? версии и MapInfo актуальной (???) версии. Ниже в командных инструкциях используется синтаксис командной строки Windows XP.&lt;br /&gt;
&lt;br /&gt;
== Полигональная сетка ==&lt;br /&gt;
Полигональная сетка была создана в MapInfo, немного остановимся на ее обработке ниже, но сам этап создания сетки рассматривать не будем. &lt;br /&gt;
&lt;br /&gt;
=== Небольшое отступление ===&lt;br /&gt;
Самый известный вариант сетки — это сетка планшетов СК-42 (и аналогичных). Она стандартна, удобно создана для разных масштабов, и имеется у всех, кому нужна. С ней есть только один небольшой минус — она не прямоугольна. А смысл в том, чтобы резать изображение, не нарушая его пиксельной структуры — без пересчетов и искажений. Утилита '''gdalwarp''' позволяет обрезать изображение векторной сеткой, записанной в файл. Это не наш случай, т.к. он производит пересчет пикселей под векторный контур.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Создание контура изображения ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для начала создадим внешний контур изображения. Тут есть два способа — простой и сложный, выбор зависит от свойств конкретных данных и частностей задачи.&lt;br /&gt;
* '''Простой''' способ – простая рамка изображения, которая создаётся утилитой  '''gdaltindex'''.&lt;br /&gt;
Например, для всех растров в папках, начинающихся с «MRGN_» :&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*.tif) do if exist &amp;quot;%~fa&amp;quot; gdaltindex -skip_different_projection MRGN_SP5_2011_index.shp &amp;quot;%~fa&amp;quot;&lt;br /&gt;
для одной папки с растрами синтаксис имеет вид:&lt;br /&gt;
 gdaltindex -skip_different_projection index.shp &amp;quot;*.tif&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Сложный''' способ, который учитывает, что растр может занимать только часть изображения, а часть растра нас не интересует, т.к. имеет «черное» поле (NODATA=0). В этом случае, я делаю еще «пару танцев с бубном»:&lt;br /&gt;
1. Cоздадим новый растр из предположения, что есть NODATA=0 и все остальное &amp;gt; 0. Используем утилиту '''gdal_calc''', чтобы вычленить ненулевые значения (в примере снова обработка целой папки с растрами TIF):&lt;br /&gt;
 for /r %a in (*.tif) do gdal_calc -A &amp;quot;%~fa&amp;quot; --outfile=&amp;quot;%~dpna_c.tif&amp;quot; --calc=&amp;quot;(A&amp;gt;0)*127+(A==0)*0&amp;quot;  --NoDataValue=0 --type=Byte –overwrite&lt;br /&gt;
2. Сжимаем полученные файлы с помощью опции COMPRESS=CCITTFAX4 с очевидным уменьшением разрядности до 1 бита через '''gdal_translate''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\%~b_c.tif) do gdal_translate -of &amp;quot;GTiff&amp;quot; -a_nodata 127 -co &amp;quot;NBITS=1&amp;quot; -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;COMPRESS=CCITTFAX4&amp;quot; &amp;quot;%~fa&amp;quot; &amp;quot;%~dpna_msk.tif&amp;quot;&lt;br /&gt;
Это делаем для того, чтобы однозначно избавиться от всех значений больше 0, и радикально уменьшить размер растра, если мы задумаем его хранить как маску.&lt;br /&gt;
&lt;br /&gt;
Создаем контура значимых (непустых) частей снимков через утилиту векторизации '''gdal_polygonize''':&lt;br /&gt;
 for /d %b in (MRGN_*) do @for %a in (%b\*_c_msk.tif) do if exist &amp;quot;%~fa&amp;quot; gdal_polygonize &amp;quot;%~fa&amp;quot; -b 1 -f &amp;quot;ESRI Shapefile&amp;quot; %b\%~na_poly.shp&lt;br /&gt;
&lt;br /&gt;
Теперь надо открыть полученный вектор в какой-то ГИС. MapInfo часто не может открыть векторные данные, получившиеся в результате работы GDAL-утилит, т.к. в них есть тестовые поля длиной 255 символов (у MapInfo ограничение длины строки в 254), так что контур можно перевести программно через '''ogr2ogr''':&lt;br /&gt;
 ogr2ogr -f &amp;quot;MapInfo File&amp;quot; MRGN_SP5_2011_poly_mi.tab MRGN_SP5_2011_poly.shp&lt;br /&gt;
&lt;br /&gt;
Темы объединения векторов касаться не будем, это тоже можно сделать с помощью ogr2ogr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем контур (-а) растра (-ов) в MapInfo. С вероятностью 25%, в случае когда мы векторизовали значимый контур изображения через gdal_polygonize, в векторе будут присутствовать мелкие дырки от пикселей, которые имели значение NODATA внутри значимой части изображения.&lt;br /&gt;
&lt;br /&gt;
* Для борьбы с ними в MapInfo разгруппируем все составные объекты, превращая «дырки» в отдельные объекты. &lt;br /&gt;
* После этого удалим все объекты, имеющие площадь меньше некоторой критичной (например, 1 кв.км). Должны остаться только контура изображений. &lt;br /&gt;
&lt;br /&gt;
Теперь откроем контуры планшетов в ГИС. Проделаем с ними следующие превращения (большинство избыточны):&lt;br /&gt;
* Увеличим размер каждого планшета на некоторую величину (не обязательно, но если потом придется выводить растр с перекрытием, это даст запас пикселей по краям). Я увеличиваю на 5% от размера планшета, пересчитанных в метры. &lt;br /&gt;
* Переводим полученный вектор в проекцию (или систему координат) растра.&lt;br /&gt;
* Новый растр открываем и находим для каждого контура MBR (minimum bounding rectangle). В MapInfo это стандартная функция, которую можно применить к объектам слоя, затирая их (это команда на MapBasic, которая выполняется в окне MapBasic внутри MapInfo):&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set obj=MBR(buffer(obj,20,2000,&amp;quot;m&amp;quot;))&lt;br /&gt;
что буквально означает следующее:&lt;br /&gt;
&amp;quot;Для всех объектов слоя cutSHP_m50_000_UTM37 создать MBR для буфера вокруг каждого объекта с приращением 2000 метров и числом вершин при моделировании дуги равным 20&amp;quot;.&lt;br /&gt;
* Надо расширить атрибутику векторных данных, т.к. в дальнейшем нам потребуются числовые значения координат вершин планшетов (под &amp;quot;планшетами&amp;quot; здесь понимаются «геометрические объекты сетки»). Этот пункт обязателен для исполнения (ниже станет ясно, почему):&lt;br /&gt;
 Alter Table &amp;quot;cutSHP_m50_000_UTM37&amp;quot; ( add ulX float, ulY float, lrX float, lrY float)&lt;br /&gt;
* Теперь надо физически удалить планшеты, которые не пересекают значимый контур изображения. В MapInfo отбор таких объектов делается с помощь пространственного запроса. В этом же пункте можно удалить и избыточные объекты сетки, т.к. мы их создали с перекрытием.&lt;br /&gt;
* Теперь существенный момент: надо обрезать планшеты внешней границей растра (той, что получена в результате работы gdal_polygonize). Это обязательно надо сделать, т.к. планшеты, которые будут выступать за физические границы растра, не будут обработаны gdal_translate. В MapInfo это делается стандартной командой «Erase outside».&lt;br /&gt;
* Последний пункт – вычисление координат углов каждого планшета и сохранение этих координат в ранее созданные поля ulX float, ulY float, lrX float, lrY float. В MapInfo для этого существуют стандартные функции и команда Update:&lt;br /&gt;
 update cutSHP_m50_000_UTM37 set ulx=ObjectGeography( object, 1 ),uly=ObjectGeography( object, 4 ),lrx=ObjectGeography( object, 3 ),lry=ObjectGeography( object, 2 )&lt;br /&gt;
* '''Внимание!''' Параметр ''-projwin'' у '''gdal_translate''' имеет вид&lt;br /&gt;
 -projwin ulx uly lrx lry&lt;br /&gt;
Такая запись отличается от обычной, которая начинается с ЛЕВОГО НИЖНЕГО угла. Здесь, как в растре – начало в ЛЕВОМ ВЕРХНЕМ углу, а вторая пара координат соответствует ПРАВОМУ НИЖНЕМУ углу. &lt;br /&gt;
* Сохраняем векторные данные в формат MIF/MID так, чтобы они имели следующий вид:&lt;br /&gt;
 Id, ulx, uly, lrx, lry&lt;br /&gt;
Id – уникальный номер (не обязательно, но полезно, чтобы задать упорядоченные имена для создаваемых файлов-фрагментов), X -координата верхнего левого угла, Y - координата верхнего левого угла, X координата нижнего правого угла, Y координата нижнего правого угла.&lt;br /&gt;
&lt;br /&gt;
Это может быть не только формат MIF/MID, но и любой другой текстовый формат. В этом случае будем использовать только MID – текстовый файл атрибутивных данных. Все, что нам нужно – это координаты углов планшетов, чтобы извлекать подмножества из исходного растра.&lt;br /&gt;
&lt;br /&gt;
Все «танцы с бубном» завершены.&lt;br /&gt;
&lt;br /&gt;
Повторим, что собственно нам обязательно надо получить:&lt;br /&gt;
* 4 координаты углов сетки;&lt;br /&gt;
* эти координаты должны лежать только в пределах обрезаемого (скорее разбираемого) растра;&lt;br /&gt;
* иметь ту же СК, что и обрезаемый растр.&lt;br /&gt;
&lt;br /&gt;
== Обрезка растра ==&lt;br /&gt;
Само использование GDAL, а именно, '''gdal_translate''', гораздо короче:&lt;br /&gt;
# Создаем набор команд для вычисления контуров в виде BAT-файла.&lt;br /&gt;
# Команда выполняется в каталоге, где лежит файл Q1.MID (так я назвал экспорт координат углов), файлы выполнения сохраняются в каталог root\1\, в нем же должна быть воссоздана структура исходных каталогов:&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do @echo @if not exist &amp;quot;root\1\test_%~a.tif&amp;quot; gdal_translate -of GTIFF -projwin %b %c %d %e -a_nodata 0 -co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot; &amp;quot;f:\test\test.tif&amp;quot; &amp;quot;root\1\test_%~a.tif&amp;quot;&amp;gt;&amp;gt;root\1\do_%~a.bat&lt;br /&gt;
# Можно сразу же запускать команды на выполнение в цикле for командной строки DOS, но создание набора BAT-файлов позволяет воспользоваться параллельным вычислением фрагментов или вернуться к прерванному вычислению, если понадобиться.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберём командные инструкции, написаные выше. &lt;br /&gt;
Команда&lt;br /&gt;
 for /f &amp;quot;tokens=1-5 delims=,&amp;quot; %a in (Q1.MID) do&lt;br /&gt;
означает &amp;quot;Построчно считать файл '''Q1.MID''' и выполнить над каждой строчкой операцию, записанную после '''do'''&amp;quot;:&lt;br /&gt;
* Использовать в качестве разделителя параметров строки символ «,»&lt;br /&gt;
* Используя разделитель, получить 5 параметров – переменные от а до e&lt;br /&gt;
* %а – уникальный номер, %b %c %d %e - координаты углов планшета из файла '''Q1.MID'''&lt;br /&gt;
Если не существует файл с именем &amp;quot;root\1\test_%~a.tif&amp;quot; , то:&lt;br /&gt;
* Выполнить команду gdal_translate &lt;br /&gt;
* над исходным файлом '''&amp;quot;f:\test\test.tif&amp;quot;'''&lt;br /&gt;
* с результирующим файлом '''&amp;quot;root\1\test_%~a.tif&amp;quot;'''&lt;br /&gt;
* '''-a_nodata 0''' - условием &amp;quot;нет данных&amp;quot; (NODATA) для пикселей со значение 0 во всех каналах&lt;br /&gt;
* '''-of GTIFF''' - выходным форматом GeoTIFF&lt;br /&gt;
* '''-co &amp;quot;TFW=YES&amp;quot; -co &amp;quot;compress=LZW&amp;quot;''' с дополнительными параметрами «Создавать world file» и «Сжимать растр алгоритмом LZW»&lt;br /&gt;
* '''-projwin %b %c %d %e''' – вырезать фрагмент, заданный указанными координатами, в системе координат растра (gdal_translate переведет их в координаты растра перед тем, как вырезать фрагмент, о чем программа информирует нас по ходу выполнения). Если границы выйдут за пределы растра, программа завершится сбоем и сообщением об ошибке.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, наконец, запускаем на выполнение все созданные BAT-файлы: &lt;br /&gt;
 for %a in (do_*.bat) do &amp;quot;%~fa&amp;quot;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6310</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6310"/>
		<updated>2012-07-26T22:09:21Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Вступление ===&lt;br /&gt;
Цель данной статьи не только показать как выполнить конкретную задачу по вычислению расстояний между точками, заданными в геодезической (географической) системе координат в градусах, что является нормой для приемников сигнала GPS/Глонасс, через перевод координат в спроецированные координаты в метрах, но продемонстрировать некоторые типичные подходы при работе в ГИС Мапинфо, в том числе и неявные способы, открывающиеся при использовании окна Мапбайсик, в который Мапинфо выводит практически все команды, вызываемые через стандартный интерфейс.&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 (а должны и ранее). Исключения могут быть связаны только с форматом файла Excel, в котором созданы исходные данные, и который умеете читать &amp;quot;на прямую&amp;quot; программа Мапифно.''&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высотой над уровнем моря, отрицательными координатами или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести расчет в Excel даже если бы мы использовали функции для пересчета сферических координат, видимо полученных от устройства GPS, в плановые метровые. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим из таблицы все строки, содержащие некорректные данные, нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений, мы получили пределы, в которые вписываются все координаты измерений. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояниями (переведенными на плоскость спроецированной поверхности) и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать обычную формулу Пифагора для 3-х мерного пространства.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. В этом же окне присвоим таблице систему координат - установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. [http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=4708&amp;amp;hilit=+%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C#p21658 Обсуждение проблемы смотрим вот здесь] &lt;br /&gt;
Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Далее для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, но выставленные параметры нам нужны только как образец, который мы исправим под свои нужды.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: приведенная программа является собственной разработкой (с)2011. В новые версии мапинфо входит улучшенный аналог, который позволяет задавать построение множества геобъектов из наборов точек, в то время как эта программа создает единственный объект на основании входного списка. Более функциональные программы используют для определения порядка создания вершин два индекса - первый задает объекты, второй, порядок вершин в объекте. Приведенные в статье программа не использует индексов, а создает вершины в том же порядке как они записаны в исходных файлах.&lt;br /&gt;
Кроме того возможно создание геообъектов через программы библиотеки GDAL/ORG, как это описано в статье ''[http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления в MapInfo производятся только по двумерным координатам при геообъекте, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6309</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6309"/>
		<updated>2012-07-26T22:07:26Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Вступление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 (а должны и ранее). Исключения могут быть связаны только с форматом файла Excel, в котором созданы исходные данные, и который умеете читать &amp;quot;на прямую&amp;quot; программа Мапифно.''&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высотой над уровнем моря, отрицательными координатами или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести расчет в Excel даже если бы мы использовали функции для пересчета сферических координат, видимо полученных от устройства GPS, в плановые метровые. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим из таблицы все строки, содержащие некорректные данные, нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений, мы получили пределы, в которые вписываются все координаты измерений. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояниями (переведенными на плоскость спроецированной поверхности) и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать обычную формулу Пифагора для 3-х мерного пространства.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. В этом же окне присвоим таблице систему координат - установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. [http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=4708&amp;amp;hilit=+%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C#p21658 Обсуждение проблемы смотрим вот здесь] &lt;br /&gt;
Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Далее для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, но выставленные параметры нам нужны только как образец, который мы исправим под свои нужды.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: приведенная программа является собственной разработкой (с)2011. В новые версии мапинфо входит улучшенный аналог, который позволяет задавать построение множества геобъектов из наборов точек, в то время как эта программа создает единственный объект на основании входного списка. Более функциональные программы используют для определения порядка создания вершин два индекса - первый задает объекты, второй, порядок вершин в объекте. Приведенные в статье программа не использует индексов, а создает вершины в том же порядке как они записаны в исходных файлах.&lt;br /&gt;
Кроме того возможно создание геообъектов через программы библиотеки GDAL/ORG, как это описано в статье ''[http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления в MapInfo производятся только по двумерным координатам при геообъекте, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6308</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6308"/>
		<updated>2012-07-26T22:07:08Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Порядок обработки данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Вступление ===&lt;br /&gt;
Цель данной статьи не только показать как выполнить конкретную задачу по вычислению расстояний между точками, заданными в геодезической (географической) системе координат в градусах, что является нормой для приемников сигнала GPS/Глонасс, через перевод координат в спроецированные координаты в метрах, но продемонстрировать  &lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 (а должны и ранее). Исключения могут быть связаны только с форматом файла Excel, в котором созданы исходные данные, и который умеете читать &amp;quot;на прямую&amp;quot; программа Мапифно.''&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высотой над уровнем моря, отрицательными координатами или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести расчет в Excel даже если бы мы использовали функции для пересчета сферических координат, видимо полученных от устройства GPS, в плановые метровые. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим из таблицы все строки, содержащие некорректные данные, нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений, мы получили пределы, в которые вписываются все координаты измерений. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояниями (переведенными на плоскость спроецированной поверхности) и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать обычную формулу Пифагора для 3-х мерного пространства.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. В этом же окне присвоим таблице систему координат - установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. [http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=4708&amp;amp;hilit=+%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C#p21658 Обсуждение проблемы смотрим вот здесь] &lt;br /&gt;
Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Далее для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, но выставленные параметры нам нужны только как образец, который мы исправим под свои нужды.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: приведенная программа является собственной разработкой (с)2011. В новые версии мапинфо входит улучшенный аналог, который позволяет задавать построение множества геобъектов из наборов точек, в то время как эта программа создает единственный объект на основании входного списка. Более функциональные программы используют для определения порядка создания вершин два индекса - первый задает объекты, второй, порядок вершин в объекте. Приведенные в статье программа не использует индексов, а создает вершины в том же порядке как они записаны в исходных файлах.&lt;br /&gt;
Кроме того возможно создание геообъектов через программы библиотеки GDAL/ORG, как это описано в статье ''[http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления в MapInfo производятся только по двумерным координатам при геообъекте, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6307</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6307"/>
		<updated>2012-07-26T21:59:13Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Порядок обработки данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Вступление ===&lt;br /&gt;
Цель данной статьи не только показать как выполнить конкретную задачу по вычислению расстояний между точками, заданными в геодезической (географической) системе координат в градусах, что является нормой для приемников сигнала GPS/Глонасс, через перевод координат в спроецированные координаты в метрах, но продемонстрировать  &lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 (а должны и ранее). Исключения могут быть связаны только с форматом файла Excel, в котором созданы исходные данные, и который умеете читать &amp;quot;на прямую&amp;quot; программа Мапифно.''&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высотой над уровнем моря, отрицательными координатами или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести расчет в Excel даже если бы мы использовали функции для пересчета сферических координат, видимо полученных от устройства GPS, в плановые метровые. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим из таблицы все строки, содержащие некорректные данные, нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений, мы получили пределы, в которые вписываются все координаты измерений. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояниями (переведенными на плоскость спроецированной поверхности) и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать обычную формулу Пифагора для 3-х мерного пространства.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. В этом же окне присвоим таблице систему координат - установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. [http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=4708&amp;amp;hilit=+%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C#p21658 Обсуждение проблемы смотрим вот здесь] &lt;br /&gt;
Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Далее для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, но выставленные параметры нам нужны только как образец, который мы исправим под свои нужды.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: приведенная программа является собственной разработкой (с)2011. В новые версии мапинфо входит улучшенный аналог, который позволяет задавать построение множества геобъектов из наборов точек, в то время как эта программа создает единственный объект на основании входного списка. Более функциональные программы используют для определения порядка создания вершин два индекса - первый задает объекты, второй, порядок вершин в объекте. Приведенные в статье программа не использует индексов, а создает вершины в порядке том же порядке как они записаны в исходных файлах.&lt;br /&gt;
Кроме того возможно создание геообъектов через программы библиотеки GDAL/ORG, как это описано в статье ''[http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления в MapInfo производятся только по двумерным координатам при геообъекте, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6306</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6306"/>
		<updated>2012-07-26T21:28:56Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Порядок обработки данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 . Исключения могут быть связаны только с форматом файла Excel, в котором созданы исходные данные, и который умеете читать &amp;quot;на прямую&amp;quot; программа Мапифно.''&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высотой над уровнем моря, отрицательными координатами или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести расчет в Excel даже если бы мы использовали функции для пересчета сферических координат, видимо полученных от устройства GPS, в плановые метровые. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим из таблицы все строки, содержащие некорректные данные, нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений, мы получили пределы, в которые вписываются все координаты измерений. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояниями (переведенными на плоскость спроецированной поверхности) и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать обычную формулу Пифагора для 3-х мерного пространства.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. В этом же окне присвоим таблице систему координат - установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. [http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=4708&amp;amp;hilit=+%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C#p21658 Обсуждение проблемы смотрим вот здесь] &lt;br /&gt;
Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, но выставленные параметры нам нужны только как образец, который мы исправим под свои нужды.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''Примечание: приведенная программа является собственной разработкой (с)2011. В новые версии мапинфо входит улучшенный аналог, который позволяет задавать построение множества геобъектов из наборов точек, в то время как эта программа создает единственный объект на основании входного списка. Более функциональные программы используют для определения порядка создания вершин два индекса - первый задает объекты, второй, порядок вершин в объекте. Приведенные в статье программа не использует индексов, а создает вершины в порядке том же порядке как они записаны в исходных файлах.&lt;br /&gt;
Кроме того возможно создание геообъектов через программы библиотеки GDAL/ORG, как это описано в статье ''[http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления в MapInfo производятся только по двумерным координатам при геообъекте, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6305</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6305"/>
		<updated>2012-07-26T21:02:01Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Порядок обработки данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 . ИСключения могут быть связаны только с форматом файла Excel, у котором созданы исходные данные.&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные, т.е. точки с отрицательной высторой над уровнем моря, отрицательными координатми или отрицательной скоростью:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести предварительный расчет в Excel. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
На основании выполненных вычислений мы получили пределы, в которые вписываются все координаты. Используя явное указание границ (см. ниже) при задании системы координат (проекции) таблицы Мапинфо, мы существенно повышаем точность измерения. Вычислив среднее значение &amp;quot;Координата_2&amp;quot;, мы получили возможность выбрать центральный меридиан проекции &amp;quot;Поперечная Меркатора&amp;quot; (или проекция &amp;quot;Гаусса-Крюгера&amp;quot;). Это сделано для того, что бы уменьшить различие между спроецированными расстояними и расстояниями, вычисленными с учетом кривизны Земли, т.к. в дальнейшем при переходе от координат в градусах к координатам в метрах, для вычисления расстояний между точками мы будем использовать формулу Пифагора.&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно &amp;quot;Управление параметрами и полями таблицы&amp;quot; в Mapinfo - присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы координат, полученные в п.12, с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, нам она нужна только как образец.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
Примечание: приведенная программа является собственной разработкой. В новые версии мапинфо входит улучшенный аналог, который позволяет управлять создаваемыми геобъектами, в то время как эта программа создает единственный объект на основании входного списка. Кроме того возможно создание гео-объектов через программы библиотеки GDAL/ORG, как это описанор в статье [http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6304</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=6304"/>
		<updated>2012-07-26T20:34:21Z</updated>

		<summary type="html">&lt;p&gt;Boris: /* Порядок обработки данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Описывается решение задачи перевода координат заданных в градусах в координаты в метрах. Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точек в формате долгота/широта/высота. К каждой точке также приписан набор атрибутов. В рассматриваемом случае атрибуты — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в Excel дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С последующей обработкой результатов в Excel.&lt;br /&gt;
&lt;br /&gt;
Причина выбора этого ПО:&lt;br /&gt;
* Предпочтение автора статьи;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
&lt;br /&gt;
==== Основные приемы использованные в работе ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. Например, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
&lt;br /&gt;
=== Порядок обработки данных ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее к виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем, например D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
Примечание: для обработки данных использована ГИС MapInfo версии 9.5, однако описанные алгоритмы работают в версиях от 7.8 . ИСключения могут быть связаны только с форматом файла Excel, у котором созданы исходные данные.&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой MapInfo типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Выполним фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
Такие данные не позволили бы нам произвести предварительный расчет в Excel. Для этого создадим и выполним SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
8. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
9. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
10. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
11. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
12. В результат получим:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
13. Откроем окно MapBasic в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
14. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
15. В окне MapBasic должны появиться две команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
&lt;br /&gt;
16. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
17. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
18. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
19. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущают уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
&lt;br /&gt;
20. Пришло время пересчитать координаты точек. Но для этого надо установить прямоугольную систему координат. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
21. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
22. В окне карты получится ужас, нам она нужна только как образец.&lt;br /&gt;
&lt;br /&gt;
23. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
&lt;br /&gt;
24. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся программой перевода последовательности точек в полилинию (или полигон):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
Примечание: приведенная программа является собственной разработкой. В новые версии мапинфо входит улучшенный аналог, который позволяет управлять создаваемыми геобъектами, в то время как эта программа создает единственный объект на основании входного списка. Кроме того возможно создание гео-объектов через программы библиотеки GDAL/ORG, как это описанор в статье [http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5222</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5222"/>
		<updated>2012-05-09T18:29:10Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo, и задача много раз в ней решалась;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* MapInfo, за счет встроенного интерпретатора языка MapBasic, хорошо автоматизируется «на коленке», когда это необходимо для мелких задач;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудноразрешимой проблемой для всего, что построено на плоских таблицах с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части необходимой для второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5221</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5221"/>
		<updated>2012-05-09T18:23:50Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция созданная к обсуждению на форуме ветки «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). Приемы статьи могут быть использованы для пересчета координат между различными проекциями, если те могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5220</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5220"/>
		<updated>2012-05-09T18:14:57Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция к обсуждению «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.''}}&lt;br /&gt;
&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5219</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5219"/>
		<updated>2012-05-09T18:14:34Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}}&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 Инструкция к обсуждению «MapInfo - перевод долготы/широты в метры»]&lt;br /&gt;
&lt;br /&gt;
{{Аннотация|Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.}}&lt;br /&gt;
&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5216</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5216"/>
		<updated>2012-05-09T18:07:57Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5215</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5215"/>
		<updated>2012-05-09T18:06:19Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, то что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt; =====&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5214</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5214"/>
		<updated>2012-05-09T18:02:30Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию.&lt;br /&gt;
&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец :)&lt;br /&gt;
&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  '''''107.63''''';&lt;br /&gt;
&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть.&lt;br /&gt;
&lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту '''''h''''' она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5213</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5213"/>
		<updated>2012-05-09T17:54:15Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|806px|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 15.gif|рис.11]]&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:''Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104''&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
&lt;br /&gt;
:''Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)''&lt;br /&gt;
&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 18-1.gif|рис.12]]&lt;br /&gt;
[[Файл:Bsf a001 18-2.gif|рис.13]]&lt;br /&gt;
[[Файл:Bsf a001 18-3.gif|рис.14]]&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 20.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
:''Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.''&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 21.gif|рис.16]]&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 22.gif|рис.17]]&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец:&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0''&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
:''Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые ''«8, 104, &amp;quot;m&amp;quot;,»'' (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
&lt;br /&gt;
:a. Затем задали – центральный меридиан  107.63;&lt;br /&gt;
:b. ''0'' (экватор) заменили на минимальную южную границу = ''51'' (градус северной широты);&lt;br /&gt;
:c. ''0.9996'' – стандартный масштабный коэффициент для проекции UTM заменили на ''1'', т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
:d. Уменьшили ложное восточное смещение – заменили ''500000'' на ''250000'' (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
:e. ''0'' – ложное смещение на север, оставили ''0'', т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
:f. Задали границы карты - ''Bounds (0,0) (500000, 500000)''. Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 27.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
:''Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)''&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
:''Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)''&lt;br /&gt;
31. ''COL8'' и ''COL9'' – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 32.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 34.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 35.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть &lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 37.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
:''Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)''&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 39.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
''До момента создания пространственной привязки таблица не появляется в списке слоев.''&lt;br /&gt;
&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 40.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 41.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 42.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. &lt;br /&gt;
''На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.''&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.&lt;br /&gt;
''Пункты с 37-го по 42-ой можно опустить.'' Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 44-1.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-2.gif|рис.15]]&lt;br /&gt;
[[Файл:Bsf a001 44-3.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 45.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
a. ячейка J2 ‑ '''«0»'''&lt;br /&gt;
b. ячейка K2 – '''«0»'''&lt;br /&gt;
c. В ячейке J3 напишем формулу - '''''«=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))»''''' (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
d. в ячейке K3 напишем  '''«=K2+J3»''' - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек '''''J3:K3''''' на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
47. Мы получили искомый результат :) Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
49. Теперь, ''по уму'', надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 50.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-1.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 51-2.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту h она считать не умеет и для узлов не хранит. Результат вычислений в Exec = '''''226 781 m.'''''&lt;br /&gt;
&lt;br /&gt;
53.  Если я ничего не перепутал то, что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 53.gif|рис.15]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;''Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;br /&gt;
''&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_41.gif&amp;diff=5211</id>
		<title>Файл:Bsf a001 41.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_41.gif&amp;diff=5211"/>
		<updated>2012-05-09T17:45:37Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5209</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5209"/>
		<updated>2012-05-09T17:30:19Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 03.gif|563px|рис.1]]&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 04.gif|рис.2]]&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 05.gif|рис.3]]&lt;br /&gt;
&lt;br /&gt;
6. Откроем таблицу для просмотра в виде списка, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 06.gif|рис.4]]&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 07.gif|рис.5]]&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести пред расчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 08.gif|рис.6]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 09.gif|рис.7]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 11.gif|рис.8]]&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 12.gif|рис.9]]&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bsf a001 13.gif|рис.10]]&lt;br /&gt;
&lt;br /&gt;
''Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.''&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
&lt;br /&gt;
:Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
:Create Map For D20120503 CoordSys Earth Projection 1, 104&lt;br /&gt;
:&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец:&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые «8, 104, &amp;quot;m&amp;quot;,» (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
a. Затем задали – центральный меридиан  107.63;&lt;br /&gt;
b. 0 (экватор) заменили на минимальную южную границу = 51 (градус северной широты);&lt;br /&gt;
c. 0.9996 – стандартный масштабный коэффициент для проекции UTM заменили на 1, т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
d. Уменьшили ложное восточное смещение – заменили 500000 на 250000 (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
e. 0 – ложное смещение на север, оставили 0, т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
f. Задали границы карты - Bounds (0,0) (500000, 500000). Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)&lt;br /&gt;
31. COL8 и COL9 – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть &lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
До момента создания пространственной привязки таблица не появляется в списке слоев.&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.Пункты с 37-го по 42-ой можно опустить. Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
a. ячейка J2 ‑ «0»&lt;br /&gt;
b. ячейка K2 – «0»&lt;br /&gt;
c. В ячейке J3 напишем формулу - «=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))» (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
d. в ячейке K3 напишем  «=K2+J3» - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек J3:K3 на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
47. Мы получили искомый результат  Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
49. Теперь, по уму, надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту h она считать не умеет и для узлов не хранит. Результат вычислений в Exec = 226 781 m.&lt;br /&gt;
53.  Если я ничего не перепутал то, что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5207</id>
		<title>Перевод долготы-широты в метры и подходы по работе в MapInfo</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4_%D0%B4%D0%BE%D0%BB%D0%B3%D0%BE%D1%82%D1%8B-%D1%88%D0%B8%D1%80%D0%BE%D1%82%D1%8B_%D0%B2_%D0%BC%D0%B5%D1%82%D1%80%D1%8B_%D0%B8_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5_%D0%B2_MapInfo&amp;diff=5207"/>
		<updated>2012-05-09T17:14:36Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MapInfo - перевод долготы/широты в метры ==&lt;br /&gt;
[http://gis-lab.info/forum/viewtopic.php?f=17&amp;amp;t=2036 MapInfo - перевод долготы/широты в метры]&lt;br /&gt;
''Эта статья посвящена задаче перевода координат заданных градусах в координаты в метра ( футах, дюймах и т. п.). С равным успехом основные приемы данной статьи могут быть использованы для перевода между различными системами координат, которые могут быть заданы стандартными средствами ГИС MapInfo.&lt;br /&gt;
''&lt;br /&gt;
=== Введение: ===&lt;br /&gt;
==== Постановка задачи: ====&lt;br /&gt;
Имеется набор данных, состоящих из координат точки в формате долгота/широта/высота. К каждой точке приписан набор непространственных атрибутов. В рассматриваемом в случае — время создания точки и некоторые специфические параметры, связанные с работой технического средства. Данные даны в виде плоской таблицы или в виде приводимом к плоской таблице. В нашем случае в формате Excel. Требуется произвести вычисления расстояния между соседними точками и сохранить результат так, что бы его можно было использовать в Excel.&lt;br /&gt;
==== Общее описание алгоритмов: ====&lt;br /&gt;
Для решения задачи можно использовать:&lt;br /&gt;
* Любую ГИС, позволяющую вычислять координаты точек в различных системах координат (или проекциях);&lt;br /&gt;
* Программные средства командной строки, позволяющие производить вычисления над плоскими файлами. На пример, утилиту командной строки ogr2ogr или иную, использующую библиотеку PROJ4, или ее аналог;&lt;br /&gt;
* Вставить в EXCEL дополнительные модули или формулы, которые позволят произвести вычисление координат, заданных в градусах, в координаты на плоскости в некоторой проекции. В принципе в тот же Excel можно вставить вызов библиотек PROJ4.&lt;br /&gt;
&lt;br /&gt;
==== Почему MapInfo + Excel? : ====&lt;br /&gt;
В этой статье будет рассмотрен набор манипуляций с данными с использованием ГИС MapInfo. С пост обработкой результатов в Excel.&lt;br /&gt;
Причина такого выбора банальна:&lt;br /&gt;
* вопрос был задан в разделе про MapInfo;&lt;br /&gt;
* MapInfo хорошо умеет читать данные в формате Excel;&lt;br /&gt;
* Excel идеально подходит для между строчных вычислений, что является трудно проблемой для всего, что построено на принципах СУБД, как-то плоские таблицы с независимыми строками;&lt;br /&gt;
* Кроме того описание «вступительной» части второго и третьего варианта, есть задача, которая требует других знаний, чем у автора, и другого терпения. А рекомендовать проделать все это тем, кто не нашел сил, что бы выполнить «вступительную» часть для других задач, я не готов. Равно как не знаю есть ли смысл рассказывать такую банальность тем, кто это проделал. Есть подозрение, что они эту задачу решат и без меня. И мне бы еще у них поучиться жонглировать различными ГИС форматами в ogr2org. Хотя бы тем же CSV, который подходит для этих задач лучше много другого. Тем более, что и в этом случае остается задача рекурсивного доступа от точки к ее предшественнику, а это без простейшего программирования трудно реализовать.&lt;br /&gt;
==== Основные приемы использованные в работе: ====&lt;br /&gt;
#Главный прием — 95% процентов команд графического ядра ГИС MapInfo являются текстовыми командами на языке MapBasic. При стандартном выполнении через меню и «кнопки» эти команды формируются в GUI, выводятся в окно MapBasic в MapInfoи одновременно передаются на выполнение ядру  ГИС MapInfo, которое можно считать интерпретатором команд MapBasic'а.&lt;br /&gt;
#Если выбрать соответствующую команду в окне MapBasic в MapInfo, выделив несколько строк подряд, или просто поместив курсор в конец одной строки, и нажать «Ввод» на клавиатуре, то выбранные команды будут переданы интерпретатору команд MapBasic и они дадут к такой же результат, что и вызов команд через графический интерфейс.&lt;br /&gt;
#Поэтому используя команды от стандартных элементов меню  MapInfo, выводимые в  MapBasic, как шаблоны для собственных команд, или используя любые команды и операторы языка  MapBasic, за исключением операторов проверки условий (на пример, IF) или циклов (FOR или DO), можно получать большую гибкость при работе с данными в этой ГИС.&lt;br /&gt;
#За пределами этого рассмотрения остается возможность посылки аналогичных команд через OLE интерфейс  MapInfo. В этом случае они выполняются так же, как если бы их вводили в окно MapBasic.&lt;br /&gt;
#Так же работа основана на том, что MapInfo хорошо читает многие стандартные форматы табличных данных, и в некоторые из них позволяет сохранять свои таблицы.&lt;br /&gt;
#В свою очередь Excel легко позволяет выписать функцию на рабочем листе, а потом применить ее к соседним клеткам с сохранением условной или безусловной адресации между ячейками. На пример, для того что бы формула, заданная в 3-м столбце строки, выполняющая расчет на основе первых двух ячеек строки, была аналогично использована в следующей строке, достаточно просто растянуть ячейку в 1:3 или С1 следующую ячейку снизу — 2:3 или С2.&lt;br /&gt;
=== Порядок обработки данных: ===&lt;br /&gt;
1. Открываем таблицу Excel. Приводим ее виду набора однородных данных – заголовки должны быть у всех столбцов, имеющих данные, и располагаться в первой строке. Столбцы без данных должны быть удалены.&lt;br /&gt;
2. Сохраним файл с простым именем D20120503.xls. С вот таким заголовком:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Время !! Высота над УМ !! Датчик скорости !! Координата-1 !! Координата-2 !! Обороты двигателя !! Конечная &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:31:40 || 521 || 18 || 51.822845 || 107.679138 || 1482 || мелькомбинат &lt;br /&gt;
|-&lt;br /&gt;
| 2012-05-03 07:32:27 || 525 || 22 || 51.81982 || 107.682434 || 1208.4 ||  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
3. Загрузим данные в MapInfo (галочку – создать копию ставим обязательно):&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Bsf a001 03.gif|рис.1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Используем заголовки для наименования столбцов:&lt;br /&gt;
&lt;br /&gt;
5. Подтвердим выбранные самой манифно типы данных:&lt;br /&gt;
&lt;br /&gt;
6. Получим данные в виде таблицы, т.к. пока у нас есть только атрибутика, но нет геометрии:&lt;br /&gt;
&lt;br /&gt;
7. Теперь надо выполнить фильтрацию данных, т.к. в некоторых строках есть некорректные данные:&lt;br /&gt;
&lt;br /&gt;
8. Именно это не позволило нам произвести предрасчет в Excel. Для этого создадим SQL запрос:&lt;br /&gt;
&lt;br /&gt;
9. Получим вот такой результат:&lt;br /&gt;
&lt;br /&gt;
10. Удалим все сбойные строки нажав Del. После этого сохраним таблицу и упакуем ее.&lt;br /&gt;
11. Теперь вычислим несколько параметров наших данных. Опять же через SQL запрос:&lt;br /&gt;
&lt;br /&gt;
12. И сразу еще один запрос на данных предыдущего запроса:&lt;br /&gt;
&lt;br /&gt;
13. В результат получим что-то такое:&lt;br /&gt;
&lt;br /&gt;
Все эти данные нам понадобятся, что бы создать геоинформацию к нашей Excel таблице.&lt;br /&gt;
14. Для этого откроем окно MapBasic’а в Mapinfo и присвоим таблице систему координат и добавим два поля для плановых (плоских, метровых ) координат – X,Y:&lt;br /&gt;
&lt;br /&gt;
15. Установим проекцию «Долгота/Широта WGS84»:&lt;br /&gt;
&lt;br /&gt;
16. В окне MapBasic’а должны появиться две вот такие команды:&lt;br /&gt;
Alter Table &amp;quot;D20120503&amp;quot; ( add X Float,Y Float ) Interactive&lt;br /&gt;
Create Map For D20120503 CoordSys Earth Projection 1, 104&lt;br /&gt;
17. Для нас важна вторая строка, которая и создает систему координат (СК) таблицы. Нас она не устраивает, т.к. создает СК, которая охватывает весь мир, что плохо для точности наших данных. Изменим строку команды, что она приобрела вот такой вид – добавим ей границы измерений с некоторым запасом:&lt;br /&gt;
Create Map For D20120503 CoordSys Earth Projection 1, 104 Bounds (107.5, 51.7) (107.8, 52)&lt;br /&gt;
После этого вставим эту строку в окно MapBasic’а, встанем на ее конец (или выделим ее целиком) и нажмем «Ввод». Дальше для любой строки команд, необходимость выделения вставленной команды и ее ввода будет подразумеваться.&lt;br /&gt;
18. Теперь создадим точки на месте координат:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
19. Кнопку «Проекция» - не трогаем. Тогда проекция вычисления координат и проекция таблицы – совпадут по умолчанию&lt;br /&gt;
20. В результате получим вот такую карту:&lt;br /&gt;
&lt;br /&gt;
Смущаю меня уходы в сторону, но это уже вопрос корректности данных. Будем надеяться, что там точки идут в обоих направлениях.&lt;br /&gt;
21. Пришло время пересчитать координаты точек. Но для этого надо установить плоскую проекцию. Сделаем это на примере проекции UTM. Причем опять с использованием шаблона из стандартных проекций, которые потом подправим «под себя». Для этого сделаем самое простое – установим проекцию окна карты :&lt;br /&gt;
&lt;br /&gt;
22. Выберем самую первую – UTM-1N:&lt;br /&gt;
&lt;br /&gt;
23. В окне карты получится ужас что, нам она нужна как образец:&lt;br /&gt;
24. В окне MapBasic’а будет выведена следующая команда, соответствующая установке для текущего окна карт выбранной нами проекции:&lt;br /&gt;
Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, -177, 0, 0.9996, 500000, 0&lt;br /&gt;
25. Заменим эту проекцию на нужную нам, взяв новый центральный меридиан из среднего значения координат таблицы (п.13):&lt;br /&gt;
Set Map XY Units &amp;quot;m&amp;quot; CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)&lt;br /&gt;
26. Обращаю внимание, что мы в параметрах проекции заменили их практически все – оставив только первые «8, 104, &amp;quot;m&amp;quot;,» (что означает проекция «поперечная Меркатора», на датуме WGS84, единица измерения координат «метры»):&lt;br /&gt;
a. Затем задали – центральный меридиан  107.63;&lt;br /&gt;
b. 0 (экватор) заменили на минимальную южную границу = 51 (градус северной широты);&lt;br /&gt;
c. 0.9996 – стандартный масштабный коэффициент для проекции UTM заменили на 1, т.к. наши измерения предполагаются возле центрального меридиана (ЦМ) проекции, а стандартный масштабный коэффициент для UTM уменьшает расстояния возле ЦМ.;&lt;br /&gt;
d. Уменьшили ложное восточное смещение – заменили 500000 на 250000 (что то же для наших данных). Принципиального значения это не имеет. Могли и 0 поставить, округления во внутренних расчетах MapInfo для таких величин будут незначительны. Вот в случаях, когда используется проекция СК-42 или СК-95, то «добавочные» миллионы, задающие зону, могут оказать неприятное воздействие на MapInfo, да и на Excel - то же.;&lt;br /&gt;
e. 0 – ложное смещение на север, оставили 0, т.к. уже сдвинули начало системы координат задав смещение в п. 26.b;&lt;br /&gt;
f. Задали границы карты - Bounds (0,0) (500000, 500000). Это существенно для Mapinfo только при вычислении координат. Для окна карты не имеет никакого значения. Границы выставили из предположения, что все наши координаты впишутся в квадрат 500 на 500 км.&lt;br /&gt;
27. Проверим, что наши параметры вернули карте нормальный вид, такой как она имела изначально – дадим команду показать все слои карты в нашем окне:&lt;br /&gt;
&lt;br /&gt;
28. Откроем таблицу в виде списка, что бы видеть результаты вычислений.&lt;br /&gt;
29. Теперь установим систему координат, которую MapInfo , будет использовать для расчета координат. Для этого введем следующую строку в окно MapBasic’а, используя ранее полученную строку как шаблон:&lt;br /&gt;
Set CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0, 0) (500000, 500000)&lt;br /&gt;
30. Пришло время вычислить координаты. Для этого используем команду:&lt;br /&gt;
Update D20120503 set col8=centroidx(obj),col9=centroidy(obj)&lt;br /&gt;
31. COL8 и COL9 – это псевдонимы для 8 и 9 колонки, соответственно. Вместо них обычно используют настоящие названия колонок, но так проще и короче.&lt;br /&gt;
32. Наша открытая списком таблица обновится и приобретет вот такой вид:&lt;br /&gt;
&lt;br /&gt;
33. Обязательно сохраним ее.&lt;br /&gt;
34. Теперь нам надо вернуть данные в Excel. Проще всего это сделать, сохранив данные в тестовый формат, т.к. экспорта в Excel в MapInfo – нет. По крайней мере, в моей версии.&lt;br /&gt;
&lt;br /&gt;
35. Выберем вот такие параметры экспорта:&lt;br /&gt;
&lt;br /&gt;
36. Сознательно добавим букву «а» к имени, предложенному Mapinfo, т.к. ниже мы загрузим экспорт обратно, а если имя текстового файла совпадет с именем таблицы, MapInfo не даст нам ее открыть &lt;br /&gt;
37. Откроем экспортированную таблицу:&lt;br /&gt;
&lt;br /&gt;
38. Присвоим открытой таблице координатную систему для гео-объектов, используя полученные ранее команды как шаблон:&lt;br /&gt;
Create Map For D20120503a CoordSys Earth Projection 8, 104, &amp;quot;m&amp;quot;, 107.63, 51, 1, 250000, 0 Bounds (0,0) (500000, 500000)&lt;br /&gt;
39. То, что это удалось можно увидеть, добавив новую таблицу в окно карты:&lt;br /&gt;
&lt;br /&gt;
До момента создания пространственной привязки таблица не появляется в списке слоев.&lt;br /&gt;
40. Создадим точки и в этой таблице, только изменим их форму и цвет:&lt;br /&gt;
&lt;br /&gt;
41. И естественно выберем новые расчетные столбцы в качестве координат создаваемых точек.&lt;br /&gt;
После нажатия на «OK» - окно карты измениться. В нем появятся новые геокодированные точки:&lt;br /&gt;
&lt;br /&gt;
42. Максимально приблизим одну из точек, что бы стало заметно различие между старыми (фиолетовыми) и новыми (зелеными) точками:&lt;br /&gt;
&lt;br /&gt;
Видим, что оно составило 4 мм. Это плата за пересчет и округление. На мой взгляд, в большей степени за округление, с которым Mapinfo вывел данные в текстовый файл – всего 2 символа после запятой (точки). Эту точность можно принудительно увеличивать с помощью функции Format$, но это в этом случае не играет большой роли.&lt;br /&gt;
43. Все. С MapInfo закончили. Надо возвращаться в Excel.Пункты с 37-го по 42-ой можно опустить. Они были необходимы только для проверки корректности выполненных нами манипуляций с координатными системами.&lt;br /&gt;
44. Открываем результат экспорта как текстовый файл в Excel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
45. Получим вот такую таблицу в Excel и добавим в нее две колонки «расстояние» (между соседними точками) и «путь» (сумму расстояний):&lt;br /&gt;
&lt;br /&gt;
46. Заполним ячейки в новых колонках формулой:&lt;br /&gt;
a. ячейка J2 ‑ «0»&lt;br /&gt;
b. ячейка K2 – «0»&lt;br /&gt;
c. В ячейке J3 напишем формулу - «=КОРЕНЬ((H2-H3)*(H2-H3)+(I2-I3)*(I2-I3)+(B2-B3)*(B2-B3))» (Теорема Пифагора для 3-х мерного пространства)&lt;br /&gt;
d. в ячейке K3 напишем  «=K2+J3» - это суммарный путь, пройденный до этой точки.&lt;br /&gt;
e. Теперь «растянем» формулу из ячеек J3:K3 на все оставшееся заполненное пространство листа Excel.&lt;br /&gt;
Существуют и более правильные способы задания формулы на столбцы, но они слегка длиннее и мудренее, чем просто «взять за угол и растянуть».&lt;br /&gt;
47. Мы получили искомый результат  Все строки содержат расстояние от точки до предшествующей ей, а так же пройденный путь.&lt;br /&gt;
48. Сохраним этот результат. Excel сообщит нам, что наш формат не поддерживает все возможности Excel, поэтому для последующее обработки надо сохранить данные в его формат.&lt;br /&gt;
49. Теперь, по уму, надо бы построить линию по этим точкам, что бы убедиться, что расстояние мы измерили без погрешности.&lt;br /&gt;
50. Для этого воспользуемся специальной программой:&lt;br /&gt;
&lt;br /&gt;
51. Вот что получим, измерив длину новой линии:&lt;br /&gt;
&lt;br /&gt;
Или с учетом кривизны Земли:&lt;br /&gt;
&lt;br /&gt;
52. Тут надо помнить, что вычисления MapInfo провело только по двумерным координатам, высоту h она считать не умеет и для узлов не хранит. Результат вычислений в Exec = 226 781 m.&lt;br /&gt;
53.  Если я ничего не перепутал то, что казалось набором последовательных точек, оказалось набором вершин от разных проходов по одному пути, пройденных в разное время:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ключевые слова: MapInfo, MapBasic команды, Select SQL, долгота/широта, преобразование коррдинат, пользовательские проекции&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_53.gif&amp;diff=5206</id>
		<title>Файл:Bsf a001 53.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_53.gif&amp;diff=5206"/>
		<updated>2012-05-09T17:10:52Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_51-2.gif&amp;diff=5205</id>
		<title>Файл:Bsf a001 51-2.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_51-2.gif&amp;diff=5205"/>
		<updated>2012-05-09T17:10:45Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_51-1.gif&amp;diff=5204</id>
		<title>Файл:Bsf a001 51-1.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_51-1.gif&amp;diff=5204"/>
		<updated>2012-05-09T17:10:35Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_50.gif&amp;diff=5203</id>
		<title>Файл:Bsf a001 50.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_50.gif&amp;diff=5203"/>
		<updated>2012-05-09T17:10:26Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_45.gif&amp;diff=5202</id>
		<title>Файл:Bsf a001 45.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_45.gif&amp;diff=5202"/>
		<updated>2012-05-09T17:10:17Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-3.gif&amp;diff=5201</id>
		<title>Файл:Bsf a001 44-3.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-3.gif&amp;diff=5201"/>
		<updated>2012-05-09T17:10:10Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-2.gif&amp;diff=5200</id>
		<title>Файл:Bsf a001 44-2.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-2.gif&amp;diff=5200"/>
		<updated>2012-05-09T17:10:02Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-1.gif&amp;diff=5199</id>
		<title>Файл:Bsf a001 44-1.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_44-1.gif&amp;diff=5199"/>
		<updated>2012-05-09T17:09:56Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_42.gif&amp;diff=5198</id>
		<title>Файл:Bsf a001 42.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_42.gif&amp;diff=5198"/>
		<updated>2012-05-09T17:09:43Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_40.gif&amp;diff=5197</id>
		<title>Файл:Bsf a001 40.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_40.gif&amp;diff=5197"/>
		<updated>2012-05-09T17:09:34Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_39.gif&amp;diff=5196</id>
		<title>Файл:Bsf a001 39.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bsf_a001_39.gif&amp;diff=5196"/>
		<updated>2012-05-09T17:09:26Z</updated>

		<summary type="html">&lt;p&gt;Boris: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Boris</name></author>
	</entry>
</feed>