Создание полилинии из данных (Map Cad)

MapInfo, MapBasic
Ответить
Аватара пользователя
Bodia_K
Новоприбывший
Сообщения: 10
Зарегистрирован: 05 дек 2012, 14:01
Репутация: 0
Откуда: Україна

Создание полилинии из данных (Map Cad)

Сообщение Bodia_K » 16 июл 2015, 13:22

Здравствуйте
Опишите (подробно), пожалуйста, создание полилинии из данных с помощью Map Cad
к примеру есть координаты 5 точек (x1 y1; x2 y2; ... x5 y5)
Большое спасибо.

Аватара пользователя
Bodia_K
Новоприбывший
Сообщения: 10
Зарегистрирован: 05 дек 2012, 14:01
Репутация: 0
Откуда: Україна

Re: Создание полилинии из данных (Map Cad)

Сообщение Bodia_K » 17 июл 2015, 10:48

Разобрался. Как и с помощью Mi Cad, так и с помощью Map Cad.
Если понадобиться кому-то - спрашивайте.

evgenius
Интересующийся
Сообщения: 17
Зарегистрирован: 17 июл 2015, 15:44
Репутация: 0

Re: Создание полилинии из данных (Map Cad)

Сообщение evgenius » 17 июл 2015, 15:50

Добрый день.
Я уже второй час долблю MapCad но не выходит каменный цветок. Подскажите, плиз: как нарисовать линии из таблицы. Не полилинии, а несколько независимых линий, соединяющих концы точек (каждая пара точек представлена строчкой в файле эксел).
Сделал табличку в эксел: Объект1, Объект2, х1, у1, х2, у2.
Запускю MapCad, а он не видит в списке мою таблицу. В справке написано, что она должна быть картируемой. А как это? Что только ни делал - и пытался создавать точечные объекты, и геокодировал не приходя в сознание, и пытался индексировать поля с координатами и превращал тип данных с координатами из вещественных в десятичные... Без толку.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Создание полилинии из данных (Map Cad)

Сообщение Boris » 19 июл 2015, 00:52

Тут в одном вопросе куча ХЗ чего и не разобраться, что хотелось то.
Mi/Map CAD и прочие утилиты создают линии (полилинии) из линейного файла вот такой структуры:

Код: Выделить всё

номер_линии(объекта), номер точки (нарастающие номера), координата Х, координата У.
После прохода по такому списку будут созданы полилинии с единственным атрибутом номер_линии(объекта).
Ваша задача с объектами и координатами в строке этими утилитами не решается. Она очень неплохо решается через OGR через формат CSV (на сайте есть статья - ORG2OGR SHp <-> CSV) или минимальным программированием через MIF/MID.

evgenius
Интересующийся
Сообщения: 17
Зарегистрирован: 17 июл 2015, 15:44
Репутация: 0

Re: Создание полилинии из данных (Map Cad)

Сообщение evgenius » 20 июл 2015, 12:19

Boris писал(а):Тут в одном вопросе куча ХЗ чего и не разобраться, что хотелось то.
Mi/Map CAD и прочие утилиты создают линии (полилинии) из линейного файла вот такой структуры:

Код: Выделить всё

номер_линии(объекта), номер точки (нарастающие номера), координата Х, координата У.
После прохода по такому списку будут созданы полилинии с единственным атрибутом номер_линии(объекта).
Ваша задача с объектами и координатами в строке этими утилитами не решается. Она очень неплохо решается через OGR через формат CSV (на сайте есть статья - ORG2OGR SHp <-> CSV) или минимальным программированием через MIF/MID.
Ок, по порядку.
Дано: карта с точками (Объект-точка, долгота, широта).
Задача: уметь отображать на карте линии, соединяющие любые 2 точки, а в общем случае любые наборы из 2 точек.
Получить таблицу с наборами из 2 точек например смогу с помощью SQL запроса.
Например:
Линия1 соединяет точку Начало1 и точку Конец1.
Линия2 соединяет точку Начало2 и точку Конец2 (если SQL запрос вернул не одну, а две строки).
...
ЛинияN соединяет точку НачалоN и точку КонецN (если SQL запрос вернул N строк).

Поиск (OGR, ORG2OGR) по сайту не дал результатов. можете плиз ткнуть прямо носом?
А во что выливается минимальное программирование через MIF/MID? Обойдусь ли имеющимся набором: голый MapInfo + я надеюсь светлая головушка :).
MapBasic установить нет возможности.
Вложения
Снимок.JPG
Вот пример, когда:
- в результатах несколько линий;
- в результатах начальная точка одна и та же (синий круг), а конечные точки разные (никак не показаны на карте).
Снимок.JPG (37.14 КБ) 8044 просмотра
Последний раз редактировалось evgenius 20 июл 2015, 12:32, всего редактировалось 1 раз.

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Создание полилинии из данных (Map Cad)

Сообщение gamm » 20 июл 2015, 12:30

evgenius писал(а):А во что выливается минимальное программирование через MIF/MID? Обойдусь ли имеющимся набором: голый MapInfo + я надеюсь светлая головушка :).
MapBasic установить нет возможности.
ни Мапинфо, ни Мапвасик вообще не нужны, MIF/MID текстовый формат. Берется любой скриптовый язык, и вперед, вот пример сборки полигонов, сделанный на R по просьбе одного из участников форума, полигон опознается пол повторению координат. Для линий все аналогично, заголовок создайте в Мапинфо, или экспортируйте какой-нибудь линейный файл в нужной проекции. Написано все "в лоб" для понятности

Код: Выделить всё

p<-read.table("E:/GIS-lab/MakePolygon/data.txt",header=FALSE)
names(p)<-c("X","Y")

fn.mif<-"E:/GIS-lab/MakePolygon/pf.mif"
fn.mid<-"E:/GIS-lab/MakePolygon/pf.mid"

write("Version 300",file=fn.mif)
write("Charset \"Neutral\"",append=TRUE,file=fn.mif)
write("Delimiter \",\"",append=TRUE,file=fn.mif)
write("  CoordSys Earth Projection 8, 104, \"m\", 39, 0, 0.9996, 500000, 0",append=TRUE,file=fn.mif)
write("Columns 1",append=TRUE,file=fn.mif)
write("  ID      Integer",append=TRUE,file=fn.mif)
write("Data",append=TRUE,file=fn.mif)

cur.ID <-1
cur.pos<-1
found  <-FALSE
first  <-TRUE
done   <-FALSE
while(!done) {
  for(i in (cur.pos+1):nrow(p)) {
    if(sum((p[i,]-p[cur.pos,])^2) < 0.01^2) {
      found=TRUE
      break
    }
  }
  if(!found) stop("Failed to found endpoint")

  sbuf="Region 1"; write(sbuf,append=TRUE,file=fn.mif)
  sbuf=sprintf("%5d",i-cur.pos+1); write(sbuf,append=TRUE,file=fn.mif)
  for(ii in cur.pos:i) {
    sbuf=sprintf("%.5f %.5f",p$X[ii],p$Y[ii]); write(sbuf,append=TRUE,file=fn.mif)
  }
  sbuf=sprintf("%d",cur.ID); write(sbuf,append=!first,file=fn.mid)
  first<-FALSE
  cur.ID<-cur.ID+1;
  cur.pos<-i+1;
  if(cur.pos >= nrow(p)) break
}

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Создание полилинии из данных (Map Cad)

Сообщение Boris » 21 июл 2015, 00:18

Солнце, воздух, ...м укреляют организм. Я не понял причем тут SQL и "вернул сколько то точек". Вам надо еще анализ какой то выполнять к этому всему на количество точек из одной вершины?
Но это все побоку, читаем хелп Mapinfo:

Код: Выделить всё

CreateLine( ) function 
Purpose 
Returns an Object value representing a line. You can call this function from the MapBasic window in MapInfo Professional. 

Код: Выделить всё

Syntax 
CreateLine( x1, y1, x2, y2 )  
x1 is a float value, indicating the x-position (for example,) of the line's starting point. 
y1 is a float value, indicating the y-position (for example, Latitude) of the line's starting point. 
x2 is a float value, indicating the x-position of the line's ending point. 
y2 is a float value, indicating the y-position of the line's ending point. 

Return Value 
Object 

Код: Выделить всё

Open Table "Routes" 
Insert Into routes (obj) 
	Values (CreateLine(-72.55, 42.431, -72.568, 42.435)) 
И что это значит? Это значит, что это функция, которую можно использовать в SQL запросах на присвоение (обновление) внути Mapinfo в окне MapBasic. Набор линий для каждой строки, где есть пара координат (начало;конец) будет создан автоматически. Единственное отличие от команды меню "обновить колонку" состоит в том, что в команде меню нельзя выполнить присвоение полю Obj, которое хранит геометрическую информацию.
В общем случае, набор команд для таблицы, где есть x1,y1,x2,y2, как координаты начала и конца линии, выглядит так:

Код: Выделить всё

Open Table "Routes" As Routes
Set Coordsys Table Routes
Insert Into Routes (obj) 
	Values (CreateLine(x1, y1, x2, y2))
PS
Для больших расстояний, а редко кто использует долготу/широту на 100 метрах, искажения в длине линий, построенных по 2 точкам, могут оказаться очень существенными.
PSS
OGR статья: "Конвертация данных из CSV в SHP и обратно с OGR" раздел "Геометрии в формате WKT"

evgenius
Интересующийся
Сообщения: 17
Зарегистрирован: 17 июл 2015, 15:44
Репутация: 0

Re: Создание полилинии из данных (Map Cad)

Сообщение evgenius » 22 июл 2015, 18:01

Всем доброго и спасибо всем откликнувшимся.
Дырку с отображением наборов линий заткнул с помощью mid/mif.
Способ приглянулся своей относительной простотой (хотя пока формирую файлы с помощью excel без скриптинга) и возможностью наделять линии дополнительной инфо, типа Имя, Цвет отображения линии и ее толщина.

При использовании запросов с ходу не разобрался как вставлять дополнительную инфо, т.к. запрос в общем возвращает неколько типов линий, которые на карте нужно помечать.

Конвертацию данных из CSV в SHP и обратно с OGR конечно посмотрел, но не осилил. Это в QGIS делается? У меня пока только Мапинфа без мапвасика.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Создание полилинии из данных (Map Cad)

Сообщение Boris » 23 июл 2015, 00:35

evgenius писал(а):У меня пока только Мапинфа без мапвасика.
Спасибо за спасибо. Но вот для тех, кто будет искать свои ответы:
1. Не бывает мапинфо без мапбасика. Вся мапинфо - это графическая оболочка над командами мапбасика. Какое то время тому назад, даже существовал продукт по имени Mapinfo Runtime, который выполнял все команды без графической оболочки. Так что окно Mapbasic'а в которое можно вставлять команды на этом языке, и что самое главное увидеть во что превращаются команды из Меню и кнопок, есть всегда. Вставленные в него команды приводят к тем же результатам, что движения руками. Единственно, что не поддерживается в этом окне - это все команды выбора и циклов.
2. Mapbasic уже давно бесплатен и входит в любой диск с Mapinfo, если же его нет в комплекте, то найти его не большая проблема.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей